home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR3 / KA9Q212.ZIP / NR4MAIL.C < prev    next >
C/C++ Source or Header  |  1993-07-16  |  4KB  |  193 lines

  1. /* NETROM mailbox interface
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  *
  4.  *    May '91    Bill Simpson
  5.  *        move to separate file for compilation & linking
  6.  */
  7.  
  8. /****************************************************************************
  9. *    $Id: nr4mail.c 1.2 93/07/16 11:47:37 ROOT_DOS Exp $
  10. *    14 Jul 93    1.2        GT    Fix warnings.                                    *
  11. ****************************************************************************/
  12.  
  13. #include <ctype.h>
  14. #include "global.h"
  15. #include "proc.h"
  16. #include "netrom.h"
  17. #include "socket.h"
  18. #include "session.h"
  19. #include "cmdparse.h"
  20. #include "commands.h"
  21. #include "mailbox.h"
  22. #include "nr4mail.h"
  23. #include "ip.h"
  24.  
  25. #if    NETROM
  26.  
  27. static int Nrsocket = -1;
  28.  
  29.  
  30. int
  31. nr4start(argc,argv,p)
  32. int argc;
  33. char *argv[];
  34. void *p;
  35. {
  36.     int s,type;
  37.  
  38.     if (Nrsocket != -1)
  39.         return -1;
  40.  
  41.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  42.     chname(Curproc,"NETROM listener");
  43.     Nrsocket = socket(AF_NETROM,SOCK_SEQPACKET,0);
  44.     /* bind() is done automatically */
  45.     if (listen(Nrsocket,1) == -1) {
  46.         close_s(Nrsocket);
  47.         Nrsocket = -1;
  48.         return -1;
  49.     }
  50.     for(;;){
  51.         if((s = accept(Nrsocket,NULLCHAR,NULLINT)) == -1)
  52.             break;    /* Service is shutting down */
  53.  
  54.         type = NRSESSION;
  55.         newproc("mbox",2048,mbx_incom,s,(void *)type,NULL,0);
  56.     }
  57.     close_s(Nrsocket);
  58.     Nrsocket = -1;
  59.     return 0;
  60. }
  61. int
  62. nr40(argc,argv,p)
  63. int argc;
  64. char *argv[];
  65. void *p;
  66. {
  67.     close_s(Nrsocket);
  68.     Nrsocket = -1;
  69.     return 0;
  70. }
  71.  
  72.  
  73. static int dombnrident __ARGS((int argc,char *argv[],void *p));
  74. static int dombnrnodes __ARGS((int argc,char *argv[],void *p));
  75. static int dombnrconnect __ARGS((int argc,char *argv[],void *p));
  76.  
  77. static char mbnrid[80];
  78.  
  79. static struct cmds Mbnrcmds[] = {
  80.     { "",        donothing,    0, 0, NULLCHAR },
  81.     { "connect",    dombnrconnect,    0, 0, NULLCHAR },
  82.     { "ident",    dombnrident,    0, 0, NULLCHAR },
  83.     { "nodes",    dombnrnodes,    0, 0, NULLCHAR },
  84.     { "users",    dombox,        0, 0, NULLCHAR },
  85.     { NULLCHAR,    NULLFP,        0, 0, NULLCHAR },
  86. };
  87.  
  88. int
  89. dombnetrom(argc,argv,p)
  90. int argc;
  91. char *argv[];
  92. void *p;
  93. {
  94.     struct mbx *m;
  95.     char *cp;
  96.  
  97.     if(Nrifaces[0].iface == NULLIF){
  98.         tprintf("NET/ROM not activated.\n");
  99.         return 0;
  100.     }
  101.     m = (struct mbx *) p;
  102.     sprintf(mbnrid,"%s:%s",Nrifaces[0].alias,
  103.       pax25(m->line,Nrifaces[0].iface->hwaddr));
  104.     tprintf("Connected to %s    ",mbnrid);
  105.     dombescape(1,NULLCHARP,p);
  106.  
  107.     while(mbxrecvline(m->user,m->line,MBXLINE,m->escape) >= 0) {
  108.         for(cp = m->line; *cp; ++cp)    /* convert to lower case */
  109.             if(isupper(*cp))
  110.                 *cp = tolower(*cp);
  111.         if(cmdparse(Mbnrcmds,m->line,(void *)m) == -1)
  112.             tprintf("%s> Invalid command (CONNECT IDENT NODES USERS)\n",
  113.               mbnrid);
  114.     }
  115.     return 0;
  116. }
  117.  
  118. static int
  119. dombnrident(argc,argv,p)
  120. int argc;
  121. char *argv[];
  122. void *p;
  123. {
  124.     tprintf("%s> %s (%s)\n",mbnrid,Hostname,Version);
  125.     return 0;
  126. }
  127.  
  128. static int
  129. dombnrnodes(argc,argv,p)
  130. int argc;
  131. char *argv[];
  132. void *p;
  133. {
  134.     if(argc < 2)
  135.         return doroutedump();
  136.     return dorouteinfo(argc,argv,p);
  137. }
  138.  
  139. static int
  140. dombnrconnect(argc,argv,p)
  141. int argc;
  142. char *argv[];
  143. void *p;
  144. {
  145.     struct mbx *m;
  146.     char *np, buf[7];
  147.     int s;
  148.     struct sockaddr_nr lsocket, fsocket;
  149.     char alias[AXBUF];
  150.  
  151.     m = (struct mbx *) p;
  152.     if(!(m->privs & NETROM_CMD)){
  153.         tprintf(Noperm);
  154.         return 0;
  155.     }
  156.     if((s = socket(AF_NETROM,SOCK_SEQPACKET,0)) == -1){
  157.         tprintf(Nosock);
  158.         return 0;
  159.     }
  160.     lsocket.nr_family = AF_NETROM;
  161.     /* Set up our local username, bind would use Mycall instead */
  162.     if(strlen(m->name) > 6)
  163.         strncpy(buf,m->name,6);
  164.     else
  165.         strcpy(buf,m->name);
  166.     buf[6] = '\0';
  167.     putalias(alias,buf,0);
  168.     setcall(lsocket.nr_addr.user,alias);
  169.  
  170.     /* Putting anything else than Mycall here will not work */
  171.     memcpy(lsocket.nr_addr.node,Mycall,AXALEN);
  172.     bind(s,(char *)&lsocket,sizeof(struct sockaddr_nr));
  173.  
  174.     /* See if the requested destination could be an alias, and
  175.      * find and use it if it is.  Otherwise assume it is an ax.25
  176.      * address.
  177.      */
  178.     if(putalias(alias,argv[1],0) != -1 &&
  179.         (np = find_nralias(alias)) != NULLCHAR){
  180.         memcpy(fsocket.nr_addr.user,np,AXALEN);
  181.         memcpy(fsocket.nr_addr.node,np,AXALEN);
  182.     } else {    /* parse ax25 callsign */
  183.         /* Only the user callsign of the remote station is never used by */
  184.         /* NET/ROM, but it is needed for the psocket() call. */
  185.         setcall(fsocket.nr_addr.user,argv[1]);
  186.         setcall(fsocket.nr_addr.node,argv[1]);
  187.     }
  188.     fsocket.nr_family = AF_NETROM;
  189.     return gw_connect(m,s,(char *)&fsocket, sizeof(struct sockaddr_nr));
  190. }
  191.  
  192. #endif    /* NETROM */
  193.