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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Internet TTY "link" (keyboard chat) server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "telnet.h"
  9. #include "session.h"
  10. #include "proc.h"
  11. #include "tty.h"
  12. #include "mailbox.h"
  13. #include "commands.h"
  14. static int Sttylink = -1; /* Protoype socket for service */
  15. int
  16. ttylstart(argc,argv,p)
  17. int argc;
  18. char *argv[];
  19. void *p;
  20. {
  21. struct sockaddr_in lsocket;
  22. int s,type;
  23. FILE *network;
  24. if(Sttylink != -1){
  25. return 0;
  26. }
  27. ksignal(Curproc,0); /* Don't keep the parser waiting */
  28. chname(Curproc,"TTYlink listener");
  29. lsocket.sin_family = AF_INET;
  30. lsocket.sin_addr.s_addr = INADDR_ANY;
  31. if(argc < 2)
  32. lsocket.sin_port = IPPORT_TTYLINK;
  33. else
  34. lsocket.sin_port = atoi(argv[1]);
  35. Sttylink = socket(AF_INET,SOCK_STREAM,0);
  36. bind(Sttylink,(struct sockaddr *)&lsocket,sizeof(lsocket));
  37. listen(Sttylink,1);
  38. for(;;){
  39. if((s = accept(Sttylink,NULL,(int *)NULL)) == -1)
  40. break; /* Service is shutting down */
  41. network = fdopen(s,"r+t");
  42. if(availmem() != 0){
  43. fprintf(network,"System is overloaded; try again latern");
  44. fclose(network);
  45. } else {
  46. type = TELNET;
  47. newproc("chat",2048,ttylhandle,s,
  48.  (void *)&type,(void *)network,0);
  49. }
  50. }
  51. return 0;
  52. }
  53. /* This function handles all incoming "chat" sessions, be they TCP,
  54.  * NET/ROM or AX.25
  55.  */
  56. void
  57. ttylhandle(s,t,p)
  58. int s;
  59. void *t;
  60. void *p;
  61. {
  62. int type;
  63. struct session *sp;
  64. struct sockaddr addr;
  65. int len = MAXSOCKSIZE;
  66. struct telnet tn;
  67. FILE *network;
  68. char *tmp;
  69. type = * (int *)t;
  70. network = (FILE *)p;
  71. sockowner(fileno(network),Curproc); /* We own it now */
  72. getpeername(fileno(network),&addr,&len);
  73. logmsg(fileno(network),"open %s",Sestypes[type]);
  74. tmp = malloc(BUFSIZ);
  75. sprintf(tmp,"ttylink %s",psocket(&addr));
  76. /* Allocate a session descriptor */
  77. if((sp = newsession(tmp,type,1)) == NULL){
  78. fprintf(network,"Too many sessionsn");
  79. fclose(network);
  80. free(tmp);
  81. return;
  82. }
  83. free(tmp);
  84. /* Initialize a Telnet protocol descriptor */
  85. memset(&tn,0,sizeof(tn));
  86. tn.session = sp; /* Upward pointer */
  87. sp->cb.telnet = &tn; /* Downward pointer */
  88. sp->network = network;
  89. sp->proc = Curproc;
  90. setvbuf(sp->network,NULL,_IOLBF,BUFSIZ);
  91. printf("07Incoming %s session %u from %s07n",
  92.  Sestypes[type],sp->index,psocket(&addr));
  93. tnrecv(&tn);
  94. }
  95. /* Shut down Ttylink server */
  96. int
  97. ttyl0(argc,argv,p)
  98. int argc;
  99. char *argv[];
  100. void *p;
  101. {
  102. close_s(Sttylink);
  103. Sttylink = -1;
  104. return 0;
  105. }