home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 024 / psi110g.zip / SMISC.C < prev    next >
C/C++ Source or Header  |  1994-07-05  |  6KB  |  289 lines

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