home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * IPC.C
- *
- * Handle IPC messages
- *
- * NOTE: Only an explicit disconnect command will drop DTR, or when
- * the serial.device is closed.
- */
-
- #include "dnet.h"
- #include <local/ipc.h>
-
- #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()
- {
- register IPCMSG *msg;
- char *ptr;
-
- while (msg = GetMsg(IPCPort)) {
- long error = IF_ERROR;
- char **av = NULL;
- short ac = 0;
- register 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;) {
- register 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];
- register 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();
- }
-
-
-