#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <errno.h>
#include "config.h"
#include "comm.h"
static msgqid;
static our_pid;
/* Kludgy dummy to fool the -g flag to cc ! */
struct object {
int dummy;
};
/*
* Use a lock file as the unique id for this message queue.
* If the lock file is not present, then we are the first to play,
* so we create the lock file ourselfs.
*/
prepare_ipc() {
key_t key;
int fd;
our_pid = getpid();
key = ftok(IPC_IDENT_FILE, 0);
if (key == (key_t)-1) {
fd = creat(IPC_IDENT_FILE, 0666);
if (fd == -1) {
perror(IPC_IDENT_FILE);
exit(1);
}
close(fd);
key = ftok(IPC_IDENT_FILE, 0);
if (key == (key_t)-1) {
perror(IPC_IDENT_FILE);
exit(1);
}
/* We have to create the message queue. */
msgqid = msgget(key, IPC_CREAT|0666);
if (msgqid == -1) {
perror("msgget");
abort();
}
return;
}
/* Find the already existing message queue. */
msgqid = msgget(key, 0);
if (msgqid == -1) {
perror("msgget");
abort();
}
}
send_message(str)
char *str;
{
struct rec_buffer rec_buffer;
int length, res;
length = strlen(str);
rec_buffer.mtype = 1;
rec_buffer.pid = our_pid;
if (length >= sizeof rec_buffer.text)
length = sizeof rec_buffer - 1;
strncpy(rec_buffer.text, str, sizeof rec_buffer.text);
rec_buffer.text[length] = '\0';
res = msgsnd(msgqid, &rec_buffer, length + sizeof rec_buffer.pid, 0);
if (res == -1) {
perror("msgsnd");
abort();
}
}
struct buffer {
int mtype;
char text[MAX_TEXT];
};
char *rcv_message() {
static struct buffer buffer;
int res;
res = msgrcv(msgqid, &buffer, sizeof buffer.text, our_pid, 0);
if (res == -1) {
if (errno == ENOMSG)
return 0;
perror("msgrcv");
abort();
}
buffer.text[res] = '\0';
return buffer.text;
}