home *** CD-ROM | disk | FTP | other *** search
- #ifdef __STDC__
- static char sccs_id[] = "@(#) getpw.c 2.1 " __DATE__ " HJR";
- #else
- static char sccs_id[] = "@(#) getpw.c 2.1 11/08/90 HJR";
- #endif
-
- /* getpw.c (c) Copyright 1990 H.Rogers */
-
- /* #define P_TEST */
-
- /* test main() */
-
- #include <stdio.h>
- #include <string.h>
-
- #ifdef __STDC__
- #include <stdlib.h>
- #else
- extern int exit ();
- extern int atoi ();
- #endif
-
- #include "pwd.h"
-
- #ifdef __STDC__
- static void p_pdecode (char *, struct passwd *);
- static char *p_pstrcp (char **);
- #else
- static void p_pdecode ();
- static char *p_pstrcp ();
- #endif
-
- #define PBUFSIZ 256 /* max. length of a line in /etc/passwd */
-
- static char *p_buf = 0;
- static FILE *p_pwfile = 0;
- static struct passwd p_rval[1];
- static char *pwfile = "/etc/passwd";
-
- /* getpwent() */
-
- #ifdef __STDC__
- struct passwd *
- getpwent (void)
- #else
- struct passwd *
- getpwent ()
- #endif
- {
- if (!p_pwfile)
- if (setpwfile (pwfile) < 0)
- return (0);
- return (fgetpwent (p_pwfile));
- }
-
- /* fgetpwent() */
-
- #ifdef __STDC__
- struct passwd *
- fgetpwent (register FILE * pfile)
- #else
- struct passwd *
- fgetpwent (pfile)
- register FILE *pfile;
- #endif
- {
- register char *bp;
-
- if (!pfile)
- return (0);
-
- if (!p_buf)
- if (!(p_buf = malloc (PBUFSIZ)))
- return (0);
- if (!fgets (p_buf, 1024, pfile))
- return (0);
- bp = p_buf;
- while (*bp)
- bp++;
- if (*--bp != '\n')
- return (0);
- *bp = 0;
- p_pdecode (p_buf, p_rval);
- return (p_rval);
- }
-
- /* getpwuid() */
-
- #ifdef __STDC__
- struct passwd *
- getpwuid (register int uid)
- #else
- struct passwd *
- getpwuid (uid)
- register int uid;
- #endif
- {
- if (setpwent () < 0)
- return (0);
- while (fgetpwent (p_pwfile))
- if (p_rval->pw_uid == uid)
- return (p_rval);
- return (0);
- }
-
- /* getpwnam() */
-
- #ifdef __STDC__
- struct passwd *
- getpwnam (register char *name)
- #else
- struct passwd *
- getpwnam (name)
- register char *name;
- #endif
- {
- if (!(name ? *name : 0))
- return (0);
- if (setpwent () < 0)
- return (0);
- while (fgetpwent (p_pwfile))
- if (!strcmp (p_rval->pw_name, name) && p_rval->pw_name)
- return (p_rval);
- return (0);
- }
-
- /* setpwent() */
-
- #ifdef __STDC__
- int
- setpwent (void)
- #else
- int
- setpwent ()
- #endif
- {
- if (!p_pwfile)
- if (setpwfile (pwfile) < 0)
- return (-1);
- return (fseek (p_pwfile, 0L, 0) ? -1 : 0);
- }
-
- /* endpwent() */
-
- #ifdef __STDC__
- int
- endpwent (void)
- #else
- int
- endpwent ()
- #endif
- {
- if (!p_pwfile)
- return (-1); /* 0 ? */
- if (fclose (p_pwfile))
- return (-1);
- p_pwfile = 0;
- return (0);
- }
-
- /* setpwfile() */
-
- #ifdef __STDC__
- int
- setpwfile (char *name)
- #else
- int
- setpwfile (name)
- char *name;
- #endif
- {
- if (!(name ? *name : 0))
- return (-1); /* 0 ? */
- if (p_pwfile)
- {
- fclose (p_pwfile);
- p_pwfile = 0;
- }
- return ((p_pwfile = fopen (name, "r")) ? 0 : -1);
- }
-
- /* p_pdecode() */
-
- #ifdef __STDC__
- static void
- p_pdecode (register char *line, register struct passwd *passwd)
- #else
- static void
- p_pdecode (line, passwd)
- register char *line;
- register struct passwd *passwd;
- #endif
- {
- char *lp;
-
- if ((!line) || (!passwd))
- return;
-
- lp = line;
-
- passwd->pw_name = p_pstrcp (&lp);
- passwd->pw_passwd = p_pstrcp (&lp);
- passwd->pw_uid = atoi (p_pstrcp (&lp));
- passwd->pw_gid = atoi (p_pstrcp (&lp));
- passwd->pw_quota = 0;
- passwd->pw_comment = 0;
- passwd->pw_gecos = p_pstrcp (&lp);
- passwd->pw_dir = p_pstrcp (&lp);
- passwd->pw_shell = p_pstrcp (&lp);
- }
-
- /* p_pstrcp() */
-
- #ifdef __STDC__
- static char *
- p_pstrcp (register char **lp)
- #else
- static char *
- p_pstrcp (lp)
- register char **lp;
- #endif
- {
- register char *l = *lp, *r = l;
-
- while ((*l != ':') && *l)
- l++;
- if (*l)
- *l++ = 0;
- *lp = l;
- return (r);
- }
-
- #ifdef P_TEST
-
- /* main() */
-
- #ifdef __STDC__
- int
- main (int argc, char **argv)
- #else
- int
- main (argc, argv)
- int argc;
- char **argv;
- #endif
- {
- struct passwd *p;
-
- if (argc != 2)
- {
- fprintf (stderr, "usage: getpw user\n");
- exit (1);
- }
-
- if (!(p = getpwnam (argv[1])))
- {
- printf ("getpw: %s not found\n", argv[1]);
- exit (1);
- }
-
- printf ("name:\t%s\n", p->pw_name);
- printf ("passwd:\t%s\n", p->pw_passwd);
- printf ("uid:\t%d\n", p->pw_uid);
- printf ("gid:\t%d\n", p->pw_gid);
- printf ("gecos:\t%s\n", p->pw_gecos);
- printf ("dir:\t%s\n", p->pw_dir);
- printf ("shell:\t%s\n", p->pw_shell);
- }
-
- #endif /* P_TEST */
-