bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Suggestion: new module link


From: Bruno Haible
Subject: Re: [PATCH] Suggestion: new module link
Date: Wed, 21 Jan 2009 00:58:13 +0100
User-agent: KMail/1.9.9

Hello Martin,

Your patch did a '#define _WIN32_WINNT 0x0500' in order to access the
CreateHardLink() function. This means, this function did not exist on
Windows NT 4.

Unfortunately, my mingw test system is running in a Windows NT 4 SP5
machine; this is the only version of Windows that I can use without
paying bucks to Microsoft. And on this system, the 'test-link.exe'
exits with exit code 128 - not 0, 1, or 77. It's a failure in the
runtime linking, and would affect any executable that includes the
compiled link.c code.

In general I am not in favour of supporting systems more than 8 years
old. But since this is the only Windows machine I have access to, after
the shutdown of testdrive...

With the attached patch, I can link and run test-link.exe, and it
exits with code 77 - as expected for a platform that does not support
hard links.

Transforming code that works for Windows 2000 or newer into code
that works also for older versions is tedious but straightforward:
  - Look up the types of the functions,
  - Look up the decorated names of the functions, and the DLLs where
    they come from,
  - Use LoadLibrary and GetProcAddress to get the function pointers.


2009-01-20  Bruno Haible  <address@hidden>

        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.

*** lib/link.c.orig     2009-01-21 00:34:52.000000000 +0100
--- lib/link.c  2009-01-21 00:34:24.000000000 +0100
***************
*** 21,36 ****
  #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>
  
  int
  link (const char *path1, const char *path2)
  {
!   if (CreateHardLink (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
--- 21,62 ----
  #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
  
  #define WIN32_LEAN_AND_MEAN
  #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 (!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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]