/*
 * hello.h by Kamran Karimi
 * Header file for hello1.c and hello2.c
 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define MSG_KEY 40
#define MSG_MODE (IPC_DIPC | IPC_EXCL | 0777)
/* use of 'IPC_DIPC' is the ONLY thing that makes 
 * this program a distributed * one. Everything 
 * else is normal System V IPC programming */
#define MSG_TYPE 10
#define MSG_SIZE 512
struct message
{
	long mtype;
	char mtext[MSG_SIZE];
};
/*
 * hello1.c by Kamran Karimi
 * It initializes a message structure and waits to 
 * receive a message.
 * After running hello1, you should run hello2 on 
 * a remote machine.
 */
#include "hello.h"
int main()
{
	int msgid;
	struct message mess;
 
	/* create the message queue. The other 
	 * process will access it later */
	msgid = msgget(MSG_KEY, MSG_MODE |
		IPC_CREAT);
	if(msgid < 0) 
	{
		fprintf(stderr,
		"Hello1: msgget() failed BECAUSE %s\n", 
		strerror(errno));
		exit(20);
	}
	fprintf(stderr,
	"Hello1: waiting to receive a message.\n");
	if(msgrcv(msgid, (struct msgbuf *)&mess, 
	sizeof(mess.mtext), 0, 0) < 0)
		fprintf(stderr,
		"Hello1: msgrcv() failed BECAUSE %s\n", 
		strerror(errno));
	else 
		fprintf(stderr,
		"Hello1: Received '%s'\n",mess.mtext);  
	msgctl(msgid,IPC_RMID,NULL); 
	exit(0);
}
/*
 * hello2.c by Kamran Karimi
 * This program sends a message to hello1 process.
 * You should first run hello1, and then hello2 on
 * a machine in the same cluster
 */
#include "hello.h"
int main()
{
	int msgid;
	struct message mess;
	/* gain access to the message queue that was
	 * created by hello1 */
	msgid = msgget(MSG_KEY, MSG_MODE);
	if(msgid < 0) 
	{
		fprintf(stderr,
		"Hello2: msgget() failed BECAUSE %s\n",
		strerror(errno));
		exit(20);
	}
	mess.mtype = MSG_TYPE; /* not used here */
	strcpy(mess.mtext,
	"Hello, Distributed Programming!");
	/* now send the message. This will traverse 
	 * the network if hello1 and hello2 programs 
	 * are in different computers and DIPC is 
	 * properly installed */
	if(msgsnd(msgid, (struct msgbuf *)&mess, 
	sizeof(mess.mtext), 0) < 0)
	{
		fprintf(stderr,
		"Hello2: msgsnd() failed BECAUSE %s\n", 
		strerror(errno));
		exit(20);
	}
	exit(0);
}
