Elaborato_SO/src/custom_msgq.c

118 lines
2.2 KiB
C

#include <sys/msg.h>
#include <errno.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <custom_msgq.h>
#include <errExit.h>
#include <server.h>
#include <client.h>
#include <forza4.h>
int _MSGQID;
void msgRcv(void *msgp, size_t size, long mtype);
void msgSnd(void *msgp, size_t size);
void openMsgq();
void sndId();
void rcvId();
void setupServerMsgq() {
openMsgq();
sndId();
}
void setupClientMsgq() {
openMsgq();
rcvId();
}
void openMsgq() {
key_t msgKey = ftok(KEYFILE, MSGQKEY);
_MSGQID = msgget(msgKey, IPC_CREAT | S_IRUSR | S_IWUSR);
if (_MSGQID == -1){
errExitMsg("msgget");
}
}
void sndId() {
msg_t msg = {
.mtype = 1,
.server_in = _INPUT_S,
.player_id = 0,
.server_pid = getpid()
};
sndMsg(&msg);
msg.player_id = 1;
sndMsg(&msg);
}
void rcvId() {
printf(PCLIENT "Waiting for message...\n");
msg_t msg;
rcvMsg(&msg);
setRows(msg.server_in.rows);
setCollums(msg.server_in.collums);
setTokens(msg.server_in.player1Token, msg.server_in.player2Token);
ID = msg.player_id;
SERVER_PID = msg.server_pid;
}
void msgRcv(void *msgp, size_t size, long mtype) {
int res;
do {
res = msgrcv(_MSGQID, msgp, size, mtype, 0);
} while (errno == EINTR);
if (res == -1) {
errExit("msgrcv", "msgRcv");
}
}
void rcvMsg(msg_t *msg) {
msgRcv(msg, sizeof(msg_t) - sizeof(long), MSG);
}
void rcvMove(move_t *move) {
msgRcv(move, sizeof(move_t) - sizeof(long), MOVE);
}
void rcvPlayer(player_ds *player) {
msgRcv(player, sizeof(player_ds) - sizeof(long), PLAYER);
}
void rcvGame_end(game_end_t *game) {
msgRcv(game, sizeof(game_end_t) - sizeof(long), GAME_END);
}
void msgSnd(void *msgp, size_t size) {
int res;
do {
res = msgsnd(_MSGQID, msgp, size, 0);
} while (errno == EINTR);
if (res == -1) {
errExitMsg("msgsnd");
}
}
void sndMsg(msg_t *msg) {
msgSnd(msg, sizeof(msg_t) - sizeof(long));
}
void sndMove(move_t *move) {
msgSnd(move, sizeof(move_t) - sizeof(long));
}
void sndPlayer(player_ds *player) {
msgSnd(player, sizeof(player_ds) - sizeof(long));
}
void sndGame_end(game_end_t *game) {
msgSnd(game, sizeof(game_end_t) - sizeof(long));
}