home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_11 / 8n11073a < prev    next >
Text File  |  1990-07-31  |  2KB  |  77 lines

  1. /****************** LISTING 2 - server.c ******************/
  2.  
  3. #include "ipc.h"
  4.  
  5. extern  RCVBUF msgque[QSIZE];
  6. extern  BOOL qfull, qempty, qovrflo;
  7. extern  int qtail, qhead;
  8.  
  9. main()
  10. {
  11. int     status, i;
  12. CLIENT  *p, *root = NULL;
  13. char    mbxname[16];
  14. MSGBUF  msgbuf;
  15. USHORT  rcvmbx;
  16.  
  17. /*++++++ Startup ++++++*/
  18.  
  19. status = open_comm_link(&rcvmbx,sizeof(MSGBUF),"SERVERMBX");
  20. status = SYS$DCLAST(&receive, rcvmbx, PSL$C_SUPER);
  21.  
  22. /*++++++ Main loop ++++++*/
  23.  
  24. FOREVER {
  25.   status = SYS$WAITFR(RCVEF);
  26.   status = SYS$CLREF(RCVEF);
  27.   while (!qempty) { 
  28.     dequeue(&msgbuf);
  29.     switch(msgbuf.cmdtyp) {
  30.  
  31.       case ADDMBX:
  32.           p = search_list(root, msgbuf.xmt_prcnum);
  33.           if (p == NULL) {
  34.               insert_list_item(&root, msgbuf.xmt_prcnum);
  35.               sprintf(mbxname, "CLIENTMBX%d", 
  36.                       msgbuf.xmt_prcnum);
  37.               open_comm_link(&root->mbxid, 
  38.                       sizeof(MSGBUF), mbxname);
  39.           }
  40.           break;
  41.  
  42.       case DELMBX:
  43.           p = search_list(root, msgbuf.xmt_prcnum);
  44.           if (p) {
  45.               close_comm_link(p->mbxid);
  46.               delete_list_item(&root, msgbuf.xmt_prcnum);
  47.           }
  48.           break;
  49.  
  50.       case PASSTHRU:
  51.           p = search_list(root, msgbuf.rcv_prcnum);
  52.           if (p)
  53.               send(p->mbxid, &msgbuf, sizeof(MSGBUF));
  54.           break;
  55.  
  56.       case BROADCAST:
  57.           broadcast(&msgbuf, sizeof(MSGBUF), root);
  58.           break;
  59.  
  60.       case SHUTDOWN:
  61.           msgbuf.msgtyp = SHUTDOWN;
  62.           broadcast(&msgbuf, sizeof(MSGBUF), root);
  63.           while (root) { 
  64.               close_comm_link(root->mbxid);
  65.               root = root->link;
  66.           }
  67.           close_comm_link(rcvmbx);
  68.           exit(SUCCEED);
  69.           break;
  70.          
  71.        default:
  72.           break;
  73.     } 
  74.   }
  75. }  
  76.