getpwnam, getpwnam_r, getpwuid, getpwuid_r — get password file entry
#include <sys/types.h> #include <pwd.h>
| struct passwd
            *getpwnam( | const char *name ); | 
| struct passwd
            *getpwuid( | uid_t uid ); | 
| int
            getpwnam_r( | const char *name, | 
| struct passwd *pwd, | |
| char *buf, | |
| size_t buflen, | |
| struct passwd **result ); | 
| int
            getpwuid_r( | uid_t uid, | 
| struct passwd *pwd, | |
| char *buf, | |
| size_t buflen, | |
| struct passwd **result ); | 
| ![[Note]](../stylesheet/note.png) | Note | ||
|---|---|---|---|
| 
 | 
The getpwnam() function
      returns a pointer to a structure containing the broken-out
      fields of the record in the password database (e.g., the
      local password file /etc/passwd, NIS, and LDAP) that matches
      the username name.
The getpwuid() function
      returns a pointer to a structure containing the broken-out
      fields of the record in the password database that matches
      the user ID uid.
The passwd structure is
      defined in <pwd.h> as
      follows:
struct passwd { char * pw_name;char * pw_passwd;uid_t pw_uid;gid_t pw_gid;char * pw_gecos;char * pw_dir;char * pw_shell;}; 
See passwd(5) for more information about these fields.
The getpwnam_r() and
      getpwuid_r() functions obtain
      the same information as getpwnam() and getpwuid(), but store the retrieved
      passwd structure in the space
      pointed to by pwd.
      The string fields pointed to by the members of the
      passwd structure are stored
      in the buffer buf of
      size buflen. A
      pointer to the result (in case of success) or NULL (in case
      no entry was found or an error occurred) is stored in
      *result.
The maximum size needed for buf can be found using
      sysconf(3) with the
      argument _SC_GETPW_R_SIZE_MAX.
The getpwnam() and
      getpwuid() functions return a
      pointer to a passwd
      structure, or NULL if the matching entry is not found or an
      error occurs. If an error occurs, errno is set appropriately. If one wants to
      check errno after the call, it
      should be set to zero before the call.
The return value may point to a static area, and may be
      overwritten by subsequent calls to getpwent(3), getpwnam(), or getpwuid(). (Do not pass the returned
      pointer to free(3).)
On success, getpwnam_r() and
      getpwuid_r() return zero, and
      set *result to
      pwd. If no matching
      password record was found, these functions return 0 and store
      NULL in *result. In
      case of error, an error number is returned, and NULL is
      stored in *result.
0 or
          ENOENT or ESRCH or EBADF or EPERM or ...The given name or uid was not found.
A signal was caught.
I/O error.
The maximum number (OPEN_MAX) of files was open already
            in the calling process.
The maximum number of files was open already in the system.
Insufficient memory to allocate passwd structure.
Insufficient buffer space supplied.
SVr4, 4.3BSD, POSIX.1-2001. The pw_gecos field is not specified
      in POSIX, but is present on most implementations.
The formulation given above under "RETURN VALUE" is from
      POSIX.1-2001. It does not call "not found" an error, and
      hence does not specify what value errno might have in this situation. But that
      makes it impossible to recognize errors. One might argue that
      according to POSIX errno should
      be left unchanged if an entry is not found. Experiments on
      various UNIX-like systems show that lots of different values
      occur in this situation: 0, ENOENT, EBADF, ESRCH,
      EWOULDBLOCK, EPERM and probably others.
The pw_dir field
      contains the name of the initial working directory of the
      user. Login programs use the value of this field to
      initialize the HOME environment
      variable for the login shell. An application that wants to
      determine its user's home directory should inspect the value
      of HOME (rather than the value
      getpwuid(getuid())−>pw_dir) since this
      allows the user to modify their notion of "the home
      directory" during a login session. To determine the (initial)
      home directory of another user, it is necessary to use
      getpwnam("username")−>pw_dir
      or similar.
The program below demonstrates the use of getpwnam_r() to find the full username and
      user ID for the username supplied as a command-line
      argument.
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int
main(int argc, char *argv[])
{
    struct passwd pwd;
    struct passwd *result;
    char *buf;
    size_t bufsize;
    int s;
    if (argc != 2) {
        fprintf(stderr, "Usage: %s username\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    if (bufsize == −1)          /* Value was indeterminate */
        bufsize = 16384;        /* Should be more than enough */
    buf = malloc(bufsize);
    if (buf == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    s = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
    if (result == NULL) {
        if (s == 0)
            printf("Not found\n");
        else {
            errno = s;
            perror("getpwnam_r");
        }
        exit(EXIT_FAILURE);
    }
    printf("Name: %s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);
    exit(EXIT_SUCCESS);
}
      endpwent(3), fgetpwent(3), getgrnam(3), getpw(3), getpwent(3), getspnam(3), putpwent(3), setpwent(3), passwd(5)
This page is part of release 3.33 of the Linux man-pages project. A
      description of the project, and information about reporting
      bugs, can be found at http://man7.org/linux/man-pages/.
| Copyright 1993 David Metcalfe (davidprism.demon.co.uk) and Copyright 2008, Linux Foundation, written by Michael Kerrisk <mtk.manpagesgmail.com> Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. References consulted: Linux libc source code Lewine's "POSIX Programmer's Guide" (O'Reilly & Associates, 1991) 386BSD man pages Modified 1993-07-24 by Rik Faith (faithcs.unc.edu) Modified 1996-05-27 by Martin Schulze (joeylinux.de) Modified 2003-11-15 by aeb 2008-11-07, mtk, Added an example program for getpwnam_r(). |