rendered paste body#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <signal.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include "message.h" const char *p_name = "<empty>";static int nQueueID = -1;void print_usage_and_die() { exit(-1);}void free_resources(void){ if(nQueueID != -1) { if(msgctl(nQueueID, IPC_RMID, (struct msqid_ds *) 0) == -1) { nQueueID = -1; exit(-1); } nQueueID = -1; } }void print_error(const char *szMessage) { if (szMessage != (const char *) 0) { fprintf (stderr, szMessage); } free_resources(); exit(EXIT_FAILURE);}void allocate_resources(void) { if ((nQueueID = msgget(KEY, PERM | IPC_CREAT)) == -1) { print_error("Can't access message queue!\n"); }}void clear_message(message_t * message) { }void handler(int signal) { free_resources(); exit(0); }int main(int argc, char** argv) { int c; int id_counter = 0; int running = 0; message_t message; p_name = argv[0]; char client_names[101][20]; char client_nick[21]; while((c = getopt(argc, argv, "m:")) != EOF) { switch(c) { case 'm': nQueueID = (int)optarg; running = 1; break; default: nQueueID = KEY; running = 1; break; } } allocate_resources(); (void)signal(SIGTERM, handler); (void)signal(SIGINT, handler); (void)signal(SIGQUIT, handler); while(1) { if(msgrcv(nQueueID, &message, sizeof(message) - sizeof(long), 0,0) == -1) { printf("recieve 1 failed: %s", message.s_message); exit(-1); } /* if(message.nType == 2) { printf("REGISTER_TYPE"); strcpy(client_nick, message.s_nick); //strcpy(client_names[id_counter], client_nick); // client_names[id_counter] = client_nick; message.clientID = id_counter; strcpy(message.s_nick, client_nick); if(msgsnd(nQueueID, &message, sizeof(message) - sizeof(long), 0) == -1) { exit(-1); } message.nType = 1; id_counter++; } else {*/ char buff[276]; strcpy(buff, message.s_nick); strcat(buff, ": "); strncat(buff, message.s_message, 250); strcpy(message.s_message, buff); printf(buff); if(msgsnd(nQueueID, &message, sizeof(message) - sizeof(long), 0) == -1) { exit(-1); } //printf(buff); //} } return EXIT_SUCCESS; }