From: serassio <> Date: Fri, 25 Jan 2008 02:20:43 +0000 (+0000) Subject: Windows port: Handle notification of IP address changes for dial-up connections X-Git-Tag: BASIC_TPROXY4~148 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=babd1fd59a24623884cb821462e308c8ec5e22f7;p=thirdparty%2Fsquid.git Windows port: Handle notification of IP address changes for dial-up connections On Windows 2000 and later, the NotifyAddrChange() function allow a process to be notified of the changes in the system IP addresses table. This patch generate a reconfigure request after any notification, this allow the hot addition/reconfiguration of network interfaces without manually restart/reconfigure Squid. --- diff --git a/src/WinSvc.cc b/src/WinSvc.cc index 1d2fab2e02..9b75cf5dbd 100755 --- a/src/WinSvc.cc +++ b/src/WinSvc.cc @@ -1,6 +1,6 @@ /* - * $Id: WinSvc.cc,v 1.3 2007/04/28 22:26:37 hno Exp $ + * $Id: WinSvc.cc,v 1.4 2008/01/24 19:20:43 serassio Exp $ * * Windows support * AUTHOR: Guido Serassio @@ -69,6 +69,11 @@ static int s_iInitCount = 0; #endif static int Squid_Aborting = 0; +static HANDLE NotifyAddrChange_thread = INVALID_HANDLE_VALUE; + +#undef NotifyAddrChange +typedef DWORD(WINAPI * PFNotifyAddrChange) (OUT PHANDLE, IN LPOVERLAPPED); +#define NOTIFYADDRCHANGE "NotifyAddrChange" #if USE_WIN32_SERVICE static SERVICE_STATUS svcStatus; @@ -385,6 +390,17 @@ WIN32_Abort(int sig) WIN32_Exit(); } +void +WIN32_IpAddrChangeMonitorExit() +{ + DWORD status = ERROR_SUCCESS; + + if (NotifyAddrChange_thread == INVALID_HANDLE_VALUE) { + TerminateThread(NotifyAddrChange_thread, status); + CloseHandle(NotifyAddrChange_thread); + } +} + void WIN32_Exit() { @@ -406,12 +422,57 @@ WIN32_Exit() DeleteCriticalSection(dbg_mutex); WIN32_ExceptionHandlerCleanup(); + WIN32_IpAddrChangeMonitorExit(); #endif _exit(0); } +#ifdef _SQUID_MSWIN_ +static DWORD WINAPI +WIN32_IpAddrChangeMonitor(LPVOID lpParam) +{ + DWORD Result; + HMODULE IPHLPAPIHandle; + PFNotifyAddrChange NotifyAddrChange; + + if ((IPHLPAPIHandle = GetModuleHandle("IPHLPAPI")) == NULL) + IPHLPAPIHandle = LoadLibrary("IPHLPAPI"); + NotifyAddrChange = (PFNotifyAddrChange) GetProcAddress(IPHLPAPIHandle, NOTIFYADDRCHANGE); + + while (1) { + Result = NotifyAddrChange(NULL, NULL); + if (Result != NO_ERROR) { + debug(1, 1) ("NotifyAddrChange error %ld\n", Result); + return 1; + } + debug(1, 1) ("Notification of IP address change received, requesting Squid reconfiguration ...\n"); + reconfigure(SIGHUP); + } + return 0; +} + +DWORD +WIN32_IpAddrChangeMonitorInit() +{ + DWORD status = ERROR_SUCCESS; + DWORD threadID = 0, ThrdParam = 0; + + if (WIN32_run_mode == _WIN_SQUID_RUN_MODE_SERVICE) { + NotifyAddrChange_thread = CreateThread(NULL, 0, WIN32_IpAddrChangeMonitor, + &ThrdParam, 0, &threadID); + if (NotifyAddrChange_thread == NULL) { + status = GetLastError(); + NotifyAddrChange_thread = INVALID_HANDLE_VALUE; + debug(1, 1) ("Failed to start IP monitor thread.\n"); + } else + debug(1, 2) ("Starting IP monitor thread [%li] ...\n", threadID); + } + return status; +} +#endif + int WIN32_Subsystem_Init(int * argc, char *** argv) { #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */ diff --git a/src/main.cc b/src/main.cc index 183b0040c5..e96beca6d4 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,6 +1,6 @@ /* - * $Id: main.cc,v 1.455 2008/01/22 17:13:36 rousskov Exp $ + * $Id: main.cc,v 1.456 2008/01/24 19:20:43 serassio Exp $ * * DEBUG: section 1 Startup and Main Loop * AUTHOR: Harvest Derived @@ -828,6 +828,10 @@ mainInitialize(void) if (WIN32_Socks_initialized) debugs(1, 1, "Windows sockets initialized"); + if (WIN32_OS_version > _WIN_OS_WINNT) { + WIN32_IpAddrChangeMonitorInit(); + } + #endif if (!configured_once) diff --git a/src/protos.h b/src/protos.h index 9667993351..6b6d742f6b 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.553 2008/01/21 20:59:44 serassio Exp $ + * $Id: protos.h,v 1.554 2008/01/24 19:20:43 serassio Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -770,8 +770,8 @@ SQUIDCEXTERN int WIN32_pipe(int[2]); SQUIDCEXTERN int WIN32_getrusage(int, struct rusage *); SQUIDCEXTERN void WIN32_ExceptionHandlerInit(void); -SQUIDCEXTERN int Win32__WSAFDIsSet(int fd, fd_set* set - ); +SQUIDCEXTERN int Win32__WSAFDIsSet(int fd, fd_set* set); +SQUIDCEXTERN DWORD WIN32_IpAddrChangeMonitorInit(); #endif