Mac Developer Library Developer


This manual page is part of Xcode Tools version 5.0

To obtain these tools:

If you are running a version of Xcode Tools other than 5.0, view the documentation locally:

  • In Xcode

  • In Terminal, using the man(1) command

Reading manual pages

Manual pages are intended as a quick reference for people who already understand a technology.

  • To learn how the manual is organized or to learn about command syntax, read the manual page for manpages(5).

  • For more information about this technology, look for other documentation in the Apple Developer Library.

  • For general information about writing shell scripts, read Shell Scripting Primer.

GETPWENT(3)              BSD Library Functions Manual              GETPWENT(3)

     getpwent, getpwnam, getpwnam_r, getpwuid, getpwuid_r, getpwuuid, getpwuuid_r, setpassent, setpwent,
     endpwent -- password database operations

     Standard C Library (libc, -lc)

     #include <sys/types.h>
     #include <pwd.h>
     #include <uuid/uuid.h>

     struct passwd *

     struct passwd *
     getpwnam(const char *login);

     getpwnam_r(const char *name, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result);

     struct passwd *
     getpwuid(uid_t uid);

     getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result);

     struct passwd *
     getpwuuid(uuid_t uuid);

     getpwuuid_r(uuid_t uuid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result);

     setpassent(int stayopen);



     These functions obtain information from opendirectoryd(8), including records in /etc/master.passwd
     which is described in master.passwd(5).  Each entry in the database is defined by the structure passwd
     found in the include file <pwd.h>:

           struct passwd {
                   char    *pw_name;       /* user name */
                   char    *pw_passwd;     /* encrypted password */
                   uid_t   pw_uid;         /* user uid */
                   gid_t   pw_gid;         /* user gid */
                   time_t  pw_change;      /* password change time */
                   char    *pw_class;      /* user access class */
                   char    *pw_gecos;      /* Honeywell login info */
                   char    *pw_dir;        /* home directory */
                   char    *pw_shell;      /* default shell */
                   time_t  pw_expire;      /* account expiration */
                   int     pw_fields;      /* internal: fields filled in */

     The functions getpwnam(), getpwuid(), and getpwuuid() search the password database for the given login
     name, user uid, or user uuid respectively, always returning the first one encountered.

     Note that the password file /etc/master.passwd does not contain user UUIDs.  The UUID for a user may be
     found using mbr_uid_to_uuid().

     On Mac OS X, these routines are thread-safe and return a pointer to a thread-specific data structure.
     The contents of this data structure are automatically released by subsequent calls to any of these rou-tines routines
     tines on the same thread, or when the thread exits.  These routines are therefore unsuitable for use in
     libraries or frameworks, from where they may overwrite the per-thread data that the calling application
     expects to find as a result of its own calls to these routines. Library and framework code should use
     the alternative reentrant variants detailed below.

     The getpwent() function sequentially reads the password database and is intended for programs that wish
     to process the complete list of users.

     The functions getpwnam_r(), getpwuid_r(), and getpwuuid_r() are alternative versions of getpwnam(),
     getpwuid(), and getpwuuid() respectively.  They store the results of their search in the caller-pro-vided caller-provided
     vided pwd structure, which additionally contains pointers to strings that are stored in the caller-pro-vided caller-provided
     vided buffer of size bufsize.  (The maximum required bufsize can be obtained by passing the
     _SC_GETPW_R_SIZE_MAX constant to the sysconf(3) call. See example code below.) When these functions are
     successful, the pwd argument will be filled in, and a pointer to that argument will be stored in the
     caller-provided result.  If an entry is not found or an error occurs, result will be set to NULL.

     The setpassent() function accomplishes two purposes.  First, it causes getpwent() to ``rewind'' to the
     beginning of the database.  Additionally, if stayopen is non-zero, file descriptors are left open, sig-nificantly significantly
     nificantly speeding up subsequent accesses for all of the routines.  (This latter functionality is
     unnecessary for getpwent() as it does not close its file descriptors by default.)

     It is dangerous for long-running programs to keep the file descriptors open as the database will become
     out of date if it is updated while the program is running.

     The setpwent() function is identical to setpassent() with an argument of zero.

     The endpwent() function closes any open files.

     These routines have been written to `shadow' the password of user records created on Mac OS X 10.3 or
     later, by returning a structure whose password field points to the string `********'.  Legacy crypt
     passwords are still returned for user records created on earlier versions of Mac OS X whose
     opendirectoryd(8) attribute contains the value `;basic;'.

     Note that opendirectoryd(8) allows user records from some sources which may not include all the compo-nent component
     nent fields present in a passwd structure.  Only the name, uid, and gid of a user record are required.
     Default values will be supplied as follows:

           pw_passwd = "*"
           pw_change = 0
           pw_class = ""
           pw_gecos = ""
           pw_dir = "/var/empty"
           pw_shell = "/usr/bin/false"
           pw_expire = 0

     The functions getpwent(), getpwnam(), getpwuid(), and getpwuuid() return a valid pointer to a passwd
     structure on success or NULL if the entry is not found or if an error occurs.  If an error does occur,
     errno will be set.  Note that programs must explicitly set errno to zero before calling any of these
     functions if they need to distinguish between a non-existent entry and an error.  The functions
     getpwnam_r(), getpwuid_r(), and getpwuuid_r() return 0 if no error occurred, or an error number to
     indicate failure.  It is not an error if a matching entry is not found.  (Thus, if result is NULL and
     the return value is 0, no matching entry exists.)

     The setpassent() function returns 0 on failure and 1 on success.  The endpwent() and setpwent() func-tions functions
     tions have no return value.

     To print the current user's home directory without depending on per-thread storage:

           #include <sys/types.h>
           #include <unistd.h>
           #include <stdlib.h>
           #include <stdio.h>
           #include <pwd.h>

           int bufsize;

           if ((bufsize = sysconf(_SC_GETPW_R_SIZE_MAX)) == -1)

           char buffer[bufsize];
           struct passwd pwd, *result = NULL;
           if (getpwuid_r(getuid(), &pwd, buffer, bufsize, &result) != 0 || !result)

           printf("%s\n", pwd.pw_dir);

     The secure password database file
     /etc/master.passwd  The current password file
     /etc/passwd         A Version 7 format password file

     These routines may fail for any of the errors specified in open(2), dbopen(3), socket(2), and
     connect(2), in addition to the following:

     [ERANGE]           The buffer specified by the buffer and bufsize arguments was insufficiently sized to
                        store the result.  The caller should retry with a larger buffer.

     getlogin(2), getgrent(3), passwd(5), mbr_uid_to_uuid(3,) opendirectoryd(8), yp(8)

     The getpwent(), getpwnam(), getpwnam_r(), getpwuid(), getpwuid_r(), setpwent(), and endpwent() func-tions functions
     tions conform to ISO/IEC 9945-1:1996 (``POSIX.1'').

     The getpwent(), getpwnam(), getpwuid(), setpwent(), and endpwent() functions appeared in Version 7 AT&T
     UNIX.  The setpassent() function appeared in 4.3BSD-Reno.  The getpwnam_r() and getpwuid_r() functions
     appeared in FreeBSD 5.1.  The functions getpwuuid() and getpwuuid_r() appeared in Mac OS X 10.8.

     The functions getpwent(), getpwnam(), getpwuid(), and getpwuuid(), leave their results in an internal
     thread-specific memory and return a pointer to that object.  Subsequent calls to the same function will
     modify the same object.

BSD                            October 26, 2011                            BSD

Reporting Problems

The way to report a problem with this manual page depends on the type of problem:

Content errors
Report errors in the content of this documentation with the feedback links below.
Bug reports
Report bugs in the functionality of the described tool or API through Bug Reporter.
Formatting problems
Report formatting mistakes in the online version of these pages with the feedback links below.