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

TCP/IP协议栈

开发平台:

Visual C++

  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. /* Axi_sock is kept in Socket.c, so that this module won't be called */
  15. int
  16. ax25start(argc,argv,p)
  17. int argc;
  18. char *argv[];
  19. void *p;
  20. {
  21. int s,type,c;
  22. FILE *network;
  23. if (Axi_sock != -1)
  24. return 0;
  25. ksignal(Curproc,0); /* Don't keep the parser waiting */
  26. chname(Curproc,"AX25 listener");
  27. Axi_sock = socket(AF_AX25,SOCK_STREAM,0);
  28. /* bind() is done automatically */
  29. if(listen(Axi_sock,1) == -1){
  30. close_s(Axi_sock);
  31. return -1;
  32. }
  33. for(;;){
  34. if((s = accept(Axi_sock,NULL,NULL)) == -1)
  35. break; /* Service is shutting down */
  36. type = AX25TNC;
  37. /* Eat the line that triggered the connection
  38.  * and then start the mailbox
  39.  */
  40. network = fdopen(s,"r+t");
  41. while((c = getc(network)) != 'n' && c != EOF)
  42. ;
  43. newproc("mbox",2048,mbx_incom,s,(void *)type,(void *)network,0);
  44. }
  45. close_s(Axi_sock);
  46. Axi_sock = -1;
  47. return 0;
  48. }
  49. int
  50. ax250(argc,argv,p)
  51. int argc;
  52. char *argv[];
  53. void *p;
  54. {
  55. close_s(Axi_sock);
  56. Axi_sock = -1;
  57. return 0;
  58. }
  59. int
  60. dogateway(argc,argv,p)
  61. int argc;
  62. char *argv[];
  63. void *p;
  64. {
  65. struct mbx *m;
  66. struct sockaddr_ax fsocket;
  67. int ndigis,i,s;
  68. uint8 digis[MAXDIGIS][AXALEN];
  69. uint8 target[AXALEN];
  70. m = (struct mbx *)p;
  71. if(!(m->privs & AX25_CMD)){
  72. printf(Noperm);
  73. return 0;
  74. }
  75. /* If digipeaters are given, put them in the routing table */
  76. if(argc > 3){
  77. setcall(target,argv[2]);
  78. ndigis = argc - 3;
  79. if(ndigis > MAXDIGIS){
  80. printf("Too many digipeatersn");
  81. return 1;
  82. }
  83. for(i=0;i<ndigis;i++){
  84. if(setcall(digis[i],argv[i+3]) == -1){
  85. printf("Bad digipeater %sn",argv[i+3]);
  86. return 1;
  87. }
  88. }
  89. if(ax_add(target,AX_LOCAL,digis,ndigis) == NULL){
  90. printf("Route add failedn");
  91. return 1;
  92. }
  93. }
  94. if((s = socket(AF_AX25,SOCK_STREAM,0)) == -1){
  95. printf(Nosock);
  96. return 0;
  97. }
  98. fsocket.sax_family = AF_AX25;
  99. setcall(fsocket.ax25_addr,argv[2]);
  100. strncpy(fsocket.iface,argv[1],ILEN);
  101. m->startmsg = mallocw(80);
  102. sprintf(m->startmsg,"*** LINKED to %sn",m->name);
  103. return gw_connect(m,s,(struct sockaddr *)&fsocket, sizeof(struct sockaddr_ax));
  104. }