diff options
author | Werner Koch <[email protected]> | 2018-05-02 16:40:01 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2018-05-02 16:40:01 +0000 |
commit | 007dde93cc3971cb51d08e8c082e172506ae7f80 (patch) | |
tree | 06f8e5f69c1bd33a6615beb769d1622a1082c47c | |
parent | build: New configure option to help with nPth debugging. (diff) | |
download | gnupg-007dde93cc3971cb51d08e8c082e172506ae7f80.tar.gz gnupg-007dde93cc3971cb51d08e8c082e172506ae7f80.zip |
dirmngr: Implement timeout for dirmngr_ldap under Windows.
* dirmngr/dirmngr_ldap.c (alarm_thread) [W32]: New.
(set_timeout): Implement for W32.
--
GnuPG-bug-id: 3937
Signed-off-by: Werner Koch <[email protected]>
-rw-r--r-- | dirmngr/dirmngr_ldap.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/dirmngr/dirmngr_ldap.c b/dirmngr/dirmngr_ldap.c index e05c77925..8452c3ba0 100644 --- a/dirmngr/dirmngr_ldap.c +++ b/dirmngr/dirmngr_ldap.c @@ -381,16 +381,56 @@ catch_alarm (int dummy) } #endif + +#ifdef HAVE_W32_SYSTEM +static DWORD CALLBACK +alarm_thread (void *arg) +{ + HANDLE timer = arg; + + WaitForSingleObject (timer, INFINITE); + _exit (10); + + return 0; +} +#endif + + static void set_timeout (my_opt_t myopt) { + if (myopt->alarm_timeout) + { #ifdef HAVE_W32_SYSTEM - /* FIXME for W32. */ - (void)myopt; + static HANDLE timer; + LARGE_INTEGER due_time; + + /* A negative value is a relative time. */ + due_time.QuadPart = (unsigned long long)-10000000 * myopt->alarm_timeout; + + if (!timer) + { + SECURITY_ATTRIBUTES sec_attr; + DWORD tid; + + memset (&sec_attr, 0, sizeof sec_attr); + sec_attr.nLength = sizeof sec_attr; + sec_attr.bInheritHandle = FALSE; + + /* Create a manual resetable timer. */ + timer = CreateWaitableTimer (NULL, TRUE, NULL); + /* Intially set the timer. */ + SetWaitableTimer (timer, &due_time, 0, NULL, NULL, 0); + + if (CreateThread (&sec_attr, 0, alarm_thread, timer, 0, &tid)) + log_error ("failed to create alarm thread\n"); + } + else /* Retrigger the timer. */ + SetWaitableTimer (timer, &due_time, 0, NULL, NULL, 0); #else - if (myopt->alarm_timeout) - alarm (myopt->alarm_timeout); + alarm (myopt->alarm_timeout); #endif + } } |