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 | |||
---|---|---|---|
|
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 getpwnam_r
() and
getpwuid_r
() functions obtain
the same information, but store the retrieved passwd structure in the space pointed to
by pwd
. This
passwd structure contains
pointers to strings, and these strings 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 passwd 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
; /* real name */char * pw_dir
; /* home directory */char * pw_shell
; /* shell program */};
The maximum needed size 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.
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.24 of the Linux man-pages
project. A
description of the project, and information about reporting
bugs, can be found at
http://www.kernel.org/doc/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(). |