summaryrefslogtreecommitdiff
path: root/app/xterm/xstrings.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/xterm/xstrings.c')
-rw-r--r--app/xterm/xstrings.c89
1 files changed, 49 insertions, 40 deletions
diff --git a/app/xterm/xstrings.c b/app/xterm/xstrings.c
index 5fe083536..395def5ab 100644
--- a/app/xterm/xstrings.c
+++ b/app/xterm/xstrings.c
@@ -1,7 +1,7 @@
-/* $XTermId: xstrings.c,v 1.47 2011/09/11 20:20:12 tom Exp $ */
+/* $XTermId: xstrings.c,v 1.50 2012/03/30 10:54:12 tom Exp $ */
/*
- * Copyright 2000-2010,2011 by Thomas E. Dickey
+ * Copyright 2000-2011,2012 by Thomas E. Dickey
*
* All Rights Reserved
*
@@ -141,42 +141,21 @@ x_encode_hex(const char *source)
char *
x_getenv(const char *name)
{
- return x_strdup(x_nonempty(getenv(name)));
+ char *result;
+ result = x_strdup(x_nonempty(getenv(name)));
+ TRACE2(("getenv(%s) %s\n", name, result));
+ return result;
}
-/*
- * Call this with in_out pointing to data filled in by x_getpwnam() or by
- * x_getpwnam(). It finds the user's logon name, if possible. As a side
- * effect, it updates in_out to fill in possibly more-relevant data, i.e.,
- * in case there is more than one alias for the same uid.
- */
-char *
-x_getlogin(uid_t uid, struct passwd *in_out)
+static char *
+login_alias(char *login_name, uid_t uid, struct passwd *in_out)
{
- char *login_name = NULL;
-
-#ifdef HAVE_GETLOGIN
- login_name = getlogin();
-#endif
-
- /*
- * Of course getlogin() will fail if we're started from a window-manager,
- * since there's no controlling terminal to fuss with. In that case, try
- * to get something useful from the user's $LOGNAME or $USER environment
- * variables.
- */
- if (login_name == NULL) {
- login_name = x_getenv("LOGNAME");
- if (login_name == NULL)
- login_name = x_getenv("USER");
- }
-
/*
* If the logon-name differs from the value we get by looking in the
* password file, check if it does correspond to the same uid. If so,
* allow that as an alias for the uid.
*/
- if (login_name != NULL
+ if (!IsEmpty(login_name)
&& strcmp(login_name, in_out->pw_name)) {
struct passwd pw2;
@@ -184,23 +163,52 @@ x_getlogin(uid_t uid, struct passwd *in_out)
uid_t uid2 = pw2.pw_uid;
struct passwd pw3;
- if (!x_getpwuid(uid, &pw3)
- || (uid_t) pw3.pw_uid != uid2) {
- login_name = NULL;
- } else {
+ if (x_getpwuid(uid, &pw3)
+ && ((uid_t) pw3.pw_uid == uid2)) {
/* use the other passwd-data including shell */
alloc_pw(in_out, &pw2);
+ } else {
+ login_name = NULL;
}
- } else {
- (void) x_getpwuid(uid, in_out);
}
}
+ return login_name;
+}
+
+/*
+ * Call this with in_out pointing to data filled in by x_getpwnam() or by
+ * x_getpwnam(). It finds the user's logon name, if possible. As a side
+ * effect, it updates in_out to fill in possibly more-relevant data, i.e.,
+ * in case there is more than one alias for the same uid.
+ */
+char *
+x_getlogin(uid_t uid, struct passwd *in_out)
+{
+ char *login_name = NULL;
+
+ login_name = login_alias(x_getenv("LOGNAME"), uid, in_out);
+ if (IsEmpty(login_name)) {
+ login_name = login_alias(x_getenv("USER"), uid, in_out);
+ }
+#ifdef HAVE_GETLOGIN
+ /*
+ * Of course getlogin() will fail if we're started from a window-manager,
+ * since there's no controlling terminal to fuss with. For that reason, we
+ * tried first to get something useful from the user's $LOGNAME or $USER
+ * environment variables.
+ */
+ if (IsEmpty(login_name)) {
+ TRACE2(("...try getlogin\n"));
+ login_name = login_alias(getlogin(), uid, in_out);
+ }
+#endif
- if (login_name == NULL)
+ if (IsEmpty(login_name))
login_name = in_out->pw_name;
- if (login_name != NULL)
+ if (!IsEmpty(login_name))
login_name = x_strdup(login_name);
+ TRACE2(("x_getloginid ->%s\n", NonNull(login_name)));
return login_name;
}
@@ -214,7 +222,7 @@ x_getpwnam(const char *name, struct passwd * result)
struct passwd *ptr = getpwnam(name);
Boolean code;
- if (OkPasswd(ptr)) {
+ if (ptr != 0 && OkPasswd(ptr)) {
code = True;
alloc_pw(result, ptr);
} else {
@@ -234,13 +242,14 @@ x_getpwuid(uid_t uid, struct passwd * result)
struct passwd *ptr = getpwuid((uid_t) uid);
Boolean code;
- if (OkPasswd(ptr)) {
+ if (ptr != 0 && OkPasswd(ptr)) {
code = True;
alloc_pw(result, ptr);
} else {
code = False;
memset(result, 0, sizeof(*result));
}
+ TRACE2(("x_getpwuid(%d) %d\n", (int) uid, (int) code));
return code;
}