home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / inetd10.zip / PWD.C < prev    next >
Text File  |  1994-10-16  |  4KB  |  209 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "fix_env.h"
  5.  
  6. #include "pwd.h"
  7.  
  8. static struct passwd *_getpwd(char *buffer)
  9. {
  10.   static struct passwd pw;
  11.   char *ptr;
  12.  
  13.   if (buffer[strlen(buffer) - 1] == '\n')
  14.     buffer[strlen(buffer) - 1] = 0;
  15.  
  16.   if ( buffer[0] == '#' )
  17.     return NULL;
  18.  
  19.   pw.pw_name = buffer;
  20.  
  21.   if ( (ptr = strchr(buffer, ':')) != NULL )
  22.     *ptr++ = 0;
  23.   else
  24.     return NULL;
  25.  
  26.   pw.pw_passwd = ptr;
  27.  
  28.   if ( (ptr = strchr(ptr, ':')) != NULL )
  29.     *ptr++ = 0;
  30.   else
  31.     return NULL;
  32.  
  33.   pw.pw_uid = atoi(ptr);
  34.  
  35.   if ( (ptr = strchr(ptr, ':')) != NULL )
  36.     *ptr++ = 0;
  37.   else
  38.     return NULL;
  39.  
  40.   pw.pw_gid = atoi(ptr);
  41.  
  42.   if ( (ptr = strchr(ptr, ':')) != NULL )
  43.     *ptr++ = 0;
  44.   else
  45.     return NULL;
  46.  
  47.   pw.pw_gecos = ptr;
  48.  
  49.   if ( ptr[0] && ptr[1] && (ptr = strchr(ptr + 2, ':')) != NULL )
  50.     *ptr++ = 0;   /* skip drive: */
  51.   else
  52.     return NULL;
  53.  
  54.   pw.pw_dir = ptr;
  55.  
  56.   if ( ptr[0] && ptr[1] && (ptr = strchr(ptr + 2, ':')) != NULL )
  57.     *ptr++ = 0;   /* skip drive: */
  58.   else
  59.     return NULL;
  60.  
  61.   pw.pw_shell = ptr;
  62.  
  63.   return &pw;
  64. }
  65.  
  66. struct passwd *getpwnam(const char *name)
  67. {
  68.   struct passwd *pw;
  69.   static char buffer[256];
  70.   FILE *passwd;
  71.  
  72.   strcpy(buffer,"c:\\etc\\passwd");
  73.  
  74.   if ( (passwd = fopen(fix_env(buffer,"ETC"), "r")) == NULL )
  75.     return NULL;
  76.  
  77.   while ( fgets(buffer, sizeof(buffer), passwd) != NULL )
  78.   {
  79.     if (buffer[strlen(buffer) - 1] == '\n')
  80.       buffer[strlen(buffer) - 1] = 0;
  81.  
  82.     if ( (pw=_getpwd(buffer))==NULL )
  83.       continue;
  84.  
  85.     if ( strcmp(name, pw->pw_name) == 0 )
  86.     {
  87.       fclose(passwd);
  88.       return pw;
  89.     }
  90.   }
  91.  
  92.   fclose(passwd);
  93.   return NULL;
  94. }
  95.  
  96. struct passwd *getpwuid(uid_t uid)
  97. {
  98.   struct passwd *pw;
  99.   static char buffer[256];
  100.   FILE *passwd;
  101.  
  102.   strcpy(buffer,"c:\\etc\\passwd");
  103.  
  104.   if ( (passwd = fopen(fix_env(buffer,"ETC"), "r")) == NULL )
  105.     return NULL;
  106.  
  107.   while ( fgets(buffer, sizeof(buffer), passwd) != NULL )
  108.   {
  109.     if (buffer[strlen(buffer) - 1] == '\n')
  110.       buffer[strlen(buffer) - 1] = 0;
  111.  
  112.     if ( (pw=_getpwd(buffer))==NULL )
  113.       continue;
  114.  
  115.     if ( uid == pw->pw_uid)
  116.     {
  117.       fclose(passwd);
  118.       return pw;
  119.     }
  120.   }
  121.  
  122.   fclose(passwd);
  123.   return NULL;
  124. }
  125.  
  126. int getuid(void)
  127. {
  128.   char *name;
  129.   struct passwd *pw;
  130.  
  131.   name=getenv("LOGNAME");
  132.   if (!name) return 0;
  133.  
  134.   pw=getpwnam(name);
  135.   if (!pw) return 0;
  136.  
  137.   return pw->pw_uid;
  138. }  
  139.  
  140. int setpwnam(const char *name, const char *crypted)
  141. {
  142.   struct passwd *pw;
  143.   static char old[256], new[256], bak[256], line[256], buffer[256];
  144.   char *ptr;
  145.   FILE *passwd, *newpasswd;
  146.   int found = 0;
  147.  
  148.   strcpy(old, "c:\\etcp\\passwd");
  149.   fix_env(old, "ETC");
  150.   strcpy(new, old);
  151.   strcat(new, ".new");
  152.   strcpy(bak, old);
  153.   strcat(bak, ".bak");
  154.  
  155.   if ( (passwd = fopen(old, "r")) == NULL )
  156.     return -1;
  157.  
  158.   if ( (newpasswd = fopen(new, "w")) == NULL )
  159.     return -1;
  160.  
  161.   while ( fgets(line, sizeof(line), passwd) != NULL )
  162.   {
  163.     strcpy(buffer, line);
  164.  
  165.     if (buffer[strlen(buffer) - 1] == '\n')
  166.       buffer[strlen(buffer) - 1] = 0;
  167.  
  168.     if ( (pw=_getpwd(buffer))==NULL )
  169.       goto done;
  170.  
  171.     if (strcmp(name, pw->pw_name) == 0)
  172.     {
  173.       sprintf(line, "%s:%s:%d:%d:%s:%s:%s\n", pw->pw_name, crypted,
  174.           pw->pw_uid, pw->pw_gid, pw->pw_gecos, pw->pw_dir, pw->pw_shell);
  175.       found=1;
  176.     }
  177.  
  178.   done:
  179.     fputs(line, newpasswd);
  180.   }
  181.  
  182.   fclose(passwd);
  183.   fclose(newpasswd);
  184.  
  185.   if ( !found )
  186.   {
  187.     unlink(new);
  188.     return -1;
  189.   }
  190.  
  191.   unlink(bak);
  192.   if (rename(old, bak))
  193.     return -1;
  194.   if (rename(new, old))
  195.     return -1;
  196.  
  197.   return 0;
  198. }
  199.  
  200. void setpwent(void)
  201. {
  202. }
  203.  
  204. void endpwent(void)
  205. {
  206. }
  207.  
  208.  
  209.