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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Internet finger client
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "socket.h"
  9. #include "session.h"
  10. #include "proc.h"
  11. #include "netuser.h"
  12. #include "commands.h"
  13. #include "tty.h"
  14. static int keychar(int c);
  15. int
  16. dofinger(argc,argv,p)
  17. int argc;
  18. char *argv[];
  19. void *p;
  20. {
  21. struct sockaddr_in sock;
  22. char *cp;
  23. int s,i;
  24. int c;
  25. struct session *sp;
  26. FILE *network;
  27. /* Allocate a session descriptor */
  28. if((sp = newsession(Cmdline,FINGER,1)) == NULL){
  29. printf("Too many sessionsn");
  30. keywait(NULL,1);
  31. return 1;
  32. }
  33. sp->inproc = keychar; /* Intercept ^C */
  34. sp->ttystate.echo = sp->ttystate.edit = 0;
  35. sock.sin_family = AF_INET;
  36. sock.sin_port = IPPORT_FINGER;
  37. for(i=1;i<argc;i++){
  38. cp = strchr(argv[i],'@');
  39. if(cp == NULL){
  40. printf("%s: local names not supportedn",argv[i]);
  41. continue;
  42. }
  43. *cp++ = '';
  44. printf("%s@%s:n",argv[i],cp);
  45. printf("Resolving %s...n",cp);
  46. if((sock.sin_addr.s_addr = resolve(cp)) == 0){
  47. printf("unknownn");
  48. continue;
  49. }
  50. printf("Trying %s...n",psocket((struct sockaddr *)&sock));
  51. if((s = socket(AF_INET,SOCK_STREAM,0)) == -1){
  52. printf("Can't create socketn");
  53. break;
  54. }
  55. if(connect(s,(struct sockaddr *)&sock,sizeof(sock)) == -1){
  56. cp = sockerr(s);
  57. printf("Connect failed: %sn",cp != NULL ? cp : "");
  58. close_s(s);
  59. continue;
  60. }
  61. printf("Connectedn");
  62. sp->network = network = fdopen(s,"r+t");
  63. fprintf(network,"%sn",argv[i]);
  64. fflush(stdout);
  65. while((c = getc(network)) != EOF)
  66. putchar(c);
  67. fclose(network);
  68. sp->network = NULL;
  69. }
  70. keywait(NULL,1);
  71. freesession(sp);
  72. return 0;
  73. }
  74. static int
  75. keychar(c)
  76. int c;
  77. {
  78. if(c != CTLC)
  79. return 1; /* Ignore all but ^C */
  80. fprintf(Current->output,"^Cn");
  81. alert(Current->proc,EABORT);
  82. return 0;
  83. }