home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 239.lha / amiga / src / bbs / main.c < prev    next >
C/C++ Source or Header  |  1989-05-02  |  3KB  |  129 lines

  1.  
  2. /*
  3.  *  MAIN.C
  4.  *
  5.  *  This is a combination client-server.  Client in that it is run
  6.  *  either manually or via DNET startup.  Server in that it accepts
  7.  *  remote connects.  However, since the server is not started up as
  8.  *  a dnet server, it will not be killed automatically.
  9.  *
  10.  *  (1) Listen on PORT_BBS for connections
  11.  *  (2) Monitor DNET and disconnect idle or connect timeout limit
  12.  *  (3) IPC interface commands
  13.  *
  14.  *  (4) Accept connections on PORT_BBS and handle BBS functions.
  15.  */
  16.  
  17. #include "defs.h"
  18. #include <local/xmisc.h>
  19.  
  20. long Chan;
  21. extern int Enable_Abort;
  22.  
  23. main(ac, av)
  24. char *av[];
  25. {
  26.     PORT *DListen();
  27.     PORT *port;
  28.     long mask;
  29.     long lmask;     /*    listen port mask    */
  30.     long cmask;     /*    channel port mask   */
  31.     long imask;     /*    ipc port mask        */
  32.  
  33.     Enable_Abort = 0;
  34.     openlibs(DRES_LIB);
  35.     port = DListen(PORT_BBS);
  36.     if (port == NULL) {
  37.     puts("DBBS: DBBS already running, exiting");
  38.     closelibs(-1);
  39.     exit(1);
  40.     }
  41.     lmask = 1 << port->mp_SigBit;
  42.     cmask = 0;
  43.     imask = 0;
  44.     mask = SIGBREAKF_CTRL_C | lmask | cmask | imask;
  45.  
  46.     for (;;) {
  47.     register long sigs = Wait(mask);
  48.  
  49.     if (Chan && (sigs & cmask)) {   /*  read into buffer and pass on */
  50.         char buf[64];
  51.         short n;
  52.         char aux;
  53.         n = DNRead(Chan, buf, sizeof(buf));
  54.         if (n > 0) {
  55.         printf("Recv: ");
  56.         fflush(stdout);
  57.         write(1, buf, n);
  58.         }
  59.         if (n == -2) {
  60.         short val;
  61.         short cmd = DGetIoctl(Chan, &val, &aux);
  62.         if (cmd >= 0)
  63.             HandleIoctl(cmd, val, aux);
  64.         printf("RECV IOCTL %d %d %d\n", cmd, val, aux);
  65.         }
  66.         if (n < 0)
  67.         printf("GET N %d\n", n);
  68.     }
  69.     if (Chan && DCheckEof(Chan)) {
  70.         DWrite(Chan, "DBBS close\n", 11);
  71.         DClose(Chan);
  72.         puts("Disconnect");
  73.         Chan = 0;
  74.         mask &= ~cmask;
  75.         cmask = 0;
  76.     }
  77.     if (sigs & SIGBREAKF_CTRL_C)
  78.         break;
  79.     if (sigs & lmask) {
  80.         if (!Chan) {
  81.         printf("Connect ");
  82.         if (Chan = DAccept(port)) {
  83.             puts("OK");
  84.             cmask = 1 << ((PORT *)Chan)->mp_SigBit;
  85.             DQueue(Chan, 4);
  86.             mask |= cmask;
  87.             HelloMsg();
  88.             DIoctl(Chan, CIO_MODE, 3, 0);   /*  set echo+cooked mode */
  89.         } else {
  90.             puts("Failed");
  91.         }
  92.         } else {
  93.         DNAAccept(port);
  94.         }
  95.     }
  96.     if (sigs & imask) {
  97.         ;
  98.     }
  99.     }
  100.     if (Chan)
  101.     DClose(Chan);
  102.     if (port)
  103.     DUnListen(port);
  104.     closelibs(-1);
  105. }
  106.  
  107. /*
  108.  *  Hello Msg.
  109.  *
  110.  *  DBBS:hello.msg
  111.  */
  112.  
  113. HelloMsg()
  114. {
  115.     FILE *fi = fopen("dbbs:hello.msg", "r");
  116.     char buf[128];
  117.  
  118.     if (fi) {
  119.     while (fgets(buf, sizeof(buf), fi))
  120.         DWrite(Chan, buf, strlen(buf));
  121.     fclose(fi);
  122.     }
  123. }
  124.  
  125. HandleIoctl(cmd, n, aux)
  126. {
  127. }
  128.  
  129.