Make the 'link' module link on Windows NT 4.
authorBruno Haible <bruno@clisp.org>
Tue, 20 Jan 2009 23:58:26 +0000 (00:58 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 20 Jan 2009 23:58:26 +0000 (00:58 +0100)
ChangeLog
lib/link.c

index 521eb24..5b4d64c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2009-01-20  Bruno Haible  <bruno@clisp.org>
 
+       Make the 'link' module link on Windows NT 4.
+       * lib/link.c (_WIN32_WINNT): Don't define.
+       (CreateHardLinkFuncType): New type.
+       (CreateHardLinkFunc, initialized): New variables.
+       (initialize): New function.
+       (link): Invoke CreateHardLink indirectly through the function pointer.
+
+2009-01-20  Bruno Haible  <bruno@clisp.org>
+
        Fix compilation failure on mingw.
        * tests/test-link.c (main): Don't assume that EOPNOTSUPP exists.
 
index 6737d37..2b5a97f 100644 (file)
 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 
 #define WIN32_LEAN_AND_MEAN
-#define _WIN32_WINNT 0x0500
 #include <unistd.h>
 #include <windows.h>
 
 #include <errno.h>
 
+/* CreateHardLink was introduced only in Windows 2000.  */
+typedef BOOL (WINAPI * CreateHardLinkFuncType) (LPCTSTR lpFileName,
+                                               LPCTSTR lpExistingFileName,
+                                               LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+static CreateHardLinkFuncType CreateHardLinkFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+  HMODULE kernel32 = LoadLibrary ("kernel32.dll");
+  if (kernel32 != NULL)
+    {
+      CreateHardLinkFunc =
+       (CreateHardLinkFuncType) GetProcAddress (kernel32, "CreateHardLinkA");
+    }
+  initialized = TRUE;
+}
+
 int
 link (const char *path1, const char *path2)
 {
-  if (CreateHardLink (path2, path1, NULL) == 0)
+  if (!initialized)
+    initialize ();
+  if (CreateHardLinkFunc == NULL)
+    {
+      /* System does not support hard links.  */
+      errno = EPERM;
+      return -1;
+    }
+  if (CreateHardLinkFunc (path2, path1, NULL) == 0)
     {
       /* It is not documented which errors CreateHardLink() can produce.
        * The following conversions are based on tests on a Windows XP SP2