home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 239.lha / amiga / src / dnet / ipc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-02  |  4.3 KB  |  269 lines

  1.  
  2. /*
  3.  *  IPC.C
  4.  *
  5.  *  Handle IPC messages
  6.  *
  7.  *  NOTE:   Only an explicit disconnect command will drop DTR, or when
  8.  *        the serial.device is closed.
  9.  */
  10.  
  11. #include "dnet.h"
  12. #include <local/ipc.h>
  13.  
  14. #define IPCMDS struct _IPCMDS
  15.  
  16. void do_online(), do_offline(), do_stat(), do_quit(), do_disconnect();
  17. void do_state();
  18. void do_recvon(), do_recvoff(), do_serialon(), do_serialoff();
  19. void do_baud();
  20. void do_getidle(), do_getconnect(), do_setidlealert(), do_setconnectalert();
  21. void do_lessconnect(), do_resetconnect(), do_resetidle();
  22.  
  23. IPCMDS {
  24.     short args;
  25.     char *name;
  26.     void (*func)();
  27. };
  28.  
  29. IPCMDS IPCmds[] = {
  30.     0, "online" , do_online,
  31.     0, "offline", do_offline,
  32.     0, "stat", do_stat,
  33.     0, "quit", do_quit,
  34.     0, "disconnect", do_disconnect,
  35.     0, "state", do_state,
  36.     0, "recvon", do_recvon,
  37.     0, "recvoff", do_recvoff,
  38.     0, "serialon", do_serialon,
  39.     0, "serialoff", do_serialoff,
  40.     1, "baud", do_baud,
  41.  
  42.     0, "getidle", do_getidle,
  43.     0, "getconn", do_getconnect,
  44.     2, "setidlealert", do_setidlealert,
  45.     2, "setconnalert", do_setconnectalert,
  46.     1, "lessconn", do_lessconnect,
  47.     0, "resetconn", do_resetconnect,
  48.     0, "resetidle", do_resetidle
  49. };
  50.  
  51. handle_ipc()
  52. {
  53.     register IPCMSG *msg;
  54.     char *ptr;
  55.  
  56.     while (msg = GetMsg(IPCPort)) {
  57.     long error = IF_ERROR;
  58.     char **av = NULL;
  59.     short ac = 0;
  60.     register short i;
  61.     char *buf = NULL;
  62.     long len = 0;
  63.  
  64.     if (ptr = (char *)msg->TBuf) {
  65.         short networknum = atoi(ptr);
  66.         if (networknum == NetworkNum) {
  67.         while (*ptr++);
  68.         ac = ParseCmd(ptr, &av, NULL, NULL, &error, NULL);
  69.         } else {
  70.         error = IF_NOTFND;
  71.         }
  72.     }
  73.     for (i = 0; i < ac;) {
  74.         register IPCMDS *cmds;
  75.  
  76.         for (cmds = IPCmds; cmds != ARYEND(IPCmds); ++cmds) {
  77.         if (strcmp(av[i], cmds->name) == 0)
  78.             break;
  79.         }
  80.         if (cmds == ARYEND(IPCmds)) {
  81.         error = IF_ERROR;
  82.         break;
  83.         }
  84.         if (i + cmds->args >= ac) {
  85.         error = IF_ERROR;
  86.         break;
  87.         }
  88.         error = 0;
  89.         (*cmds->func)(av + i, &buf, &len);
  90.         i += cmds->args + 1;
  91.     }
  92.     if (av)
  93.         FreeParseCmd(av);
  94.     ReplyIPC(msg, buf, len, error);
  95.     }
  96. }
  97.  
  98. void
  99. do_online()
  100. {
  101.     OnLine = 1;
  102. }
  103.  
  104. void
  105. do_offline()
  106. {
  107.     OnLine = 0;     /*    Take DNet off line  */
  108. }
  109.  
  110. void
  111. do_disconnect()
  112. {
  113.     OnLine = 0;     /*    Take DNet off line  */
  114.     DropDTR();      /*  and (temp) drop DTR */
  115. }
  116.  
  117. void
  118. do_quit()
  119. {
  120.     Quit = 1;        /*    Quit out of dnet    */
  121. }
  122.  
  123. void
  124. do_stat(av, pbuf, plen)
  125. char **pbuf;
  126. long *plen;
  127. {
  128.     char buf[256];
  129.     register char *ptr = buf;
  130.  
  131.     sprintf(ptr, "         Bytes  Packets   Errors\n");
  132.     ptr += strlen(ptr);
  133.     sprintf(ptr, "OUT:  %8ld %8ld %8ld\n", BytesOut, PacketsOut, PacketsResent);
  134.     ptr += strlen(ptr);
  135.     sprintf(ptr, "IN :  %8ld %8ld %8ld\n", BytesIn, PacketsIn, PacketsNakd);
  136.     ptr += strlen(ptr);
  137.     sprintf(ptr, "Garbage Bytes In: %ld\n", GarbageIn);
  138.     ptr += strlen(ptr);
  139.     if (ptr - buf > sizeof(buf))
  140.     dneterror("do_stat: buffer overrun");
  141.     AllocAppend(pbuf, plen, buf, strlen(buf)+1);
  142. }
  143.  
  144. /*
  145.  *  Return machine state (ascii)
  146.  *
  147.  *  s iiii:ii oooo:oo        (s = 0/1 1=protrunning
  148.  *                 i = idle time hrs:min
  149.  *                 o = online time hrs:min
  150.  */
  151.  
  152. void
  153. do_state()
  154. {
  155.  
  156. }
  157.  
  158. AllocAppend(pbuf, plen, buf, len)
  159. char **pbuf;
  160. long *plen;
  161. char *buf;
  162. long len;
  163. {
  164.     char *new;
  165.     if (*pbuf) {
  166.     new = malloc(*plen + len);
  167.     BMov(*pbuf, new, *plen);
  168.     free(*pbuf);
  169.     *pbuf = new;
  170.     new += *plen;
  171.     } else {
  172.     *pbuf = new = malloc(len);
  173.     }
  174.     BMov(buf, new, len);
  175.     *plen += len;
  176. }
  177.  
  178. void
  179. do_recvon()
  180. {
  181.     NetRecvOn();
  182. }
  183.  
  184. void
  185. do_recvoff()
  186. {
  187.     NetRecvOff();
  188. }
  189.  
  190. void
  191. do_serialon()
  192. {
  193.     NetSerialOn();
  194. }
  195.  
  196. void
  197. do_serialoff()
  198. {
  199.     NetSerialOff();
  200. }
  201.  
  202. void
  203. do_baud(av)
  204. char **av;
  205. {
  206.     long baud = atoi(av[1]);
  207.     if (baud) {
  208.     Baud = baud;
  209.     SetBaudRate(baud);
  210.     }
  211. }
  212.  
  213. void
  214. do_getidle(av, pbuf, plen)
  215. char **av;
  216. char **pbuf;
  217. long *plen;
  218. {
  219.     char buf[32];
  220.     sprintf(buf, "%ld", GetIdle());
  221.     AllocAppend(pbuf, plen, buf, strlen(buf)+1);
  222. }
  223.  
  224. void
  225. do_getconnect(av, pbuf, plen)
  226. char **av;
  227. char **pbuf;
  228. long *plen;
  229. {
  230.     char buf[32];
  231.     sprintf(buf, "%ld", GetConnect());
  232.     AllocAppend(pbuf, plen, buf, strlen(buf)+1);
  233. }
  234.  
  235. void
  236. do_setidlealert(av)
  237. char **av;
  238. {
  239.     SetIdleAlert(atoi(av[1]), av[2]);
  240. }
  241.  
  242. void
  243. do_setconnectalert(av)
  244. char **av;
  245. {
  246.     SetConnectAlert(atoi(av[1]), av[2]);
  247. }
  248.  
  249. void
  250. do_lessconnect(av)
  251. char **av;
  252. {
  253.     LessConnect(atoi(av[1]));
  254. }
  255.  
  256. void
  257. do_resetconnect()
  258. {
  259.     ResetConnect();
  260. }
  261.  
  262. void
  263. do_resetidle()
  264. {
  265.     ResetIdle();
  266. }
  267.  
  268.  
  269.