home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / network / src_1218.zip / SMISC.C < prev    next >
C/C++ Source or Header  |  1991-01-27  |  5KB  |  253 lines

  1. /* Miscellaneous Internet servers: discard, echo and remote
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "proc.h"
  9. #include "remote.h"
  10. #include "smtp.h"
  11. #include "tcp.h"
  12. #include "commands.h"
  13. #include "hardware.h"
  14. #include "mailbox.h"
  15.  
  16. char *Rempass = "";    /* Remote access password */
  17.  
  18. static int chkrpass __ARGS((struct mbuf *bp));
  19. static void discserv __ARGS((int s,void *unused,void *p));
  20. static void echoserv __ARGS((int s,void *unused,void *p));
  21.  
  22. static int Rem = -1;
  23. static int Sdisc = -1;
  24. static int Secho = -1;
  25.  
  26. /* Start up TCP discard server */
  27. int
  28. dis1(argc,argv,p)
  29. int argc;
  30. char *argv[];
  31. void *p;
  32. {
  33.     struct sockaddr_in lsocket;
  34.     int s;
  35.  
  36.     if(Sdisc != -1){
  37.         return 0;
  38.     }
  39.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  40.     chname(Curproc,"Discard listener");
  41.  
  42.     lsocket.sin_family = AF_INET;
  43.     lsocket.sin_addr.s_addr = INADDR_ANY;
  44.     if(argc < 2)
  45.         lsocket.sin_port = IPPORT_DISCARD;
  46.     else
  47.         lsocket.sin_port = atoi(argv[1]);
  48.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  49.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  50.     listen(Sdisc,1);
  51.     for(;;){
  52.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  53.             break;    /* Service is shutting down */
  54.  
  55.         if(availmem() < Memthresh){
  56.             shutdown(s,1);
  57.         } else
  58.             /* Spawn a server */
  59.             newproc("Discard server",576,discserv,s,NULL,NULL,0);
  60.     }
  61.     return 0;
  62. }
  63. static void
  64. discserv(s,unused,p)
  65. int s;
  66. void *unused;
  67. void *p;
  68. {
  69.     struct mbuf *bp;
  70.  
  71.     sockowner(s,Curproc);
  72.     log(s,"open discard");
  73.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  74.         free_p(bp);
  75.     log(s,"close discard");
  76.     close_s(s);
  77. }
  78. /* Stop discard server */
  79. int
  80. dis0(argc,argv,p)
  81. int argc;
  82. char *argv[];
  83. void *p;
  84. {
  85.     close_s(Sdisc);
  86.     Sdisc = -1;
  87.     return 0;
  88. }
  89. /* Start up TCP echo server */
  90. int
  91. echo1(argc,argv,p)
  92. int argc;
  93. char *argv[];
  94. void *p;
  95. {
  96.     struct sockaddr_in lsocket;
  97.     int s;
  98.  
  99.     if(Secho != -1){
  100.         return 0;
  101.     }
  102.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  103.     chname(Curproc,"Echo listener");
  104.  
  105.     lsocket.sin_family = AF_INET;
  106.     lsocket.sin_addr.s_addr = INADDR_ANY;
  107.     if(argc < 2)
  108.         lsocket.sin_port = IPPORT_ECHO;
  109.     else
  110.         lsocket.sin_port = atoi(argv[1]);
  111.     Secho = socket(AF_INET,SOCK_STREAM,0);
  112.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  113.     listen(Secho,1);
  114.     for(;;){
  115.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  116.             break;    /* Service is shutting down */
  117.  
  118.         if(availmem() < Memthresh){
  119.             shutdown(s,1);
  120.         } else
  121.             /* Spawn a server */
  122.             newproc("Echo server",2048,echoserv,s,NULL,NULL,0);
  123.     }
  124.     return 0;
  125. }
  126. static void
  127. echoserv(s,unused,p)
  128. int s;
  129. void *unused;
  130. void *p;
  131. {
  132.     struct mbuf *bp;
  133.  
  134.     sockowner(s,Curproc);
  135.     log(s,"open echo");
  136.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  137.         send_mbuf(s,bp,0,NULLCHAR,0);
  138.  
  139.     log(s,"close echo");
  140.     close_s(s);
  141. }
  142. /* stop echo server */
  143. int
  144. echo0(argc,argv,p)
  145. int argc;
  146. char *argv[];
  147. void *p;
  148. {
  149.     close_s(Secho);
  150.     Secho = -1;
  151.     return 0;
  152. }
  153. /* Start remote exit/reboot server */
  154. int
  155. rem1(argc,argv,p)
  156. int argc;
  157. char *argv[];
  158. void *p;
  159. {
  160.     struct sockaddr_in lsocket,fsock;
  161.     int i;
  162.     int command;
  163.     struct mbuf *bp;
  164.     int32 addr;
  165.  
  166.     if(Rem != -1){
  167.         return 0;
  168.     }
  169.     psignal(Curproc,0);
  170.     chname(Curproc,"Remote listener");
  171.     lsocket.sin_family = AF_INET;
  172.     lsocket.sin_addr.s_addr = INADDR_ANY;
  173.     if(argc < 2)
  174.         lsocket.sin_port = IPPORT_REMOTE;
  175.     else
  176.         lsocket.sin_port = atoi(argv[1]);
  177.     
  178.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  179.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  180.     for(;;){
  181.         i = sizeof(fsock);
  182.         if(recv_mbuf(Rem,&bp,0,(char *)&fsock,&i) == -1)
  183.             break;
  184.         command = PULLCHAR(&bp);
  185.  
  186.         switch(command){
  187. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  188.         case SYS_RESET:
  189.             i = chkrpass(bp);
  190.             log(Rem,"%s - Remote reset %s",
  191.              psocket((struct sockaddr *)&fsock),
  192.              i == 0 ? "PASSWORD FAIL" : "" );
  193.             if(i != 0){
  194.                 iostop();
  195.                 sysreset();    /* No return */
  196.             }
  197.             break;
  198. #endif
  199.         case SYS_EXIT:
  200.             i = chkrpass(bp);
  201.             log(Rem,"%s - Remote exit %s",
  202.              psocket((struct sockaddr *)&fsock),
  203.              i == 0 ? "PASSWORD FAIL" : "" );
  204.             if(i != 0){
  205.                 iostop();
  206.                 exit(0);
  207.             }
  208.             break;
  209.         case KICK_ME:
  210.             if(len_p(bp) >= sizeof(int32))
  211.                 addr = pull32(&bp);
  212.             else
  213.                 addr = fsock.sin_addr.s_addr;
  214.             kick(addr);
  215.             smtptick((void *)addr);
  216.             break;
  217.         }
  218.         free_p(bp);
  219.     }
  220.     close_s(Rem);
  221.     Rem = -1;
  222.     return 0;
  223. }
  224. /* Check remote password */
  225. static int
  226. chkrpass(bp)
  227. struct mbuf *bp;
  228. {
  229.     char *lbuf;
  230.     int16 len;
  231.     int rval = 0;
  232.  
  233.     len = len_p(bp);
  234.     if(strlen(Rempass) != len)
  235.         return rval;
  236.     lbuf = mallocw(len);
  237.     pullup(&bp,lbuf,len);
  238.     if(strncmp(Rempass,lbuf,len) == 0)
  239.         rval = 1;
  240.     free(lbuf);
  241.     return rval;
  242. }
  243. int
  244. rem0(argc,argv,p)
  245. int argc;
  246. char *argv[];
  247. void *p;
  248. {
  249.     close_s(Rem);
  250.     return 0;
  251. }
  252.  
  253.