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

代理服务器

开发平台:

Unix_Linux

  1. *** src/parse.c.orig Thu Aug  3 10:57:49 1995
  2. --- src/parse.c Thu Oct 12 18:40:20 1995
  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. *** 32,39 ****
  15. --- 33,45 ----
  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. *** 48,53 ****
  30. --- 54,60 ----
  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. *** 151,156 ****
  40. --- 158,199 ----
  41.     return (rcode == 0);
  42.   }
  43.   
  44. + char *socks_user(struct in_addr *faddr, u_short fport, struct in_addr *laddr, u_short lport) {
  45. +     char *myfile = getenv("SOCKS5_IDENTFILE"), *end, *fbuf, *offset;
  46. +     char idtentry[2*16+2*6+1]; 
  47. +     static char *user;
  48. +     struct stat sb;
  49. +     int fd;
  50. +     myfile = myfile?myfile:SRVIDT_FILE;
  51. +     sprintf(idtentry, "%s,%d,",                  inet_ntoa(*faddr), fport);
  52. +     sprintf(idtentry+strlen(idtentry), "%s,%d,", inet_ntoa(*laddr), lport);
  53. +     if (user) free(user);
  54. +     user = NULL;
  55. +     do {
  56. +  if ((fd = open(myfile, O_RDONLY, 0644)) < 0) break;
  57. +  flock(fd, LOCK_EX);
  58. +  if (fstat(fd, &sb) < 0) break;
  59. +      if ((fbuf = (char *)malloc((sb.st_size+1)*sizeof(char))) == NULL) break;
  60. +      if (read(fd, fbuf, sb.st_size) < 0) break;
  61. +  fbuf[sb.st_size] = '';
  62. +     
  63. +  if ((offset = strstr(fbuf,   idtentry)) == NULL) break;
  64. +  if ((end    = strchr(offset, 'n'))     == NULL) break;
  65. +  *end = '';
  66. +  user = strdup(offset + strlen(idtentry));
  67. +     } while (0);
  68. +     if (fbuf) free(fbuf);
  69. +     if (fd >= 0) close(fd);
  70. +     return user;
  71. + }
  72.   
  73.   int parse(fp, laddr, faddr)
  74.     FILE *fp;
  75. ***************
  76. *** 170,175 ****
  77. --- 213,219 ----
  78.   #endif
  79.     struct in_addr laddr2;
  80.     struct in_addr faddr2;
  81. +   char *name;
  82.     
  83.     
  84.     if (debug_flag && syslog_flag)
  85. ***************
  86. *** 425,430 ****
  87. --- 469,482 ----
  88.       if (debug_flag && syslog_flag)
  89.         syslog(LOG_DEBUG, "  After fscanf(), before k_getuid()");
  90.       
  91. +     if ((name = socks_user(&faddr2, fport, laddr, lport)) != NULL) {
  92. +       printf("%d , %d : USERID : %s%s%s :%srn",
  93. +       lport, fport,
  94. +       other_flag ? "OTHER" : "UNIX",
  95. +       charset_name ? " , " : "",
  96. +       charset_name ? charset_name : "",
  97. +       name);
  98. +     } else {
  99.       /*
  100.       ** Next - get the specific TCP connection and return the
  101.       ** uid - user number.
  102. ***************
  103. *** 433,438 ****
  104. --- 485,491 ----
  105.       ** kernel changed beneath us and we missed or took
  106.       ** a fault.
  107.       */
  108.       for (try = 0;
  109.     (try < 5 &&
  110.       k_getuid(&faddr2, htons(fport), laddr, htons(lport), &uid) == -1);
  111. ***************
  112. *** 517,523 ****
  113.         charset_name ? " , " : "",
  114.         charset_name ? charset_name : "",
  115.         pwp->pw_name);
  116. !     
  117.     } while(fflush(stdout), fflush(stderr), multi_flag && eat_whitespace());
  118.   
  119.     return 0;
  120. --- 570,576 ----
  121.         charset_name ? " , " : "",
  122.         charset_name ? charset_name : "",
  123.         pwp->pw_name);
  124. !     }
  125.     } while(fflush(stdout), fflush(stderr), multi_flag && eat_whitespace());
  126.   
  127.     return 0;