home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 6 File / 06-File.zip / mc454src.zip / mc-4.5.4.src / os2emx / src / pwd / mcpwd.c < prev    next >
C/C++ Source or Header  |  1999-01-04  |  4KB  |  229 lines

  1.  
  2.  
  3. /* pwd.c - /etc/passwd access library
  4.  *
  5.  * Author:  Kai Uwe Rommel <rommel@ars.muc.de>
  6.  * Created: Mon Mar 28 1994
  7.  */
  8.  
  9. static char *rcsid =
  10. "$Id: pwd.c,v 1.1 1994/09/16 08:32:48 rommel Exp $";
  11. static char *rcsrev = "$Revision: 1.1 $";
  12.  
  13. /*
  14.  * $Log: pwd.c,v $
  15.  * Revision 1.1  1994/09/16 08:32:48  rommel
  16.  * Initial revision
  17.  * 
  18.  */
  19.  
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <ctype.h>
  24.  
  25. #include "mcpwd.h"
  26.  
  27. #define PWD_FILE "/mc.pwd"
  28. #define PWD_FMT  "%s;%s;%d;%d;%s;%s;%s\n"
  29. #define PWD_SEP  ';'
  30.  
  31. char *get_pw_home()
  32. { char mc_home[256]="",*mc_libdir;
  33.   if ((mc_libdir = getenv ("MC_LIBDIR")) != NULL) {
  34.         strcpy(mc_home,mc_libdir);
  35.     } else {
  36.         strcpy(mc_home,LIBDIR);
  37.     }
  38.  if(mc_home[strlen(mc_home)-1]!='/')strcat(mc_home,"/");
  39.  return strdup(mc_home);
  40. }
  41.  
  42.  
  43. static struct passwd *getpwent(char *name, int uid)
  44. {
  45.   static struct passwd pw;
  46.   static char buffer[256];
  47.   char *ptr;
  48.   FILE *passwd;
  49.   int found = 0;
  50.  
  51.    if ((ptr = get_pw_home()) == NULL)
  52.     return NULL;
  53.  
  54.   strcpy(buffer, ptr);
  55.   strcat(buffer, PWD_FILE);
  56.  
  57.   if ((passwd = fopen(buffer, "r")) == NULL)
  58.     return NULL;
  59.  
  60.   while (!found && fgets(buffer, sizeof(buffer), passwd) != NULL)
  61.   {
  62.     if (buffer[strlen(buffer) - 1] == '\n')
  63.       buffer[strlen(buffer) - 1] = 0;
  64.  
  65.     if (buffer[0] == '#')
  66.       continue;
  67.  
  68.     pw.pw_dir = ""; /* these are optional */
  69.     pw.pw_shell = "";
  70.  
  71.     pw.pw_name = buffer;
  72.  
  73.     if ((ptr = strchr(buffer, PWD_SEP)) != NULL)
  74.       *ptr++ = 0;
  75.     else
  76.       continue;
  77.  
  78.     pw.pw_passwd = ptr;
  79.  
  80.     if ((ptr = strchr(ptr, PWD_SEP)) != NULL)
  81.       *ptr++ = 0;
  82.     else
  83.       continue;
  84.  
  85.     pw.pw_uid = atoi(ptr);
  86.  
  87.     if ((ptr = strchr(ptr, PWD_SEP)) != NULL)
  88.       *ptr++ = 0;
  89.     else
  90.       continue;
  91.  
  92.     pw.pw_gid = atoi(ptr);
  93.  
  94.     if ((ptr = strchr(ptr, PWD_SEP)) != NULL)
  95.       *ptr++ = 0;
  96.     else
  97.       continue;
  98.  
  99.     if (name != NULL && stricmp(name, pw.pw_name) == 0 ||
  100.     uid != -1 && uid == pw.pw_uid)
  101.       found = 1;
  102.  
  103.     pw.pw_gecos = ptr;
  104.  
  105.     if ((ptr = strchr(ptr, PWD_SEP)) != NULL)
  106.       *ptr++ = 0;
  107.     else
  108.       continue;
  109.  
  110.     pw.pw_dir = ptr;
  111.  
  112.     if ((ptr = strchr(ptr, PWD_SEP)) != NULL)
  113.       *ptr++ = 0;
  114.     else
  115.       continue;
  116.  
  117.     pw.pw_shell = ptr;
  118.  
  119.   }
  120.  
  121.   fclose(passwd);
  122.  
  123.   return found ? &pw : NULL;
  124. }
  125.  
  126. struct passwd *getpwnam(char *name)
  127. {
  128.   return getpwent(name, -1);
  129. }
  130.  
  131. struct passwd *getpwuid(int uid)
  132. {
  133.   return getpwent(NULL, uid);
  134. }
  135.  
  136. int setpwent(struct passwd *pw)
  137. {
  138.   char real[256], new[256], bak[256], line[256], buffer[256], newent[256];
  139.   char *ptr, *name;
  140.   FILE *passwd, *newpasswd;
  141.   int found = 0;
  142.  
  143.   if ((ptr = get_pw_home()) == NULL)
  144.     return -1;
  145.  
  146.   strcpy(real, ptr);
  147.   strcat(real, PWD_FILE);
  148.   strcpy(new, real);
  149.   strcat(new, ".new");
  150.   strcpy(bak, real);
  151.   strcat(bak, ".bak");
  152.  
  153.   if ((passwd = fopen(real, "r")) == NULL)
  154.     /* ignore */;
  155.  
  156.   if ((newpasswd = fopen(new, "w")) == NULL)
  157.     return -1;
  158.  
  159.   sprintf(newent, PWD_FMT, pw->pw_name, pw->pw_passwd,
  160.       pw->pw_uid, pw->pw_gid, pw->pw_gecos,pw->pw_dir,pw->pw_shell);
  161.  
  162.  
  163.   while (passwd && fgets(buffer, sizeof(buffer), passwd) != NULL)
  164.   {
  165.     strcpy(line, buffer);
  166.  
  167.     if (buffer[strlen(buffer) - 1] == '\n')
  168.       buffer[strlen(buffer) - 1] = 0;
  169.  
  170.     if (buffer[0] != '#')
  171.     {
  172.       name = buffer;
  173.  
  174.       if ((ptr = strchr(buffer, PWD_SEP )) != NULL)
  175.       {
  176.     *ptr++ = 0;
  177.     if (strcmp(pw->pw_name, name) == 0)
  178.     {
  179.       found = 1;
  180.  
  181.       if (pw->pw_uid != -1) /* that would mean 'delete' */
  182.         fputs(newent, newpasswd);
  183.  
  184.       continue;
  185.     }
  186.       }
  187.     }
  188.  
  189.     fputs(line, newpasswd);
  190.   }
  191.  
  192.   if (!found && pw->pw_uid != -1) /* append new entry */
  193.     fputs(newent, newpasswd);
  194.  
  195.   fclose(newpasswd);
  196.  
  197.   if (passwd)
  198.     fclose(passwd);
  199.  
  200.   unlink(bak);
  201.   rename(real, bak);
  202.  
  203.   if (rename(new, real))
  204.     return -1;
  205.  
  206.   return 0;
  207. }
  208.  
  209. /*
  210. char *crypt(char *p, char *c)
  211. { return p;
  212. }
  213. */
  214.  
  215. int setgid(int id)
  216. { return 0; }
  217.  
  218.  
  219. int setuid(int id)
  220. { return 0; }
  221.  
  222. int getuid(void)
  223. { return 0; }
  224.  
  225.  
  226.  
  227.  
  228. /* end of pwd.c */
  229.