lib/pwdutils: add xgetlogin()

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2016-10-14 15:02:01 +02:00
parent 032d759a10
commit 1742c8d84c
2 changed files with 36 additions and 3 deletions

View File

@ -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 */

View File

@ -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 */