Mercurial > hg > octave-lyh > gnulib-hg
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