home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / shadow-2.pt2 / entry.c < prev    next >
C/C++ Source or Header  |  1989-02-03  |  2KB  |  91 lines

  1. #include <stdio.h>
  2. #include <pwd.h>
  3. #include <string.h>
  4. #include "config.h"
  5. #ifdef    SHADOWPWD
  6. #include "shadow.h"
  7. #endif
  8.  
  9. struct    passwd    *fgetpwent ();
  10. char    *malloc ();
  11.  
  12. char    *strdup (s)
  13. char    *s;
  14. {
  15.     char    *cp;
  16.  
  17.     if (s == (char *) 0)
  18.         return ((char *) 0);
  19.  
  20.     if (! (cp = malloc ((unsigned) strlen (s) + 1)))
  21.         return ((char *) 0);
  22.  
  23.     return (strcpy (cp, s));
  24. }
  25.  
  26. void    entry (name, pwent)
  27. char    *name;
  28. struct    passwd    *pwent;
  29. {
  30.     FILE    *pwd;
  31.     struct    passwd    *passwd;
  32. #ifdef    SHADOWPWD
  33.     struct    spwd    *spwd;
  34.     char    *l64a ();
  35. #endif
  36.     char    *cp;
  37.  
  38.     if ((pwd = fopen (PWDFILE, "r")) == (FILE *) 0) {
  39.         pwent->pw_passwd = (char *) 0;
  40.         return;
  41.     }
  42.     while (passwd = fgetpwent (pwd)) {
  43.         if (strcmp (name, passwd->pw_name) == 0)
  44.             break;
  45.     }
  46.     fclose (pwd);
  47.  
  48.     if (passwd == (struct passwd *) 0) {
  49.         pwent->pw_name = (char *) 0;
  50.         pwent->pw_passwd = (char *) 0;
  51.     } else  {
  52.         pwent->pw_name = strdup (passwd->pw_name);
  53.         pwent->pw_uid = passwd->pw_uid;
  54.         pwent->pw_gid = passwd->pw_gid;
  55.         pwent->pw_comment = (char *) 0;
  56.         pwent->pw_gecos = strdup (passwd->pw_gecos);
  57.         pwent->pw_dir = strdup (passwd->pw_dir);
  58.         pwent->pw_shell = strdup (passwd->pw_shell);
  59. #ifdef    SHADOWPWD
  60.         setspent ();
  61.         if (spwd = getspnam (name)) {
  62.             pwent->pw_passwd = strdup (spwd->sp_pwdp);
  63.             if (spwd->sp_lstchg == 0) {
  64.                 pwent->pw_age = (char *) 0;
  65.                 endspent ();
  66.                 return;
  67.             }
  68.             pwent->pw_age = malloc (5);
  69.             pwent->pw_age[0] = i64c (spwd->sp_max / 7);
  70.             pwent->pw_age[1] = i64c (spwd->sp_min / 7);
  71.             cp = l64a (spwd->sp_lstchg / 7);
  72.             pwent->pw_age[2] = cp[0];
  73.             pwent->pw_age[3] = cp[1];
  74.             pwent->pw_age[4] = '\0';
  75.             endspent ();
  76.             return;
  77.         }
  78.         endspent ();
  79.         passwd->pw_age = pwent->pw_age = (char *) 0;
  80. #endif
  81.         if (passwd->pw_passwd)
  82.             pwent->pw_passwd = strdup (passwd->pw_passwd);
  83.  
  84.         if (passwd->pw_age) {
  85.             pwent->pw_age = malloc (5);    /* longest legal time */
  86.             (void) strncpy (pwent->pw_age, passwd->pw_age, 5);
  87.         } else
  88.             pwent->pw_age = (char *) 0;
  89.     }
  90. }
  91.