From 19da58be2d9359a9641381feb559be0b918ef710 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 22:46:53 +0200 Subject: Adding upstream version 1:4.13+dfsg1. Signed-off-by: Daniel Baumann --- libmisc/myname.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 libmisc/myname.c (limited to 'libmisc/myname.c') diff --git a/libmisc/myname.c b/libmisc/myname.c new file mode 100644 index 0000000..1b02617 --- /dev/null +++ b/libmisc/myname.c @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 1996 - 1997, Marek Michałkiewicz + * SPDX-FileCopyrightText: 2003 - 2005, Tomasz Kłoczko + * SPDX-FileCopyrightText: 2007 - 2009, Nicolas François + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * myname.c - determine the current username and get the passwd entry + * + */ + +#include + +#ident "$Id$" + +#include "defines.h" +#include +#include "prototypes.h" +/*@null@*/ /*@only@*/struct passwd *get_my_pwent (void) +{ + struct passwd *pw; + const char *cp = getlogin (); + uid_t ruid = getuid (); + + /* + * Try getlogin() first - if it fails or returns a non-existent + * username, or a username which doesn't match the real UID, fall + * back to getpwuid(getuid()). This should work reasonably with + * usernames longer than the utmp limit (8 characters), as well as + * shared UIDs - but not both at the same time... + * + * XXX - when running from su, will return the current user (not + * the original user, like getlogin() does). Does this matter? + */ + if ((NULL != cp) && ('\0' != *cp)) { + pw = xgetpwnam (cp); + if ((NULL != pw) && (pw->pw_uid == ruid)) { + return pw; + } + if (NULL != pw) { + pw_free (pw); + } + } + + return xgetpwuid (ruid); +} + -- cgit v1.2.3