summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2019-02-15 12:22:49 +0200
committerEli Zaretskii <eliz@gnu.org>2019-02-15 12:22:49 +0200
commit4d00262a8ebd3c8a0f3679a710b6bb8657bf2ca1 (patch)
tree9d1111f1ccc258858856a38efd2dabe51577529b /src
parentc3f87efe3a73c2850f765773965b2440296b0666 (diff)
downloademacs-4d00262a8ebd3c8a0f3679a710b6bb8657bf2ca1.tar.gz
Support ~USER for some names on MS-Windows
* src/w32.c (getpwnam): Support usernames provided through LOGNAME or USERNAME environment variables, to mimic what editfns.c:init_editfns does.
Diffstat (limited to 'src')
-rw-r--r--src/w32.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/w32.c b/src/w32.c
index c75a4f918d3..197f6ddee2f 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -2091,7 +2091,29 @@ getpwnam (char *name)
return pw;
if (xstrcasecmp (name, pw->pw_name))
- return NULL;
+ {
+ /* Mimic what init_editfns does with these environment
+ variables, so that the likes of ~USER is recognized by
+ expand-file-name even if $LOGNAME gives a name different from
+ the real username produced by the process token. */
+ char *logname = getenv ("LOGNAME");
+ char *username = getenv ("USERNAME");
+ if ((logname || username)
+ && xstrcasecmp (name, logname ? logname : username) == 0)
+ {
+ static struct passwd alias_user;
+ static char alias_name[PASSWD_FIELD_SIZE];
+
+ memcpy (&alias_user, &dflt_passwd, sizeof dflt_passwd);
+ alias_name[0] = '\0';
+ strncat (alias_name, logname ? logname : username,
+ PASSWD_FIELD_SIZE - 1);
+ alias_user.pw_name = alias_name;
+ pw = &alias_user;
+ }
+ else
+ return NULL;
+ }
return pw;
}