From 067bc3c815b0a870436fd3886d770cc66dea4abc Mon Sep 17 00:00:00 2001 From: Richard Basch Date: Fri, 7 Feb 1997 13:55:01 +0000 Subject: [PATCH] cns.c: Declare blocking_hook_proc with __export keyword so that it works with Win16. Win32 will only generate a warning message. Reworked timeout logic to accomodate the 49.7 day wraparound of GetTickCount() git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@9813 dc483132-0cff-0310-8789-dd5450dbe970 --- src/windows/cns/ChangeLog | 6 ++++++ src/windows/cns/cns.c | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/windows/cns/ChangeLog b/src/windows/cns/ChangeLog index 1fd2a5eec..d07b3d589 100644 --- a/src/windows/cns/ChangeLog +++ b/src/windows/cns/ChangeLog @@ -1,3 +1,9 @@ +Fri Feb 7 08:08:39 1997 Richard Basch + + * cns.c (blocking_hook_proc): Additional logic is required to + prevent instantaneous timeouts when GetTickCount() + wraps every 49.7 days. + Sun Feb 2 11:22:57 1997 Richard Basch * cns.c (k5_name_from_ccache): diff --git a/src/windows/cns/cns.c b/src/windows/cns/cns.c index 021cc88ab..15e4554b0 100644 --- a/src/windows/cns/cns.c +++ b/src/windows/cns/cns.c @@ -55,6 +55,7 @@ BOOL alert; /* Actions on ticket expiration */ BOOL beep; static BOOL alerted; /* TRUE when user already alerted */ BOOL isblocking = FALSE; /* TRUE when blocked in WinSock */ +static DWORD blocking_timeout; /* Blocking timeout */ static DWORD blocking_end_time; /* Ending count for blocking timeout */ static FARPROC hook_instance; /* handle for blocking hook function */ @@ -75,13 +76,21 @@ krb5_ccache k5_ccache; * * Returns: TRUE if we got and dispatched a message, FALSE otherwise. */ -BOOL CALLBACK +BOOL __export CALLBACK blocking_hook_proc(void) { MSG msg; BOOL rc; + DWORD now; - if (GetTickCount() > blocking_end_time) { + /* + * The additional timeout logic is required because GetTickCount will + * wrap approximately every 49.7 days. + */ + now = GetTickCount(); + if (now >= blocking_end_time && + (blocking_end_time >= blocking_end_time - blocking_timeout || + now < blocking_end_time - blocking_timeout)) { WSACancelBlockingCall(); return FALSE; } @@ -118,7 +127,8 @@ start_blocking_hook(int timeout) return; isblocking = TRUE; - blocking_end_time = GetTickCount() + (1000 * timeout); + blocking_timeout = 1000 * timeout; + blocking_end_time = GetTickCount() + blocking_timeout; #ifdef _WIN32 proc = WSASetBlockingHook(blocking_hook_proc); #else -- 2.26.2