changeset 11063:2921cdaa1164

Make the 'link' module link on Windows NT 4.
author Bruno Haible <bruno@clisp.org>
date Wed, 21 Jan 2009 00:58:26 +0100
parents 90ff3553a1d7
children a6bae222e34a
files ChangeLog lib/link.c
diffstat 2 files changed, 37 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+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.
--- a/lib/link.c
+++ b/lib/link.c
@@ -21,16 +21,42 @@
 #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