lib/pwdutils: add xgetlogin()
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
032d759a10
commit
1742c8d84c
|
@ -5,6 +5,7 @@
|
|||
#include <pwd.h>
|
||||
|
||||
extern struct passwd *xgetpwnam(const char *username, char **pwdbuf);
|
||||
extern char *xgetlogin(void);
|
||||
|
||||
#endif /* UTIL_LINUX_PWDUTILS_H */
|
||||
|
||||
|
|
|
@ -36,11 +36,39 @@ failed:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
char *xgetlogin(void)
|
||||
{
|
||||
struct passwd *pw = NULL;
|
||||
uid_t ruid;
|
||||
char *user;
|
||||
|
||||
user = getlogin();
|
||||
if (user)
|
||||
return xstrdup(user);
|
||||
|
||||
/* GNU Hurd implementation has an extension where a process can exist in a
|
||||
* non-conforming environment, and thus be outside the realms of POSIX
|
||||
* process identifiers; on this platform, getuid() fails with a status of
|
||||
* (uid_t)(-1) and sets errno if a program is run from a non-conforming
|
||||
* environment.
|
||||
*
|
||||
* http://austingroupbugs.net/view.php?id=511
|
||||
*/
|
||||
errno = 0;
|
||||
ruid = getuid();
|
||||
|
||||
if (errno == 0)
|
||||
pw = getpwuid(ruid);
|
||||
if (pw && pw->pw_name && *pw->pw_name)
|
||||
return xstrdup(pw->pw_name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef TEST_PROGRAM
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char *pwdbuf = NULL;
|
||||
char *buf = NULL;
|
||||
struct passwd *pwd = NULL;
|
||||
|
||||
if (argc != 2) {
|
||||
|
@ -48,7 +76,7 @@ int main(int argc, char *argv[])
|
|||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
pwd = xgetpwnam(argv[1], &pwdbuf);
|
||||
pwd = xgetpwnam(argv[1], &buf);
|
||||
if (!pwd)
|
||||
err(EXIT_FAILURE, "failed to get %s pwd entry", argv[1]);
|
||||
|
||||
|
@ -58,7 +86,11 @@ int main(int argc, char *argv[])
|
|||
printf("GECO: %s\n", pwd->pw_gecos);
|
||||
|
||||
free(pwd);
|
||||
free(pwdbuf);
|
||||
free(buf);
|
||||
|
||||
printf("Current: %s\n", (buf = xgetlogin()));
|
||||
free(buf);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
#endif /* TEST_PROGRAM */
|
||||
|
|
Loading…
Reference in New Issue