NAME |LIBRARY |SYNOPSIS |DESCRIPTION |RETURN VALUE |ERRORS |FILES |ATTRIBUTES |VERSIONS |STANDARDS |HISTORY |NOTES |EXAMPLES |SEE ALSO |COLOPHON | |
getpwnam(3) Library Functions Manualgetpwnam(3)getpwnam, getpwnam_r, getpwuid, getpwuid_r - get password file entry
Standard C library (libc,-lc)
#include <sys/types.h>#include <pwd.h>struct passwd *getpwnam(const char *name);struct passwd *getpwuid(uid_tuid);int getpwnam_r(size_t size;const char *restrictname, struct passwd *restrictpwd,charbuf[restrictsize], size_tsize,struct passwd **restrictresult);int getpwuid_r(size_t size;uid_tuid, struct passwd *restrictpwd,charbuf[restrictsize], size_tsize,struct passwd **restrictresult); Feature Test Macro Requirements for glibc (seefeature_test_macros(7)):getpwnam_r(),getpwuid_r(): _POSIX_C_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
Thegetpwnam() 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 usernamename. Thegetpwuid() function returns a pointer to a structure containing the broken-out fields of the record in the password database that matches the user IDuid. Thepasswd structure is defined in<pwd.h> as follows: struct passwd { char *pw_name; /* username */ char *pw_passwd; /* user password */ uid_t pw_uid; /* user ID */ gid_t pw_gid; /* group ID */ char *pw_gecos; /* user information */ char *pw_dir; /* home directory */ char *pw_shell; /* shell program */ }; Seepasswd(5) for more information about these fields. Thegetpwnam_r() andgetpwuid_r() functions obtain the same information asgetpwnam() andgetpwuid(), but store the retrievedpasswd structure in the space pointed to bypwd. The string fields pointed to by the members of thepasswd structure are stored in the bufferbuf of sizesize. 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 call sysconf(_SC_GETPW_R_SIZE_MAX) returns either -1, without changingerrno, or an initial suggested size forbuf. (If this size is too small, the call fails withERANGE, in which case the caller can retry with a larger buffer.)Thegetpwnam() andgetpwuid() functions return a pointer to apasswd structure, or NULL if the matching entry is not found or an error occurs. If an error occurs,errno is set to indicate the error. If one wants to checkerrno 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 togetpwent(3),getpwnam(), orgetpwuid(). (Do not pass the returned pointer tofree(3).) On success,getpwnam_r() andgetpwuid_r() return zero, and set*result topwd. 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.
0orENOENTorESRCHorEBADForEPERMor ... The givenname oruid was not found.EINTRA signal was caught; seesignal(7).EIOI/O error.EMFILEThe per-process limit on the number of open file descriptors has been reached.ENFILEThe system-wide limit on the total number of open files has been reached.ENOMEMInsufficient memory to allocatepasswd structure.ERANGEInsufficient buffer space supplied.
/etc/passwd local password database file
For an explanation of the terms used in this section, seeattributes(7). ┌───────────────┬───────────────┬────────────────────────────────┐ │Interface│Attribute│Value│ ├───────────────┼───────────────┼────────────────────────────────┤ │getpwnam() │ Thread safety │ MT-Unsafe race:pwnam locale │ ├───────────────┼───────────────┼────────────────────────────────┤ │getpwuid() │ Thread safety │ MT-Unsafe race:pwuid locale │ ├───────────────┼───────────────┼────────────────────────────────┤ │getpwnam_r(), │ Thread safety │ MT-Safe locale │ │getpwuid_r() │ │ │ └───────────────┴───────────────┴────────────────────────────────┘
Thepw_gecos field is not specified in POSIX, but is present on most implementations.
POSIX.1-2008.
POSIX.1-2001, SVr4, 4.3BSD.
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 valueerrno might have in this situation. But that makes it impossible to recognize errors. One might argue that according to POSIXerrno 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. Thepw_dir field contains the name of the initial working directory of the user. Login programs use the value of this field to initialize theHOMEenvironment variable for the login shell. An application that wants to determine its user's home directory should inspect the value ofHOME(rather than the valuegetpwuid(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 usegetpwnam("username")->pw_dir or similar. The program below demonstrates the use ofgetpwnam_r() to find the full username and user ID for the username supplied as a command- line argument. #include <errno.h> #include <pwd.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { struct passwd pwd; struct passwd *result; char *buf; long 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: %jd\n", pwd.pw_gecos, (intmax_t) 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 theman-pages (Linux kernel and C library user-space interface documentation) project. Information about the project can be found at ⟨https://www.kernel.org/doc/man-pages/⟩. If you have a bug report for this manual page, see ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩. This page was obtained from the tarball man-pages-6.15.tar.gz fetched from ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ on 2025-08-11. If you discover any rendering problems in this HTML version of the page, or you believe there is a better or more up- to-date source for the page, or you have corrections or improvements to the information in this COLOPHON (which isnot part of the original manual page), send a mail to man-pages@man7.orgLinux man-pages 6.15 2025-06-28getpwnam(3)Pages that refer to this page:capsh(1), getent(1), gitweb(1), strace(1), chown(2), fgetpwent(3), getgrent_r(3), getgrnam(3), getpw(3), getpwent(3), getpwent_r(3), getspnam(3), getutent(3), id_t(3type), pmsetprocessidentity(3), putpwent(3), org.freedesktop.home1(5), passwd(5), passwd(5@@shadow-utils), nscd(8), sulogin(8)
HTML rendering created 2025-09-06 byMichael Kerrisk, author ofThe Linux Programming Interface. For details of in-depthLinux/UNIX system programming training courses that I teach, lookhere. Hosting byjambit GmbH. | ![]() |