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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Support local term on com port */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "internet.h"
  5. #include "netuser.h"
  6. #include "socket.h"
  7. #include "session.h"
  8. #include "n8250.h"
  9. #include "asy.h"
  10. static void lterm_rx(int,void *,void *);
  11. int
  12. dolterm(argc,argv,p)
  13. int argc;
  14. char *argv[];
  15. void *p;
  16. {
  17. FILE *network = NULL;
  18. struct iface *ifp;
  19. int (*rawsave)(struct iface *,struct mbuf **);
  20. int s; /* Network socket */
  21. struct sockaddr_in fsocket;
  22. struct session *sp;
  23. int c;
  24. int otrigchar;
  25. if((ifp = if_lookup(argv[1])) == NULL){
  26. printf("Interface %s unknownn",argv[1]);
  27. return 1;
  28. }
  29. if(ifp->dev >= ASY_MAX || Asy[ifp->dev].iface != ifp ){
  30. printf("Interface %s not asy portn",argv[1]);
  31. return 1;
  32. }
  33. if(ifp->raw == bitbucket){
  34. printf("tip or dialer session already active on %sn",argv[1]);
  35. return 1;
  36. }
  37. fsocket.sin_family = AF_INET;
  38. if((fsocket.sin_addr.s_addr = resolve(argv[2])) == 0){
  39. printf(Badhost,argv[2]);
  40. keywait(NULL,1);
  41. freesession(sp);
  42. return 1;
  43. }
  44. if(argc > 3)
  45. fsocket.sin_port = atoi(argv[3]);
  46. else
  47. fsocket.sin_port = IPPORT_TELNET;
  48. /* Allocate a session descriptor */
  49. if((sp = newsession(Cmdline,TIP,1)) == NULL){
  50. printf("Too many sessionsn");
  51. return 1;
  52. }
  53. /* Save output handler and temporarily redirect output to null */
  54. rawsave = ifp->raw;
  55. ifp->raw = bitbucket;
  56. /* Suspend the packet input driver. Note that the transmit driver
  57.  * is left running since we use it to send buffers to the line.
  58.  */
  59. suspend(ifp->rxproc);
  60. /* Temporarily change the trigger character */
  61. otrigchar = Asy[ifp->dev].trigchar;
  62. Asy[ifp->dev].trigchar = -1;
  63. #ifdef notdef
  64. /* Wait for CD (wired to DTR from local terminal) to go high */
  65. get_rlsd_asy(ifp->dev,1);
  66. #endif
  67. if((s = socket(AF_INET,SOCK_STREAM,0)) == -1){
  68. printf("Can't create socketn");
  69. keywait(NULL,1);
  70. freesession(sp);
  71. goto cleanup;
  72. }
  73. settos(s,LOW_DELAY);
  74. network = fdopen(s,"r+b");
  75. setvbuf(network,NULL,_IONBF,0);
  76. if(connect(s,(struct sockaddr *)&fsocket,SOCKSIZE) == -1){
  77. perror("connect failed");
  78. keywait(NULL,1);
  79. freesession(sp);
  80. goto cleanup;
  81. }
  82. /* Spawn task to handle network -> serial port traffic */
  83. sp->proc1 = newproc("lterm",512,lterm_rx,ifp->dev,(void *)network,NULL,0);
  84. /* Loop sending from the serial port to the network */
  85. while((c = get_asy(ifp->dev)) != -1){
  86. putchar(c);
  87. putc(c,network);
  88. fflush(network);
  89. }
  90. cleanup:
  91. killproc(sp->proc1);
  92. sp->proc1 = NULL;
  93. ifp->raw = rawsave;
  94. resume(ifp->rxproc);
  95. keywait(NULL,1);
  96. freesession(sp);
  97. return 0;
  98. }
  99. /* Task to handle network -> serial port traffic */
  100. static void
  101. lterm_rx(dev,n1,n2)
  102. int dev;
  103. void *n1,*n2;
  104. {
  105. int c;
  106. char c1;
  107. FILE *network = (FILE *)n1;
  108. while((c = fgetc(network)) != EOF){
  109. c1 = c;
  110. putchar(c1);
  111. asy_write(dev,(uint8 *)&c1,1);
  112. Asy[dev].iface->lastsent = secclock();
  113. }
  114. }