From a95b801f6124865acb8f45b7ca581d702f32f6f1 Mon Sep 17 00:00:00 2001 From: hniksic Date: Fri, 26 Sep 2003 17:35:31 -0700 Subject: [PATCH] [svn] Windows fixes by Gisle Vanem. --- src/ChangeLog | 6 +++++ src/mswindows.c | 63 +++++++++++++++++++++++++++++++++------------ src/mswindows.h | 5 ---- windows/config.h.ms | 3 ++- 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index ed573983..75f7ecf0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2003-09-26 Gisle Vanem + + * mswindows.c (read_registry): Removed. + (set_sleep_mode): New function. + (windows_main_junk): Call it. + 2003-09-26 Gisle Vanem * mswindows.c (read_registry): Fix invocation of registry diff --git a/src/mswindows.c b/src/mswindows.c index 0b5242f1..a3a186a8 100644 --- a/src/mswindows.c +++ b/src/mswindows.c @@ -57,13 +57,25 @@ so, delete this exception statement from your version. */ extern int errno; #endif +#ifndef ES_SYSTEM_REQUIRED +#define ES_SYSTEM_REQUIRED 0x00000001 +#endif + +#ifndef ES_CONTINUOUS +#define ES_CONTINUOUS 0x80000000 +#endif + + /* Defined in log.c. */ void log_request_redirect_output PARAMS ((const char *)); -static int windows_nt_p; +static DWORD set_sleep_mode (DWORD mode); +static DWORD pwr_mode = 0; +static int windows_nt_p; #ifndef HAVE_SLEEP + /* Emulation of Unix sleep. */ unsigned int @@ -92,21 +104,6 @@ usleep (unsigned long usec) } #endif /* HAVE_USLEEP */ -static char * -read_registry (HKEY hkey, char *subkey, char *valuename, char *buf, int *len) -{ - HKEY result; - DWORD size = *len; - DWORD type = REG_SZ; - if (RegOpenKeyEx (hkey, subkey, 0, KEY_READ, &result) != ERROR_SUCCESS) - return NULL; - if (RegQueryValueEx (result, valuename, NULL, &type, (LPBYTE)buf, &size) != ERROR_SUCCESS) - buf = NULL; - *len = size; - RegCloseKey (result); - return buf; -} - void windows_main_junk (int *argc, char **argv, char **exec_name) { @@ -125,6 +122,9 @@ static void ws_cleanup (void) { WSACleanup (); + if (pwr_mode) + set_sleep_mode (pwr_mode); + pwr_mode = 0; } static void @@ -170,7 +170,7 @@ ws_handler (DWORD dwEvent) case CTRL_CLOSE_EVENT: case CTRL_LOGOFF_EVENT: default: - WSACleanup (); + ws_cleanup (); return FALSE; } return TRUE; @@ -266,6 +266,7 @@ ws_startup (void) exit (1); } atexit (ws_cleanup); + pwr_mode = set_sleep_mode (0); SetConsoleCtrlHandler (ws_handler, TRUE); } @@ -295,3 +296,31 @@ int borland_utime(const char *path, const struct utimbuf *times) return res; } #endif + +/* + * Prevent Windows entering sleep/hibernation-mode while wget is doing a lengthy transfer. + * Windows does by default not consider network activity in console-programs as activity ! + * Works on Win-98/ME/2K and up. + */ +static +DWORD set_sleep_mode (DWORD mode) +{ + HMODULE mod = LoadLibrary ("kernel32.dll"); + DWORD (*_SetThreadExecutionState) (DWORD) = NULL; + DWORD rc = (DWORD)-1; + + if (mod) + (void*)_SetThreadExecutionState = GetProcAddress ((HINSTANCE)mod, "SetThreadExecutionState"); + + if (_SetThreadExecutionState) + { + if (mode == 0) /* first time */ + mode = (ES_SYSTEM_REQUIRED | ES_CONTINUOUS); + rc = (*_SetThreadExecutionState) (mode); + } + if (mod) + FreeLibrary (mod); + DEBUGP (("set_sleep_mode(): mode 0x%08lX, rc 0x%08lX\n", mode, rc)); + return (rc); +} + diff --git a/src/mswindows.h b/src/mswindows.h index 4f505d80..b7d9c949 100644 --- a/src/mswindows.h +++ b/src/mswindows.h @@ -125,11 +125,6 @@ so, delete this exception statement from your version. */ #define ESTALE WSAESTALE #define EREMOTE WSAEREMOTE -#ifdef __DMC__ -# define HAVE_SLEEP 1 -# define HAVE_USLEEP 1 -#endif - /* Public functions. */ #ifndef HAVE_SLEEP diff --git a/windows/config.h.ms b/windows/config.h.ms index 8db2a46e..715377b6 100644 --- a/windows/config.h.ms +++ b/windows/config.h.ms @@ -139,9 +139,10 @@ char *alloca (); #undef HAVE_UNISTD_H #endif -/* None except Digital Mars have usleep function */ +/* None except Digital Mars have sleep/usleep functions */ #if defined(__DMC__) #define HAVE_USLEEP +#define HAVE_SLEEP #endif /* Define if you have the header file. */ -- 2.39.2