/* * MAIN.C * * This is a combination client-server. Client in that it is run * either manually or via DNET startup. Server in that it accepts * remote connects. However, since the server is not started up as * a dnet server, it will not be killed automatically. * * (1) Listen on PORT_BBS for connections * (2) Monitor DNET and disconnect idle or connect timeout limit * (3) IPC interface commands * * (4) Accept connections on PORT_BBS and handle BBS functions. */ #include "defs.h" #include long Chan; extern int Enable_Abort; main(ac, av) char *av[]; { PORT *DListen(); PORT *port; long mask; long lmask; /* listen port mask */ long cmask; /* channel port mask */ long imask; /* ipc port mask */ Enable_Abort = 0; openlibs(DRES_LIB); port = DListen(PORT_BBS); if (port == NULL) { puts("DBBS: DBBS already running, exiting"); closelibs(-1); exit(1); } lmask = 1 << port->mp_SigBit; cmask = 0; imask = 0; mask = SIGBREAKF_CTRL_C | lmask | cmask | imask; for (;;) { register long sigs = Wait(mask); if (Chan && (sigs & cmask)) { /* read into buffer and pass on */ char buf[64]; short n; char aux; n = DNRead(Chan, buf, sizeof(buf)); if (n > 0) { printf("Recv: "); fflush(stdout); write(1, buf, n); } if (n == -2) { short val; short cmd = DGetIoctl(Chan, &val, &aux); if (cmd >= 0) HandleIoctl(cmd, val, aux); printf("RECV IOCTL %d %d %d\n", cmd, val, aux); } if (n < 0) printf("GET N %d\n", n); } if (Chan && DCheckEof(Chan)) { DWrite(Chan, "DBBS close\n", 11); DClose(Chan); puts("Disconnect"); Chan = 0; mask &= ~cmask; cmask = 0; } if (sigs & SIGBREAKF_CTRL_C) break; if (sigs & lmask) { if (!Chan) { printf("Connect "); if (Chan = DAccept(port)) { puts("OK"); cmask = 1 << ((PORT *)Chan)->mp_SigBit; DQueue(Chan, 4); mask |= cmask; HelloMsg(); DIoctl(Chan, CIO_MODE, 3, 0); /* set echo+cooked mode */ } else { puts("Failed"); } } else { DNAAccept(port); } } if (sigs & imask) { ; } } if (Chan) DClose(Chan); if (port) DUnListen(port); closelibs(-1); } /* * Hello Msg. * * DBBS:hello.msg */ HelloMsg() { FILE *fi = fopen("dbbs:hello.msg", "r"); char buf[128]; if (fi) { while (fgets(buf, sizeof(buf), fi)) DWrite(Chan, buf, strlen(buf)); fclose(fi); } } HandleIoctl(cmd, n, aux) { }