/* * IPC.C * * Handle IPC messages * * NOTE: Only an explicit disconnect command will drop DTR, or when * the serial.device is closed. */ static int dummy; #ifdef NOTDEF #include "dnet.h" #include #define IPCMDS struct _IPCMDS void do_online(), do_offline(), do_stat(), do_quit(), do_disconnect(); void do_state(); void do_recvon(), do_recvoff(), do_serialon(), do_serialoff(); void do_baud(); void do_getidle(), do_getconnect(), do_setidlealert(), do_setconnectalert(); void do_lessconnect(), do_resetconnect(), do_resetidle(); IPCMDS { short args; char *name; void (*func)(); }; IPCMDS IPCmds[] = { 0, "online" , do_online, 0, "offline", do_offline, 0, "stat", do_stat, 0, "quit", do_quit, 0, "disconnect", do_disconnect, 0, "state", do_state, 0, "recvon", do_recvon, 0, "recvoff", do_recvoff, 0, "serialon", do_serialon, 0, "serialoff", do_serialoff, 1, "baud", do_baud, 0, "getidle", do_getidle, 0, "getconn", do_getconnect, 2, "setidlealert", do_setidlealert, 2, "setconnalert", do_setconnectalert, 1, "lessconn", do_lessconnect, 0, "resetconn", do_resetconnect, 0, "resetidle", do_resetidle }; handle_ipc() { IPCMSG *msg; char *ptr; while (msg = GetMsg(IPCPort)) { long error = IF_ERROR; char **av = NULL; short ac = 0; short i; char *buf = NULL; long len = 0; if (ptr = (char *)msg->TBuf) { short networknum = atoi(ptr); if (networknum == NetworkNum) { while (*ptr++); ac = ParseCmd(ptr, &av, NULL, NULL, &error, NULL); } else { error = IF_NOTFND; } } for (i = 0; i < ac;) { IPCMDS *cmds; for (cmds = IPCmds; cmds != ARYEND(IPCmds); ++cmds) { if (strcmp(av[i], cmds->name) == 0) break; } if (cmds == ARYEND(IPCmds)) { error = IF_ERROR; break; } if (i + cmds->args >= ac) { error = IF_ERROR; break; } error = 0; (*cmds->func)(av + i, &buf, &len); i += cmds->args + 1; } if (av) FreeParseCmd(av); ReplyIPC(msg, buf, len, error); } } void do_online() { OnLine = 1; } void do_offline() { OnLine = 0; /* Take DNet off line */ } void do_disconnect() { OnLine = 0; /* Take DNet off line */ DropDTR(); /* and (temp) drop DTR */ } void do_quit() { Quit = 1; /* Quit out of dnet */ } void do_stat(av, pbuf, plen) char **pbuf; long *plen; { char buf[256]; char *ptr = buf; sprintf(ptr, " Bytes Packets Errors\n"); ptr += strlen(ptr); sprintf(ptr, "OUT: %8ld %8ld %8ld\n", BytesOut, PacketsOut, PacketsResent); ptr += strlen(ptr); sprintf(ptr, "IN : %8ld %8ld %8ld\n", BytesIn, PacketsIn, PacketsNakd); ptr += strlen(ptr); sprintf(ptr, "Garbage Bytes In: %ld\n", GarbageIn); ptr += strlen(ptr); if (ptr - buf > sizeof(buf)) dneterror("do_stat: buffer overrun"); AllocAppend(pbuf, plen, buf, strlen(buf)+1); } /* * Return machine state (ascii) * * s iiii:ii oooo:oo (s = 0/1 1=protrunning * i = idle time hrs:min * o = online time hrs:min */ void do_state() { } AllocAppend(pbuf, plen, buf, len) char **pbuf; long *plen; char *buf; long len; { char *new; if (*pbuf) { new = malloc(*plen + len); BMov(*pbuf, new, *plen); free(*pbuf); *pbuf = new; new += *plen; } else { *pbuf = new = malloc(len); } BMov(buf, new, len); *plen += len; } void do_recvon() { NetRecvOn(); } void do_recvoff() { NetRecvOff(); } void do_serialon() { NetSerialOn(); } void do_serialoff() { NetSerialOff(); } void do_baud(av) char **av; { long baud = atoi(av[1]); if (baud) { Baud = baud; SetBaudRate(baud); } } void do_getidle(av, pbuf, plen) char **av; char **pbuf; long *plen; { char buf[32]; sprintf(buf, "%ld", GetIdle()); AllocAppend(pbuf, plen, buf, strlen(buf)+1); } void do_getconnect(av, pbuf, plen) char **av; char **pbuf; long *plen; { char buf[32]; sprintf(buf, "%ld", GetConnect()); AllocAppend(pbuf, plen, buf, strlen(buf)+1); } void do_setidlealert(av) char **av; { SetIdleAlert(atoi(av[1]), av[2]); } void do_setconnectalert(av) char **av; { SetConnectAlert(atoi(av[1]), av[2]); } void do_lessconnect(av) char **av; { LessConnect(atoi(av[1])); } void do_resetconnect() { ResetConnect(); } void do_resetidle() { ResetIdle(); } #endif