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 @@ @@ -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) @@ -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) @@ -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;

Loading…
Cancel
Save