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>
This commit is contained in:
parent
55b6513e73
commit
564be791f3
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user