# HG changeset patch # User Bruno Haible # Date 1232495906 -3600 # Node ID 2921cdaa11643bcfb8904290c9b23e890afae6bc # Parent 90ff3553a1d73ac507facf763f27941ad8ad649d Make the 'link' module link on Windows NT 4. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-01-20 Bruno Haible + + 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 Fix compilation failure on mingw. diff --git a/lib/link.c b/lib/link.c --- 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 #include #include +/* 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