Browse Source

getpwuid(mingw): provide a better default for the user name

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>
maint
Johannes Schindelin 6 years ago committed by Junio C Hamano
parent
commit
564be791f3
  1. 32
      compat/mingw.c

32
compat/mingw.c

@ -5,6 +5,7 @@
#include "../strbuf.h" #include "../strbuf.h"
#include "../run-command.h" #include "../run-command.h"
#include "../cache.h" #include "../cache.h"
#include "win32/lazyload.h"


#define HCAST(type, handle) ((type)(intptr_t)handle) #define HCAST(type, handle) ((type)(intptr_t)handle)


@ -1768,6 +1769,33 @@ int mingw_getpagesize(void)
return si.dwAllocationGranularity; 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) struct passwd *getpwuid(int uid)
{ {
static unsigned initialized; static unsigned initialized;
@ -1786,7 +1814,9 @@ struct passwd *getpwuid(int uid)


p = xmalloc(sizeof(*p)); p = xmalloc(sizeof(*p));
p->pw_name = user_name; 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; p->pw_dir = NULL;


initialized = 1; initialized = 1;

Loading…
Cancel
Save