aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_upgrade/file.c27
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.h2
-rw-r--r--src/include/pg_config.h.in3
-rw-r--r--src/include/port.h4
-rw-r--r--src/port/link.c35
-rw-r--r--src/tools/msvc/Mkvcbuild.pm2
-rw-r--r--src/tools/msvc/Solution.pm1
7 files changed, 46 insertions, 28 deletions
diff --git a/src/bin/pg_upgrade/file.c b/src/bin/pg_upgrade/file.c
index 09bf886ed71..cc8a675d009 100644
--- a/src/bin/pg_upgrade/file.c
+++ b/src/bin/pg_upgrade/file.c
@@ -26,10 +26,6 @@
#include "storage/checksum.h"
#include "storage/checksum_impl.h"
-#ifdef WIN32
-static int win32_pghardlink(const char *src, const char *dst);
-#endif
-
/*
* cloneFile()
@@ -151,7 +147,7 @@ void
linkFile(const char *src, const char *dst,
const char *schemaName, const char *relName)
{
- if (pg_link_file(src, dst) < 0)
+ if (link(src, dst) < 0)
pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
schemaName, relName, src, dst, strerror(errno));
}
@@ -369,29 +365,10 @@ check_hard_link(void)
snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.linktest", new_cluster.pgdata);
unlink(new_link_file); /* might fail */
- if (pg_link_file(existing_file, new_link_file) < 0)
+ if (link(existing_file, new_link_file) < 0)
pg_fatal("could not create hard link between old and new data directories: %s\n"
"In link mode the old and new data directories must be on the same file system.\n",
strerror(errno));
unlink(new_link_file);
}
-
-#ifdef WIN32
-/* implementation of pg_link_file() on Windows */
-static int
-win32_pghardlink(const char *src, const char *dst)
-{
- /*
- * CreateHardLinkA returns zero for failure
- * https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createhardlinka
- */
- if (CreateHardLinkA(dst, src, NULL) == 0)
- {
- _dosmaperr(GetLastError());
- return -1;
- }
- else
- return 0;
-}
-#endif
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
index b156b516cce..8b90cefbe09 100644
--- a/src/bin/pg_upgrade/pg_upgrade.h
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -65,7 +65,6 @@ extern char *output_files[];
#ifndef WIN32
#define pg_mv_file rename
-#define pg_link_file link
#define PATH_SEPARATOR '/'
#define PATH_QUOTE '\''
#define RM_CMD "rm -f"
@@ -76,7 +75,6 @@ extern char *output_files[];
#define ECHO_BLANK ""
#else
#define pg_mv_file pgrename
-#define pg_link_file win32_pghardlink
#define PATH_SEPARATOR '\\'
#define PATH_QUOTE '"'
#define RM_CMD "DEL /q"
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 4fa0f770aaa..d758dfd36ee 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -346,6 +346,9 @@
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
+/* Define to 1 if you have the `link' function. */
+#undef HAVE_LINK
+
/* Define to 1 if the system has the type `locale_t'. */
#undef HAVE_LOCALE_T
diff --git a/src/include/port.h b/src/include/port.h
index 3be994b43c7..29f3e39e5b3 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -381,6 +381,10 @@ extern float pg_strtof(const char *nptr, char **endptr);
#define strtof(a,b) (pg_strtof((a),(b)))
#endif
+#ifndef HAVE_LINK
+extern int link(const char *src, const char *dst);
+#endif
+
#ifndef HAVE_MKDTEMP
extern char *mkdtemp(char *path);
#endif
diff --git a/src/port/link.c b/src/port/link.c
new file mode 100644
index 00000000000..c7e43854211
--- /dev/null
+++ b/src/port/link.c
@@ -0,0 +1,35 @@
+/*-------------------------------------------------------------------------
+ *
+ * link.c
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/port/link.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "c.h"
+
+#ifdef WIN32
+
+int
+link(const char *src, const char *dst)
+{
+ /*
+ * CreateHardLinkA returns zero for failure
+ * https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createhardlinka
+ */
+ if (CreateHardLinkA(dst, src, NULL) == 0)
+ {
+ _dosmaperr(GetLastError());
+ return -1;
+ }
+ else
+ return 0;
+}
+
+#endif
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 834c2c39d18..ec250429336 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -98,7 +98,7 @@ sub mkvcbuild
chklocale.c explicit_bzero.c fls.c getpeereid.c getrusage.c inet_aton.c random.c
srandom.c getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
- dirent.c dlopen.c getopt.c getopt_long.c
+ dirent.c dlopen.c getopt.c getopt_long.c link.c
pread.c pwrite.c pg_bitutils.c
pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c
pqsignal.c mkdtemp.c qsort.c qsort_arg.c quotes.c system.c
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 9bb8f57150a..4244a4a8ac1 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -298,6 +298,7 @@ sub GenerateFiles
HAVE_LIBXML2 => undef,
HAVE_LIBXSLT => undef,
HAVE_LIBZ => $self->{options}->{zlib} ? 1 : undef,
+ HAVE_LINK => undef,
HAVE_LOCALE_T => 1,
HAVE_LONG_INT_64 => undef,
HAVE_LONG_LONG_INT_64 => 1,