aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2019-02-15 12:22:49 +0200
committerEli Zaretskii2019-02-15 12:22:49 +0200
commit4d00262a8ebd3c8a0f3679a710b6bb8657bf2ca1 (patch)
tree9d1111f1ccc258858856a38efd2dabe51577529b /src
parentc3f87efe3a73c2850f765773965b2440296b0666 (diff)
downloademacs-4d00262a8ebd3c8a0f3679a710b6bb8657bf2ca1.tar.gz
emacs-4d00262a8ebd3c8a0f3679a710b6bb8657bf2ca1.zip
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)
2091 return pw; 2091 return pw;
2092 2092
2093 if (xstrcasecmp (name, pw->pw_name)) 2093 if (xstrcasecmp (name, pw->pw_name))
2094 return NULL; 2094 {
2095 /* Mimic what init_editfns does with these environment
2096 variables, so that the likes of ~USER is recognized by
2097 expand-file-name even if $LOGNAME gives a name different from
2098 the real username produced by the process token. */
2099 char *logname = getenv ("LOGNAME");
2100 char *username = getenv ("USERNAME");
2101 if ((logname || username)
2102 && xstrcasecmp (name, logname ? logname : username) == 0)
2103 {
2104 static struct passwd alias_user;
2105 static char alias_name[PASSWD_FIELD_SIZE];
2106
2107 memcpy (&alias_user, &dflt_passwd, sizeof dflt_passwd);
2108 alias_name[0] = '\0';
2109 strncat (alias_name, logname ? logname : username,
2110 PASSWD_FIELD_SIZE - 1);
2111 alias_user.pw_name = alias_name;
2112 pw = &alias_user;
2113 }
2114 else
2115 return NULL;
2116 }
2095 2117
2096 return pw; 2118 return pw;
2097} 2119}