nr4mail.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

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