home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / s920603.zip / AX25MAIL.C < prev    next >
C/C++ Source or Header  |  1992-05-02  |  2KB  |  114 lines

  1. /* AX25 mailbox interface
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  *
  4.  *    May '91    Bill Simpson
  5.  *        move to separate file for compilation & linking
  6.  */
  7. #include "global.h"
  8. #include "proc.h"
  9. #include "ax25.h"
  10. #include "socket.h"
  11. #include "session.h"
  12. #include "mailbox.h"
  13. #include "ax25mail.h"
  14.  
  15.  
  16. /* Axi_sock is kept in Socket.c, so that this module won't be called */
  17.  
  18. int
  19. ax25start(argc,argv,p)
  20. int argc;
  21. char *argv[];
  22. void *p;
  23. {
  24.     int s,type,c;
  25.     FILE *network;
  26.  
  27.     if (Axi_sock != -1)
  28.         return 0;
  29.  
  30.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  31.     chname(Curproc,"AX25 listener");
  32.     Axi_sock = socket(AF_AX25,SOCK_STREAM,0);
  33.     /* bind() is done automatically */
  34.     if(listen(Axi_sock,1) == -1){
  35.         close_s(Axi_sock);
  36.         return -1;
  37.     }
  38.     for(;;){
  39.         if((s = accept(Axi_sock,NULLCHAR,NULLINT)) == -1)
  40.             break;    /* Service is shutting down */
  41.  
  42.         type = AX25TNC;
  43.         /* Eat the line that triggered the connection
  44.          * and then start the mailbox
  45.          */
  46.         network = fdopen(s,"r+t");        
  47.         while((c = getc(network)) != '\n' && c != EOF)
  48.             ;
  49.         newproc("mbox",2048,mbx_incom,s,(void *)type,(void *)network,0);
  50.     }
  51.     close_s(Axi_sock);
  52.     Axi_sock = -1;
  53.     return 0;
  54. }
  55. int
  56. ax250(argc,argv,p)
  57. int argc;
  58. char *argv[];
  59. void *p;
  60. {
  61.     close_s(Axi_sock);
  62.     Axi_sock = -1;
  63.     return 0;
  64. }
  65.  
  66.  
  67. int
  68. dogateway(argc,argv,p)
  69. int argc;
  70. char *argv[];
  71. void *p;
  72. {
  73.     struct mbx *m;
  74.     struct sockaddr_ax fsocket;
  75.     int ndigis,i,s;
  76.     char digis[MAXDIGIS][AXALEN];
  77.     char target[AXALEN];
  78.  
  79.     m = (struct mbx *)p;
  80.     if(!(m->privs & AX25_CMD)){
  81.         printf(Noperm);
  82.         return 0;
  83.     }
  84.     /* If digipeaters are given, put them in the routing table */
  85.     if(argc > 3){
  86.         setcall(target,argv[2]);
  87.         ndigis = argc - 3;
  88.         if(ndigis > MAXDIGIS){
  89.             printf("Too many digipeaters\n");
  90.             return 1;
  91.         }
  92.         for(i=0;i<ndigis;i++){
  93.             if(setcall(digis[i],argv[i+3]) == -1){
  94.                 printf("Bad digipeater %s\n",argv[i+3]);
  95.                 return 1;
  96.             }
  97.         }
  98.         if(ax_add(target,AX_LOCAL,digis,ndigis) == NULLAXR){
  99.             printf("Route add failed\n");
  100.             return 1;
  101.         }
  102.     }
  103.     if((s = socket(AF_AX25,SOCK_STREAM,0)) == -1){
  104.         printf(Nosock);
  105.         return 0;
  106.     }
  107.     fsocket.sax_family = AF_AX25;
  108.     setcall(fsocket.ax25_addr,argv[2]);
  109.     strncpy(fsocket.iface,argv[1],ILEN);
  110.     m->startmsg = mallocw(80);
  111.     sprintf(m->startmsg,"*** LINKED to %s\n",m->name);
  112.     return gw_connect(m,s,(char *)&fsocket, sizeof(struct sockaddr_ax));
  113. }
  114.