/****************** LISTING 2 - server.c ******************/
 
#include "ipc.h"
 
extern  RCVBUF msgque[QSIZE];
extern  BOOL qfull, qempty, qovrflo;
extern  int qtail, qhead;
 
main()
{
int     status, i;
CLIENT  *p, *root = NULL;
char    mbxname[16];
MSGBUF  msgbuf;
USHORT  rcvmbx;
 
/*++++++ Startup ++++++*/
 
status = open_comm_link(&rcvmbx,sizeof(MSGBUF),"SERVERMBX");
status = SYS$DCLAST(&receive, rcvmbx, PSL$C_SUPER);
 
/*++++++ Main loop ++++++*/
 
FOREVER {
  status = SYS$WAITFR(RCVEF);
  status = SYS$CLREF(RCVEF);
  while (!qempty) { 
    dequeue(&msgbuf);
    switch(msgbuf.cmdtyp) {
 
      case ADDMBX:
          p = search_list(root, msgbuf.xmt_prcnum);
          if (p == NULL) {
              insert_list_item(&root, msgbuf.xmt_prcnum);
              sprintf(mbxname, "CLIENTMBX%d", 
                      msgbuf.xmt_prcnum);
              open_comm_link(&root->mbxid, 
                      sizeof(MSGBUF), mbxname);
          }
          break;
 
      case DELMBX:
          p = search_list(root, msgbuf.xmt_prcnum);
          if (p) {
              close_comm_link(p->mbxid);
              delete_list_item(&root, msgbuf.xmt_prcnum);
          }
          break;
 
      case PASSTHRU:
          p = search_list(root, msgbuf.rcv_prcnum);
          if (p)
              send(p->mbxid, &msgbuf, sizeof(MSGBUF));
          break;
 
      case BROADCAST:
          broadcast(&msgbuf, sizeof(MSGBUF), root);
          break;
 
      case SHUTDOWN:
          msgbuf.msgtyp = SHUTDOWN;
          broadcast(&msgbuf, sizeof(MSGBUF), root);
          while (root) { 
              close_comm_link(root->mbxid);
              root = root->link;
          }
          close_comm_link(rcvmbx);
          exit(SUCCEED);
          break;
         
       default:
          break;
    } 
  }
}  
} 
