]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-afsd-hook-20081106
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 6 Nov 2008 19:18:51 +0000 (19:18 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 6 Nov 2008 19:18:51 +0000 (19:18 +0000)
LICENSE MIT

When loading the afsdhook.dll require that it be in the same directory
as afsd_service.exe.  This prevents LoadLibrary() from searching the PATH
environment variable if it cannot be found.   If the PATH environment
variable contains a path in AFS, the library will fail to load and take
a very long time doing so.

(cherry picked from commit a36618213694f37cd1cec660336267a38cee9344)

src/WINNT/afsd/afsd_service.c
src/WINNT/afsd/cm_daemon.c
src/WINNT/afsd/cm_utils.c
src/WINNT/afsd/cm_utils.h

index 4a75d033e2608a6c12be422316a346d81ecdbfec..290eee3a53eee830101a9bcf6e83e9c66bbbe356 100644 (file)
@@ -1215,7 +1215,7 @@ afsd_Main(DWORD argc, LPTSTR *argv)
     }
 
     /* allow an exit to be called prior to any initialization */
-    hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+    hHookDll = cm_LoadAfsdHookLib();
     if (hHookDll)
     {
         BOOL hookRc = TRUE;
@@ -1287,7 +1287,7 @@ afsd_Main(DWORD argc, LPTSTR *argv)
         }
 
         /* allow an exit to be called post rx initialization */
-        hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+        hHookDll = cm_LoadAfsdHookLib();
         if (hHookDll)
         {
             BOOL hookRc = TRUE;
@@ -1335,7 +1335,7 @@ afsd_Main(DWORD argc, LPTSTR *argv)
         }
 
         /* allow an exit to be called post smb initialization */
-        hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+        hHookDll = cm_LoadAfsdHookLib();
         if (hHookDll)
         {
             BOOL hookRc = TRUE;
@@ -1381,7 +1381,7 @@ afsd_Main(DWORD argc, LPTSTR *argv)
     }
 
     /* allow an exit to be called when started */
-    hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+    hHookDll = cm_LoadAfsdHookLib();
     if (hHookDll)
     {
         BOOL hookRc = TRUE;
@@ -1426,7 +1426,7 @@ afsd_Main(DWORD argc, LPTSTR *argv)
        LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_SERVICE_STOPPING);
 
     /* allow an exit to be called prior to stopping the service */
-    hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+    hHookDll = cm_LoadAfsdHookLib();
     if (hHookDll)
     {
         BOOL hookRc = TRUE;
@@ -1486,7 +1486,7 @@ afsd_Main(DWORD argc, LPTSTR *argv)
     cm_VolStatus_Finalize();
 
     /* allow an exit to be called after stopping the service */
-    hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+    hHookDll = cm_LoadAfsdHookLib();
     if (hHookDll)
     {
         BOOL hookRc = TRUE;
index 478b5e116614f60713598dc1460b87063746a675..e511561a9a2fd3104d1e6a3add67af058ac57d5b 100644 (file)
@@ -533,7 +533,7 @@ void cm_Daemon(long parm)
         }
 
         /* allow an exit to be called prior to stopping the service */
-        hHookDll = LoadLibrary(AFSD_HOOK_DLL);
+        hHookDll = cm_LoadAfsdHookLib();
         if (hHookDll)
         {
             BOOL hookRc = TRUE;
index c3abe843978fe0ab897764fc947e517b8ff46c56..575f78decae908e8ad7a211958772404c3b0fd61 100644 (file)
@@ -762,3 +762,25 @@ cm_TargetPerceivedAsDirectory(const fschar_t *target)
 
     return FALSE;
 }
+
+HANDLE 
+cm_LoadAfsdHookLib(void)
+{
+    char dllname[260];
+    char *p;
+    HANDLE hLib;
+
+    if (!GetModuleFileName(NULL, dllname, sizeof(dllname)))
+        return NULL;
+
+    p = strrchr(dllname, '\\');
+    if (p) {
+        p++;
+        strcpy(p, AFSD_HOOK_DLL);
+        hLib = LoadLibrary(dllname);
+    } else {
+        hLib = LoadLibrary(AFSD_HOOK_DLL);
+    }
+
+    return hLib;
+}
index b852902b12c011d24b05c2e3f7d3f14455cfe7ea..f1708cc045e585022c7c661b772b309959383730 100644 (file)
@@ -83,4 +83,6 @@ extern int cm_MatchMask(clientchar_t *namep, clientchar_t *maskp, int flags);
 
 extern BOOL cm_TargetPerceivedAsDirectory(const fschar_t *target);
 
+extern HANDLE cm_LoadAfsdHookLib(void);
+
 #endif /*  __CM_UTILS_H_ENV__ */