home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / telecomm / nhclb120 / smisc.c < prev    next >
C/C++ Source or Header  |  1993-09-26  |  4KB  |  206 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #include "remote.h"
  9. #ifdef    UNIX
  10. #include <sys/types.h>
  11. time_t time();
  12. #endif
  13. static void  disc_recv();
  14. static void echo_recv();
  15. static void echo_trans();
  16. static void misc_state();
  17. static struct tcb *disc_tcb,*echo_tcb;
  18. static struct socket remsock;
  19.  
  20. /* Start up discard server */
  21. dis1(argc,argv)
  22. int argc;
  23. char *argv[];
  24. {
  25.     struct socket lsocket;
  26.     void disc_recv(),misc_state();
  27.  
  28.     lsocket.address = ip_addr;
  29.     if(argc < 2)
  30.         lsocket.port = DISCARD_PORT;
  31.     else
  32.         lsocket.port = atoi(argv[1]);
  33.     disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,disc_recv,NULLVFP,misc_state,0,(char *)NULL);
  34. }
  35. /* Start echo server */
  36. echo1(argc,argv)
  37. int argc;
  38. char *argv[];
  39. {
  40.     void echo_recv(),echo_trans(),misc_state();
  41.     struct socket lsocket;
  42.  
  43.     lsocket.address = ip_addr;
  44.     if(argc < 2)
  45.         lsocket.port = ECHO_PORT;
  46.     else
  47.         lsocket.port = atoi(argv[1]);
  48.     echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,echo_recv,echo_trans,misc_state,0,(char *)NULL);
  49.  
  50. }
  51.  
  52. /* Start remote exit/reboot server */
  53. rem1(argc,argv)
  54. int argc;
  55. char *argv[];
  56. {
  57.     void uremote();
  58.  
  59.     remsock.address = ip_addr;
  60.     if(argc < 2)
  61.         remsock.port = REMOTE_PORT;
  62.     else
  63.         remsock.port = atoi(argv[1]);
  64.     open_udp(&remsock,uremote);
  65. }
  66.  
  67. /* Shut down miscellaneous servers */
  68. dis0()
  69. {
  70.     if(disc_tcb != NULLTCB)
  71.         close_tcp(disc_tcb);
  72. }
  73. echo0()
  74. {
  75.     if(echo_tcb != NULLTCB)
  76.         close_tcp(echo_tcb);
  77. }
  78. rem0()
  79. {
  80.     del_udp(&remsock);
  81. }
  82. /* Discard server receiver upcall */
  83. static
  84. void
  85. disc_recv(tcb,cnt)
  86. struct tcb *tcb;
  87. int16 cnt;
  88. {
  89.     struct mbuf *bp;
  90.  
  91.     if(recv_tcp(tcb,&bp,cnt) > 0)
  92.         free_p(bp);            /* Discard */
  93. }
  94.  
  95. /* Echo server receive
  96.  * Copies only as much will fit on the transmit queue
  97.  */
  98. static
  99. void
  100. echo_recv(tcb,cnt)
  101. struct tcb *tcb;
  102. int cnt;
  103. {
  104.     struct mbuf *bp;
  105.     int acnt;
  106.  
  107.     if(cnt == 0){
  108.         close_tcp(tcb);
  109.         return;
  110.     }
  111.     acnt = min(cnt,tcb->snd.wnd);
  112.     if(acnt > 0){
  113.         /* Get only as much will fit in the send window */
  114.         recv_tcp(tcb,&bp,tcb->snd.wnd);
  115.         send_tcp(tcb,bp);
  116.     }
  117. }
  118. /* Echo server transmit
  119.  * Copies anything that might have been left in the receiver queue
  120.  */
  121. static
  122. void
  123. echo_trans(tcb,cnt)
  124. struct tcb *tcb;
  125. int16 cnt;
  126. {
  127.     struct mbuf *bp;
  128.  
  129.     if(tcb->rcvcnt > 0){
  130.         /* Get only as much will fit in the send window */
  131.         recv_tcp(tcb,&bp,cnt);
  132.         send_tcp(tcb,bp);
  133.     }
  134. }
  135.  
  136. /* Log connection state changes; also respond to remote closes */
  137. /*ARGSUSED*/
  138. static
  139. void
  140. misc_state(tcb,old,new)
  141. register struct tcb *tcb;
  142. char old,new;
  143. {
  144.     switch(new){
  145.     case ESTABLISHED:
  146.         log(tcb,"open %d",tcb->conn.local.port);
  147.         break;
  148.     case CLOSE_WAIT:
  149.         close_tcp(tcb);
  150.         break;
  151.     case CLOSED:
  152.         log(tcb,"close %d",tcb->conn.local.port);
  153.         del_tcp(tcb);
  154.         /* Clean up if server is being shut down */
  155.         if(tcb == disc_tcb)
  156.             disc_tcb = NULLTCB;
  157.         else if(tcb == echo_tcb)
  158.             echo_tcb = NULLTCB;
  159.         break;
  160.     }
  161. }
  162. /* Process remote exit/reset command */
  163. /*ARGSUSED*/
  164. void
  165. uremote(sock,cnt)
  166. struct socket *sock;
  167. int16 cnt;
  168. {
  169.     struct mbuf *bp;
  170.     struct socket fsock;
  171.     char command,*cp;
  172.     long t;
  173.     extern FILE *logfp;
  174.     void iostop();
  175.  
  176.     time(&t);
  177.     cp = ctime(&t);
  178.     rip(cp);
  179.  
  180.     recv_udp(sock,&fsock,&bp);
  181.     command = pullchar(&bp);
  182.     switch(uchar(command)){
  183. #if    (defined(UNIX) | defined(MSDOS))
  184.     case SYS_RESET:
  185.         if(logfp != NULLFILE){
  186.             fprintf(logfp,"%s %s - REMOTE RESET\n",
  187.                 cp,psocket(&fsock));
  188.             fflush(logfp);
  189.             fclose(logfp);
  190.         }
  191.         sysreset();
  192.         break;    /* Not necessary */
  193. #endif
  194.     case SYS_EXIT:
  195.         if(logfp != NULLFILE){
  196.             fprintf(logfp,"%s %s - REMOTE EXIT\n",
  197.                 cp,psocket(&fsock));
  198.             fflush(logfp);
  199.             fclose(logfp);
  200.         }
  201.         iostop();
  202.         exit(0);
  203.         break;
  204.     }
  205. }
  206.