diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2019-02-15 12:22:49 +0200 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2019-02-15 12:22:49 +0200 |
| commit | 4d00262a8ebd3c8a0f3679a710b6bb8657bf2ca1 (patch) | |
| tree | 9d1111f1ccc258858856a38efd2dabe51577529b /src/w32.c | |
| parent | c3f87efe3a73c2850f765773965b2440296b0666 (diff) | |
| download | emacs-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/w32.c')
| -rw-r--r-- | src/w32.c | 24 |
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; } |
