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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Internet Finger server
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "global.h"
  7. #include "files.h"
  8. #include "mbuf.h"
  9. #include "socket.h"
  10. #include "session.h"
  11. #include "proc.h"
  12. #include "dirutil.h"
  13. #include "commands.h"
  14. #include "mailbox.h"
  15. static void fingerd(int s,void *unused,void *p);
  16. /* Start up finger service */
  17. int
  18. finstart(argc,argv,p)
  19. int argc;
  20. char *argv[];
  21. void *p;
  22. {
  23. uint16 port;
  24. if(argc < 2)
  25. port = IPPORT_FINGER;
  26. else
  27. port = atoi(argv[1]);
  28. return start_tcp(port,"Finger Server",fingerd,512);
  29. }
  30. static void
  31. fingerd(s,n,p)
  32. int s;
  33. void *n;
  34. void *p;
  35. {
  36. char user[80];
  37. FILE *fp;
  38. char *file,*cp;
  39. FILE *network;
  40. network = fdopen(s,"r+t");
  41. sockowner(s,Curproc);
  42. logmsg(s,"open Finger");
  43. fgets(user,sizeof(user),network);
  44. rip(user);
  45. if(strlen(user) == 0){
  46. fp = dir(Fdir,0);
  47. if(fp == NULL)
  48. fprintf(network,"No finger information availablen");
  49. else
  50. fprintf(network,"Known users on this system:n");
  51. } else {
  52. file = pathname(Fdir,user);
  53. cp = pathname(Fdir,"");
  54. /* Check for attempted security violation (e.g., somebody
  55.  * might be trying to finger "../ftpusers"!)
  56.  */
  57. if(strncmp(file,cp,strlen(cp)) != 0){
  58. fp = NULL;
  59. fprintf(network,"Invalid user name %sn",user);
  60. } else if((fp = fopen(file,READ_TEXT)) == NULL)
  61. fprintf(network,"User %s not knownn",user);
  62. free(cp);
  63. free(file);
  64. }
  65. if(fp != NULL){
  66. sendfile(fp,network,ASCII_TYPE,0);
  67. fclose(fp);
  68. }
  69. if(strlen(user) == 0 && Listusers != NULL)
  70. (*Listusers)(network);
  71. fclose(network);
  72. logmsg(s,"close Finger");
  73. }
  74. int
  75. fin0(argc,argv,p)
  76. int argc;
  77. char *argv[];
  78. void *p;
  79. {
  80. uint16 port;
  81. if(argc < 2)
  82. port = IPPORT_FINGER;
  83. else
  84. port = atoi(argv[1]);
  85. return stop_tcp(port);
  86. }