home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / c / getpw < prev    next >
Text File  |  1994-03-08  |  4KB  |  271 lines

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) getpw.c 2.1 " __DATE__ " HJR";
  3. #else
  4. static char sccs_id[] = "@(#) getpw.c 2.1 11/08/90 HJR";
  5. #endif
  6.  
  7. /* getpw.c (c) Copyright 1990 H.Rogers */
  8.  
  9. /* #define P_TEST */
  10.  
  11. /* test main() */
  12.  
  13. #include <stdio.h>
  14. #include <string.h>
  15.  
  16. #ifdef __STDC__
  17. #include <stdlib.h>
  18. #else
  19. extern int exit ();
  20. extern int atoi ();
  21. #endif
  22.  
  23. #include "pwd.h"
  24.  
  25. #ifdef __STDC__
  26. static void p_pdecode (char *, struct passwd *);
  27. static char *p_pstrcp (char **);
  28. #else
  29. static void p_pdecode ();
  30. static char *p_pstrcp ();
  31. #endif
  32.  
  33. #define PBUFSIZ 256        /* max. length of a line in /etc/passwd */
  34.  
  35. static char *p_buf = 0;
  36. static FILE *p_pwfile = 0;
  37. static struct passwd p_rval[1];
  38. static char *pwfile = "/etc/passwd";
  39.  
  40. /* getpwent() */
  41.  
  42. #ifdef __STDC__
  43. struct passwd *
  44. getpwent (void)
  45. #else
  46. struct passwd *
  47. getpwent ()
  48. #endif
  49. {
  50.   if (!p_pwfile)
  51.     if (setpwfile (pwfile) < 0)
  52.       return (0);
  53.   return (fgetpwent (p_pwfile));
  54. }
  55.  
  56. /* fgetpwent() */
  57.  
  58. #ifdef __STDC__
  59. struct passwd *
  60. fgetpwent (register FILE * pfile)
  61. #else
  62. struct passwd *
  63. fgetpwent (pfile)
  64.      register FILE *pfile;
  65. #endif
  66. {
  67.   register char *bp;
  68.  
  69.   if (!pfile)
  70.     return (0);
  71.  
  72.   if (!p_buf)
  73.     if (!(p_buf = malloc (PBUFSIZ)))
  74.       return (0);
  75.   if (!fgets (p_buf, 1024, pfile))
  76.     return (0);
  77.   bp = p_buf;
  78.   while (*bp)
  79.     bp++;
  80.   if (*--bp != '\n')
  81.     return (0);
  82.   *bp = 0;
  83.   p_pdecode (p_buf, p_rval);
  84.   return (p_rval);
  85. }
  86.  
  87. /* getpwuid() */
  88.  
  89. #ifdef __STDC__
  90. struct passwd *
  91. getpwuid (register int uid)
  92. #else
  93. struct passwd *
  94. getpwuid (uid)
  95.      register int uid;
  96. #endif
  97. {
  98.   if (setpwent () < 0)
  99.     return (0);
  100.   while (fgetpwent (p_pwfile))
  101.     if (p_rval->pw_uid == uid)
  102.       return (p_rval);
  103.   return (0);
  104. }
  105.  
  106. /* getpwnam() */
  107.  
  108. #ifdef __STDC__
  109. struct passwd *
  110. getpwnam (register char *name)
  111. #else
  112. struct passwd *
  113. getpwnam (name)
  114.      register char *name;
  115. #endif
  116. {
  117.   if (!(name ? *name : 0))
  118.     return (0);
  119.   if (setpwent () < 0)
  120.     return (0);
  121.   while (fgetpwent (p_pwfile))
  122.     if (!strcmp (p_rval->pw_name, name) && p_rval->pw_name)
  123.       return (p_rval);
  124.   return (0);
  125. }
  126.  
  127. /* setpwent() */
  128.  
  129. #ifdef __STDC__
  130. int
  131. setpwent (void)
  132. #else
  133. int
  134. setpwent ()
  135. #endif
  136. {
  137.   if (!p_pwfile)
  138.     if (setpwfile (pwfile) < 0)
  139.       return (-1);
  140.   return (fseek (p_pwfile, 0L, 0) ? -1 : 0);
  141. }
  142.  
  143. /* endpwent() */
  144.  
  145. #ifdef __STDC__
  146. int
  147. endpwent (void)
  148. #else
  149. int
  150. endpwent ()
  151. #endif
  152. {
  153.   if (!p_pwfile)
  154.     return (-1);        /* 0 ? */
  155.   if (fclose (p_pwfile))
  156.     return (-1);
  157.   p_pwfile = 0;
  158.   return (0);
  159. }
  160.  
  161. /* setpwfile() */
  162.  
  163. #ifdef __STDC__
  164. int
  165. setpwfile (char *name)
  166. #else
  167. int
  168. setpwfile (name)
  169.      char *name;
  170. #endif
  171. {
  172.   if (!(name ? *name : 0))
  173.     return (-1);        /* 0 ? */
  174.   if (p_pwfile)
  175.     {
  176.       fclose (p_pwfile);
  177.       p_pwfile = 0;
  178.     }
  179.   return ((p_pwfile = fopen (name, "r")) ? 0 : -1);
  180. }
  181.  
  182. /* p_pdecode() */
  183.  
  184. #ifdef __STDC__
  185. static void
  186. p_pdecode (register char *line, register struct passwd *passwd)
  187. #else
  188. static void
  189. p_pdecode (line, passwd)
  190.      register char *line;
  191.      register struct passwd *passwd;
  192. #endif
  193. {
  194.   char *lp;
  195.  
  196.   if ((!line) || (!passwd))
  197.     return;
  198.  
  199.   lp = line;
  200.  
  201.   passwd->pw_name = p_pstrcp (&lp);
  202.   passwd->pw_passwd = p_pstrcp (&lp);
  203.   passwd->pw_uid = atoi (p_pstrcp (&lp));
  204.   passwd->pw_gid = atoi (p_pstrcp (&lp));
  205.   passwd->pw_quota = 0;
  206.   passwd->pw_comment = 0;
  207.   passwd->pw_gecos = p_pstrcp (&lp);
  208.   passwd->pw_dir = p_pstrcp (&lp);
  209.   passwd->pw_shell = p_pstrcp (&lp);
  210. }
  211.  
  212. /* p_pstrcp() */
  213.  
  214. #ifdef __STDC__
  215. static char *
  216. p_pstrcp (register char **lp)
  217. #else
  218. static char *
  219. p_pstrcp (lp)
  220.      register char **lp;
  221. #endif
  222. {
  223.   register char *l = *lp, *r = l;
  224.  
  225.   while ((*l != ':') && *l)
  226.     l++;
  227.   if (*l)
  228.     *l++ = 0;
  229.   *lp = l;
  230.   return (r);
  231. }
  232.  
  233. #ifdef P_TEST
  234.  
  235. /* main() */
  236.  
  237. #ifdef __STDC__
  238. int
  239. main (int argc, char **argv)
  240. #else
  241. int
  242. main (argc, argv)
  243.      int argc;
  244.      char **argv;
  245. #endif
  246. {
  247.   struct passwd *p;
  248.  
  249.   if (argc != 2)
  250.     {
  251.       fprintf (stderr, "usage: getpw user\n");
  252.       exit (1);
  253.     }
  254.  
  255.   if (!(p = getpwnam (argv[1])))
  256.     {
  257.       printf ("getpw: %s not found\n", argv[1]);
  258.       exit (1);
  259.     }
  260.  
  261.   printf ("name:\t%s\n", p->pw_name);
  262.   printf ("passwd:\t%s\n", p->pw_passwd);
  263.   printf ("uid:\t%d\n", p->pw_uid);
  264.   printf ("gid:\t%d\n", p->pw_gid);
  265.   printf ("gecos:\t%s\n", p->pw_gecos);
  266.   printf ("dir:\t%s\n", p->pw_dir);
  267.   printf ("shell:\t%s\n", p->pw_shell);
  268. }
  269.  
  270. #endif /* P_TEST */
  271.