]> git.ipfire.org Git - thirdparty/git.git/commitdiff
getpwuid(mingw): provide a better default for the user name
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Mon, 15 Oct 2018 09:47:06 +0000 (02:47 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 16 Oct 2018 03:59:57 +0000 (12:59 +0900)
We do have the excellent GetUserInfoEx() function to obtain more
detailed information of the current user (if the user is part of a
Windows domain); Let's use it.

Suggested by Lutz Roeder.

To avoid the cost of loading Secur32.dll (even lazily, loading DLLs
takes a non-neglibile amount of time), we use the established technique
to load DLLs only when, and if, needed.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c

index 32fa6e7c1fa1ef06426943a66aa417f45f891c08..90554712932f19a09b162ed14b7089944e63a8ea 100644 (file)
@@ -5,6 +5,7 @@
 #include "../strbuf.h"
 #include "../run-command.h"
 #include "../cache.h"
+#include "win32/lazyload.h"
 
 #define HCAST(type, handle) ((type)(intptr_t)handle)
 
@@ -1768,6 +1769,33 @@ int mingw_getpagesize(void)
        return si.dwAllocationGranularity;
 }
 
+/* See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724435.aspx */
+enum EXTENDED_NAME_FORMAT {
+       NameDisplay = 3,
+       NameUserPrincipal = 8
+};
+
+static char *get_extended_user_info(enum EXTENDED_NAME_FORMAT type)
+{
+       DECLARE_PROC_ADDR(secur32.dll, BOOL, GetUserNameExW,
+               enum EXTENDED_NAME_FORMAT, LPCWSTR, PULONG);
+       static wchar_t wbuffer[1024];
+       DWORD len;
+
+       if (!INIT_PROC_ADDR(GetUserNameExW))
+               return NULL;
+
+       len = ARRAY_SIZE(wbuffer);
+       if (GetUserNameExW(type, wbuffer, &len)) {
+               char *converted = xmalloc((len *= 3));
+               if (xwcstoutf(converted, wbuffer, len) >= 0)
+                       return converted;
+               free(converted);
+       }
+
+       return NULL;
+}
+
 struct passwd *getpwuid(int uid)
 {
        static unsigned initialized;
@@ -1786,7 +1814,9 @@ struct passwd *getpwuid(int uid)
 
        p = xmalloc(sizeof(*p));
        p->pw_name = user_name;
-       p->pw_gecos = "unknown";
+       p->pw_gecos = get_extended_user_info(NameDisplay);
+       if (!p->pw_gecos)
+               p->pw_gecos = "unknown";
        p->pw_dir = NULL;
 
        initialized = 1;