pwgrent.c
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
  2. This library is free software; you can redistribute it and/or
  3. modify it under the terms of the GNU Library General Public License as
  4. published by the Free Software Foundation; either version 2 of the
  5. License, or (at your option) any later version.
  6. This library is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  9. Library General Public License for more details.
  10. You should have received a copy of the GNU Library General Public
  11. License along with this library; see the file COPYING.LIB.  If
  12. not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite
  13. 330, Boston, MA  02111-1307, USA.  */
  14. /* Required to tell conf.h not to include the standard ProFTPD
  15.  * header files
  16.  */
  17. #define __PROFTPD_SUPPORT_LIBRARY
  18. #include <conf.h>
  19. #define NPWDFIELDS  7
  20. #define NGRPFIELDS  4
  21. #ifndef BUFSIZ
  22. #define BUFSIZ 1024
  23. #endif
  24. /* provides fgetpwent()/fgetgrent() functions.  Note that the
  25.  * format of the files is probably NOT platform dependant, so
  26.  * use of these functions will require a strict format
  27.  * "username:password:uid:gid:gecos:home:default_shell"
  28.  */
  29. #ifndef HAVE_FGETPWENT
  30. static char pwdbuf[BUFSIZ];
  31. static char *pwdfields[NPWDFIELDS];
  32. static struct passwd pwent;
  33. static struct passwd *_pgetpwent(const char *buf)
  34. {
  35.   register int i;
  36.   register char *cp;
  37.   char *ep;
  38.   char **fields;
  39.   char *buffer;
  40.   struct passwd *pwd;
  41.   fields = pwdfields;
  42.   buffer = pwdbuf;
  43.   pwd = &pwent;
  44.   strncpy(buffer,buf,BUFSIZ-1);
  45.   buffer[BUFSIZ-1] = '';
  46.   for(cp = buffer, i = 0; i < NPWDFIELDS && cp; i++) {
  47.     fields[i] = cp;
  48.     while(*cp && *cp != ':')
  49.       ++cp;
  50.     if(*cp)
  51.       *cp++ = '';
  52.     else
  53.       cp = 0;
  54.   }
  55.   if(i != NPWDFIELDS || *fields[2] == '' || *fields[3] == '')
  56.     return 0;
  57.   pwd->pw_name = fields[0];
  58.   pwd->pw_passwd = fields[1];
  59.   if(fields[2][0] == '' ||
  60.      ((pwd->pw_uid = strtol(fields[2], &ep, 10)) == 0 && *ep))
  61.        return 0;
  62.   if(fields[3][0] == '' ||
  63.      ((pwd->pw_gid = strtol(fields[3], &ep, 10)) == 0 && *ep))
  64.        return 0;
  65.   pwd->pw_gecos = fields[4];
  66.   pwd->pw_dir = fields[5];
  67.   pwd->pw_shell = fields[6];
  68.   return pwd;  
  69. }
  70. struct passwd *fgetpwent(FILE *fp)
  71. {
  72.   char buf[BUFSIZ];
  73.   if (fgets(buf,sizeof(buf),fp) != (char*)0)
  74.   {
  75.     buf[strlen(buf)-1] = '';
  76.     return _pgetpwent(buf);
  77.   }
  78.   return NULL;
  79. }
  80. #endif /* HAVE_FGETPWENT */
  81. #ifndef HAVE_FGETGRENT
  82. #define MAXMEMBERS 4096
  83. static char *grpbuf = NULL;
  84. static struct group grent;
  85. static char *grpfields[NGRPFIELDS];
  86. static char *members[MAXMEMBERS+1];
  87. static char *fgetbufline(char **buf, int *size, FILE *fp)
  88. {
  89.   char *rbuf = NULL,*cp;
  90.   if(!*size || !*buf) {
  91.     *size = BUFSIZ;
  92.     *buf = rbuf = malloc(*size);
  93.     if(!rbuf)
  94.       return 0;
  95.   }
  96.   cp = rbuf;
  97.   while(fgets(cp,(*size) - (cp - rbuf), fp) != (char *)0) {
  98.     if(strchr(cp,'n'))
  99.       return rbuf;
  100.     *size += *size;
  101.     *buf = realloc(rbuf,*size);
  102.     if(!*buf)
  103.       break;
  104.     cp = *buf + (cp - rbuf);
  105.     rbuf = *buf;
  106.     cp = strchr(cp,'');
  107.   }
  108.   free(rbuf);
  109.   *buf = NULL; *size = 0;
  110.   return 0;
  111. }
  112. static char **_grlist(char *s)
  113. {
  114.   int nmembers = 0;
  115.   while(s && *s && nmembers < MAXMEMBERS) {
  116.     members[nmembers++] = s;
  117.     while(*s && *s != ',')
  118.       s++;
  119.     if(*s)
  120.       *s++ = '';
  121.   }
  122.   members[nmembers] = (char*)0;
  123.   return members;
  124. }
  125. static struct group *
  126. _pgetgrent(const char *buf)
  127. {
  128.   int i;
  129.   char *cp;
  130.   i = strlen(buf);
  131.   if(!grpbuf)
  132.     grpbuf = malloc(i);
  133.   else
  134.     grpbuf = realloc(grpbuf,i);
  135.   if(!grpbuf)
  136.     return NULL;
  137.   strncpy(grpbuf,buf,i);
  138.   grpbuf[i-1] = '';
  139.   if((cp = strrchr(grpbuf,'n')))
  140.     *cp = '';
  141.   for(cp = grpbuf, i = 0; i < NGRPFIELDS && cp; i++) {
  142.     grpfields[i] = cp;
  143.     if((cp = strchr(cp,':')))
  144.       *cp++ = 0;
  145.   }
  146.   if(i < (NGRPFIELDS-1) || *grpfields[2] == '')
  147.     return 0;
  148.   grent.gr_name = grpfields[0];
  149.   grent.gr_passwd = grpfields[1];
  150.   grent.gr_gid = atoi(grpfields[2]);
  151.   grent.gr_mem = _grlist(grpfields[3]);
  152.   return &grent;
  153. }
  154. struct group *fgetgrent(FILE *fp)
  155. {
  156.   char *buf = NULL;
  157.   int size = 0;
  158.   char *cp;
  159.   struct group *g;
  160.   if(fgetbufline(&buf,&size,fp) != (char*)0) {
  161.     if((cp = strchr(buf,'n')) != (char*)0)
  162.       *cp = '';
  163.     g = _pgetgrent(buf);
  164.     free(buf);
  165.     return g;
  166.   }
  167.   return 0;
  168. }
  169. #endif /* HAVE_FGETGRENT */