pidentd-2.7b4
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. *** src/parse.c.orig Wed Aug 14 23:02:19 1996
  2. --- src/parse.c Wed Aug 14 23:02:18 1996
  3. ***************
  4. *** 14,19 ****
  5. --- 14,20 ----
  6.   #endif
  7.   
  8.   #include <stdio.h>
  9. + #include <string.h>
  10.   #include <errno.h>
  11.   #include <ctype.h>
  12.   #include <pwd.h>
  13. ***************
  14. *** 35,42 ****
  15. --- 36,48 ----
  16.   #endif
  17.   
  18.   #include <sys/types.h>
  19. + #include <sys/file.h>
  20.   #include <sys/stat.h>
  21.   
  22. + #ifndef SRVIDT_FILE
  23. + #define SRVIDT_FILE "/tmp/socks5.ident"
  24. + #endif
  25.   #if defined(MIPS) || defined(BSD43)
  26.   extern int errno;
  27.   #endif
  28. ***************
  29. *** 51,56 ****
  30. --- 57,63 ----
  31.   #include "crypto.h"
  32.   
  33.   extern void *malloc();
  34. + extern char *getenv();
  35.   
  36.   /*
  37.   ** This function will eat whitespace characters until
  38. ***************
  39. *** 154,159 ****
  40. --- 161,207 ----
  41.     return (rcode == 0);
  42.   }
  43.   
  44. + char *socks_user(faddr, fport, laddr, lport) 
  45. +      struct in_addr *faddr;
  46. +      u_short fport;
  47. +      struct in_addr *laddr;
  48. +      u_short lport;
  49. + {
  50. +     char *myfile = getenv("SOCKS5_IDENTFILE"), *end, *fbuf, *offset;
  51. +     char idtentry[2*16+2*6+1]; 
  52. +     static char *user;
  53. +     struct stat sb;
  54. +     int fd;
  55. +     myfile = myfile?myfile:SRVIDT_FILE;
  56. +     sprintf(idtentry, "%s,%d,",                  inet_ntoa(*faddr), fport);
  57. +     sprintf(idtentry+strlen(idtentry), "%s,%d,", inet_ntoa(*laddr), lport);
  58. +     if (user) free(user);
  59. +     user = NULL;
  60. +     do {
  61. +       if ((fd = open(myfile, O_RDONLY, 0644)) < 0) break;
  62. +       flock(fd, LOCK_EX);
  63. +       if (fstat(fd, &sb) < 0) break;
  64. +       if ((fbuf = (char *)malloc((sb.st_size+1)*sizeof(char))) == NULL) break;
  65. +       if (read(fd, fbuf, sb.st_size) < 0) break;
  66. +       fbuf[sb.st_size] = '';
  67. +     
  68. +       if ((offset = strstr(fbuf,   idtentry)) == NULL) break;
  69. +       if ((end    = strchr(offset, 'n'))     == NULL) break;
  70. +       *end = '';
  71. +       user = strdup(offset + strlen(idtentry));
  72. +     } while (0);
  73. +     if (fbuf) free(fbuf);
  74. +     if (fd >= 0) close(fd);
  75. +     return user;
  76. + }
  77.   
  78.   int parse(fp, laddr, faddr)
  79.     FILE *fp;
  80. ***************
  81. *** 179,184 ****
  82. --- 227,233 ----
  83.   #endif
  84.     struct in_addr laddr2;
  85.     struct in_addr faddr2;
  86. +   char *name;
  87.     int k_opened;
  88.   
  89.     k_opened = 0;
  90. ***************
  91. *** 463,468 ****
  92. --- 512,525 ----
  93.       if (debug_flag && syslog_flag)
  94.         syslog(LOG_DEBUG, "  After k_open(), before k_getuid()");
  95.   
  96. +     if ((name = socks_user(&faddr2, fport, laddr, lport)) != NULL) {
  97. +       printf("%d , %d : USERID : %s%s%s :%srn",
  98. +            lport, fport,
  99. +            other_flag ? "OTHER" : "UNIX",
  100. +            charset_name ? " , " : "",
  101. +            charset_name ? charset_name : "",
  102. +            name);
  103. +     } else {
  104.   
  105.       /*
  106.       ** Get the specific TCP connection and return the uid - user number.
  107. ***************
  108. *** 680,685 ****
  109. --- 737,743 ----
  110.         charset_name ? charset_name : "",
  111.         pwp->pw_name);
  112.   
  113. +     }
  114.     } while(fflush(stdout), fflush(stderr), multi_flag && eat_whitespace());
  115.   
  116.     return 0;