]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
CreateHardLinkA is supported on Win2k and later, which is good
authorTim Kientzle <kientzle@gmail.com>
Tue, 1 Sep 2009 01:34:07 +0000 (21:34 -0400)
committerTim Kientzle <kientzle@gmail.com>
Tue, 1 Sep 2009 01:34:07 +0000 (21:34 -0400)
enough for now.  (Plus, I was having inexplicable problems getting
the dynamic probe to work for this function.)

SVN-Revision: 1411

configure.ac
cpio/test/main.c
libarchive/test/main.c
tar/test/main.c

index 53bfab0e0ff3f2a0e43228641e6a7ff3fdd96b81..60ae3d2a0b68af79d8787178a193fe4c4de6eb20 100644 (file)
@@ -335,7 +335,7 @@ AC_FUNC_STAT
 AC_FUNC_STRERROR_R
 AC_FUNC_STRFTIME
 AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([CreateHardLink CreateSymbolicLink])
+AC_CHECK_FUNCS([CreateHardLinkA CreateSymbolicLink])
 AC_CHECK_FUNCS([chflags chown chroot])
 AC_CHECK_FUNCS([fchdir fchflags fchmod fchown fcntl fork])
 AC_CHECK_FUNCS([fstat ftruncate futimes geteuid getpid])
index a45485c9cce34d168fb64096ffadd3fefa4c58d8..e8efa4c85b267820919c981a2650c856e6224d2a 100644 (file)
@@ -90,18 +90,6 @@ int __CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
        return f == NULL ? 0 : (*f)(linkname, target, flags);
 }
 
-int __CreateHardLinkA(const char *linkname, const char *target)
-{
-       static BOOLEAN (*f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
-       static int set;
-       if (!set) {
-               set = 1;
-               f = GetFunctionKernel32("CreateHardLinkA");
-       }
-       if (f == NULL)
-               return 0;
-       return (*f)(linkname, target, NULL);
-}
 #endif
 
 /*
@@ -1015,10 +1003,10 @@ test_assert_make_hardlink(const char *file, int line,
        int succeeded;
 
        count_assertion(file, line);
-#if defined(_WIN32) && !defined(__CYGWIN__)
-       succeeded = __CreateHardLinkA(newpath, linkto);
-#elif HAVE_LINK
+#if HAVE_LINK
        succeeded = !link(linkto, newpath);
+#elif HAVE_CREATEHARDLINKA
+       succeeded = CreateHardLinkA(newpath, linkto, NULL);
 #else
        succeeded = 0;
 #endif
index c3b48af4e9779a898b687ea5b57dceda4063db85..b49fb1a31557c134514866cdc94c044712022898 100644 (file)
@@ -39,7 +39,6 @@
 #endif
 #include <io.h>
 #include <windows.h>
-#include <winbase.h>
 #ifndef F_OK
 #define F_OK (0)
 #endif
 #define umask _umask
 #endif
 
+#if defined(_WIN32) && !defined(__CYGWIN__)
+void *GetFunctionKernel32(const char *name)
+{
+       static HINSTANCE lib;
+       static int set;
+       if (!set) {
+               set = 1;
+               lib = LoadLibrary("kernel32.dll");
+       }
+       if (lib == NULL) {
+               fprintf(stderr, "Can't load kernel32.dll?!\n");
+               return NULL;
+       }
+       return (void *)GetProcAddress(lib, name);
+}
+
+int __CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
+{
+       static BOOLEAN (*f)(LPCSTR, LPCSTR, DWORD);
+       static int set;
+       if (!set) {
+               set = 1;
+               f = GetFunctionKernel32("CreateSymbolicLinkA");
+       }
+       return f == NULL ? 0 : (*f)(linkname, target, flags);
+}
+
+#endif
+
 /*
  * This same file is used pretty much verbatim for all test harnesses.
  *
@@ -974,10 +1002,10 @@ test_assert_make_hardlink(const char *file, int line,
        int succeeded;
 
        count_assertion(file, line);
-#if HAVE_CREATEHARDLINK
-       succeeded = CreateHardLink(newpath, linkto, NULL);
-#elif HAVE_LINK
+#if HAVE_LINK
        succeeded = !link(linkto, newpath);
+#elif HAVE_CREATEHARDLINKA
+       succeeded = CreateHardLinkA(newpath, linkto, NULL);
 #else
        succeeded = 0;
 #endif
@@ -996,10 +1024,10 @@ int
 test_assert_make_symlink(const char *file, int line,
     const char *newpath, const char *linkto)
 {
-#if HAVE_CREATESYMBOLICLINK
-       int targetIsDir = 0; /* TODO: Fix this. */
+#if defined(_WIN32) && !defined(__CYGWIN__)
+       int targetIsDir = 0;  /* TODO: Fix this */
        count_assertion(file, line);
-       if (CreateSymbolicLink(newpath, linkto, targetIsDir))
+       if (__CreateSymbolicLinkA(newpath, linkto, targetIsDir))
                return (1);
 #elif HAVE_SYMLINK
        count_assertion(file, line);
index 452b6da61f65eef515f9540e8c1c55bd8356a782..0e148a1bd06e21a149a73d4d3b17c9c1786f7512 100644 (file)
@@ -90,21 +90,6 @@ int __CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
        return f == NULL ? 0 : (*f)(linkname, target, flags);
 }
 
-int __CreateHardLinkA(const char *linkname, const char *target)
-{
-       return CreateHardLinkA(linkname, target, NULL);
-#if 0
-       static BOOLEAN (*f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
-       static int set;
-       if (!set) {
-               set = 1;
-               f = GetFunctionKernel32("CreateHardLinkA");
-       }
-       if (f == NULL)
-               return 0;
-       return (*f)(linkname, target, NULL);
-#endif
-}
 #endif
 
 /*
@@ -1018,10 +1003,10 @@ test_assert_make_hardlink(const char *file, int line,
        int succeeded;
 
        count_assertion(file, line);
-#if defined(_WIN32) && !defined(__CYGWIN__)
-       succeeded = __CreateHardLinkA(newpath, linkto);
-#elif HAVE_LINK
+#if HAVE_LINK
        succeeded = !link(linkto, newpath);
+#elif HAVE_CREATEHARDLINKA
+       succeeded = CreateHardLinkA(newpath, linkto, NULL);
 #else
        succeeded = 0;
 #endif