From: Michael Lukashov <michael.lukashov@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Sixt <j6t@kdbg.org>,
Michael Lukashov <michael.lukashov@gmail.com>
Subject: [PATCH] Windows: avoid static dependency on advapi32.dll
Date: Sun, 24 Jan 2010 18:53:51 +0000 [thread overview]
Message-ID: <1264359231-4672-1-git-send-email-michael.lukashov@gmail.com> (raw)
This DLL is used to get default user name. By looking
up the only function that we need at runtime, we can
avoid the startup costs of this DLL.
Signed-off-by: Michael Lukashov <michael.lukashov@gmail.com>
---
compat/mingw.c | 31 ++++++++++++++++++++++++++++++-
1 files changed, 30 insertions(+), 1 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index ab65f77..6ce398c 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1176,13 +1176,42 @@ int mingw_getpagesize(void)
return si.dwAllocationGranularity;
}
+static HMODULE advapi32_dll = NULL;
+static BOOL (WINAPI *advapi32_get_user_name)(char *, DWORD *);
+
+static void advapi32_cleanup(void)
+{
+ if (advapi32_dll)
+ FreeLibrary(advapi32_dll);
+ advapi32_dll = NULL;
+ advapi32_get_user_name = NULL;
+}
+
struct passwd *getpwuid(int uid)
{
static char user_name[100];
static struct passwd p;
+ static int advapi32_initialized = 0;
DWORD len = sizeof(user_name);
- if (!GetUserName(user_name, &len))
+
+ if (!advapi32_initialized)
+ {
+ advapi32_dll = LoadLibrary("advapi32.dll");
+ if (!advapi32_dll)
+ die("cannot load advapi32.dll");
+ advapi32_get_user_name = (BOOL (WINAPI *)(char *, DWORD *))
+ GetProcAddress(advapi32_dll, "GetUserNameA");
+ if (!advapi32_get_user_name) {
+ FreeLibrary(advapi32_dll);
+ advapi32_dll = NULL;
+ die("cannot find GetUserNameA");
+ }
+ atexit(advapi32_cleanup);
+ advapi32_initialized = 1;
+ }
+
+ if (!advapi32_get_user_name(user_name, &len))
return NULL;
p.pw_name = user_name;
p.pw_gecos = "unknown";
--
1.6.6.1599.gaed1a
next reply other threads:[~2010-01-24 18:55 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-24 18:53 Michael Lukashov [this message]
2010-01-24 19:20 ` [PATCH] Windows: avoid static dependency on advapi32.dll Johannes Sixt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1264359231-4672-1-git-send-email-michael.lukashov@gmail.com \
--to=michael.lukashov@gmail.com \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).