]> git.eshelyaron.com Git - emacs.git/commitdiff
Support ~USER for some names on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Fri, 15 Feb 2019 10:22:49 +0000 (12:22 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 15 Feb 2019 10:22:49 +0000 (12:22 +0200)
* src/w32.c (getpwnam): Support usernames provided through
LOGNAME or USERNAME environment variables, to mimic what
editfns.c:init_editfns does.

src/w32.c

index c75a4f918d36376d0ddc144dff18d7490440b8c2..197f6ddee2f6177e543d5cd524f779aafc9e31b4 100644 (file)
--- 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;
 }