Remove configure probes for symlink/readlink, and dead code.
authorThomas Munro <tmunro@postgresql.org>
Thu, 4 Aug 2022 21:22:56 +0000 (09:22 +1200)
committerThomas Munro <tmunro@postgresql.org>
Thu, 4 Aug 2022 21:22:56 +0000 (09:22 +1200)
symlink() and readlink() are in SUSv2 and all targeted Unix systems have
them.  We have partial emulation on Windows.  Code that raised runtime
errors on systems without it has been dead for years, so we can remove
that and also references to such systems in the documentation.

Define HAVE_READLINK and HAVE_SYMLINK macros on Unix.  Our Windows
replacement functions based on junction points can't be used for
relative paths or for non-directories, so the macros can be used to
check for full symlink support.  The places that deal with tablespaces
can just use symlink functions without checking the macros.  (If they
did check the macros, they'd need to provide an #else branch with a
runtime or compile time error, and it'd be dead code.)

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/CA+hUKGJ3LHeP9w5Fgzdr4G8AnEtJ=z=p6hGDEm4qYGEUX5B6fQ@mail.gmail.com

15 files changed:
configure
configure.ac
doc/src/sgml/manage-ag.sgml
doc/src/sgml/ref/create_tablespace.sgml
src/backend/access/transam/xlog.c
src/backend/commands/tablespace.c
src/backend/replication/basebackup.c
src/backend/utils/adt/misc.c
src/bin/initdb/initdb.c
src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_rewind/file_ops.c
src/common/exec.c
src/include/pg_config.h.in
src/include/port.h
src/tools/msvc/Solution.pm

index 232f19a0cd2eb9f0d59033c9c78f9d0e2dd30c4e..1f852078e7531fed45f7283e6e8ac389c57de99a 100755 (executable)
--- a/configure
+++ b/configure
@@ -16039,7 +16039,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred inet_pton kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pthread_is_threaded_np readlink readv setproctitle setproctitle_fast strchrnul strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev
+for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred inet_pton kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pthread_is_threaded_np readv setproctitle setproctitle_fast strchrnul strsignal syncfs sync_file_range uselocale wcstombs_l writev
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17083,9 +17083,6 @@ esac
  ;;
 esac
 
-
-$as_echo "#define HAVE_SYMLINK 1" >>confdefs.h
-
   ac_fn_c_check_type "$LINENO" "MINIDUMP_TYPE" "ac_cv_type_MINIDUMP_TYPE" "
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
index 33dffe0ce5506145e025a9dcee6719b8f65902e4..ca0c65fbd9acbf0231ab87c46833cdcb30971a1d 100644 (file)
@@ -1805,13 +1805,11 @@ AC_CHECK_FUNCS(m4_normalize([
    posix_fallocate
    ppoll
    pthread_is_threaded_np
-   readlink
    readv
    setproctitle
    setproctitle_fast
    strchrnul
    strsignal
-   symlink
    syncfs
    sync_file_range
    uselocale
@@ -1963,8 +1961,6 @@ if test "$PORTNAME" = "win32"; then
   AC_LIBOBJ(win32security)
   AC_LIBOBJ(win32setlocale)
   AC_LIBOBJ(win32stat)
-  AC_DEFINE([HAVE_SYMLINK], 1,
-            [Define to 1 if you have the `symlink' function.])
   AC_CHECK_TYPES(MINIDUMP_TYPE, [pgac_minidump_type=yes], [pgac_minidump_type=no], [
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
index 8903ab2fc9c64f478ce3e36f75699221a0954578..192c500994545f3a6783f03b40b548d5995ddcf5 100644 (file)
@@ -530,13 +530,6 @@ SELECT spcname FROM pg_tablespace;
    is also useful for listing the existing tablespaces.
   </para>
 
-  <para>
-   <productname>PostgreSQL</productname> makes use of symbolic links
-   to simplify the implementation of tablespaces. This
-   means that tablespaces can be used <emphasis>only</emphasis> on systems
-   that support symbolic links.
-  </para>
-
   <para>
    The directory <filename>$PGDATA/pg_tblspc</filename> contains symbolic links that
    point to each of the non-built-in tablespaces defined in the cluster.
index 84fa7ee5e29e22f69e1a78f55cdbfe0f48ad1ac8..9d5ab025261da02250137071a0f27c03d1b5f42e 100644 (file)
@@ -127,10 +127,6 @@ CREATE TABLESPACE <replaceable class="parameter">tablespace_name</replaceable>
  <refsect1>
   <title>Notes</title>
 
-  <para>
-   Tablespaces are only supported on systems that support symbolic links.
-  </para>
-
    <para>
     <command>CREATE TABLESPACE</command> cannot be executed inside a transaction
     block.
index 15ab8d90d4b1df407f2fba5259ff26275ab7f011..26fbed00a4d63cb1f4e6b7211d914ecb1911215c 100644 (file)
@@ -8305,7 +8305,6 @@ do_pg_backup_start(const char *backupidstr, bool fast, TimeLineID *starttli_p,
            if (get_dirent_type(fullpath, de, false, ERROR) != PGFILETYPE_LNK)
                continue;
 
-#if defined(HAVE_READLINK) || defined(WIN32)
            rllen = readlink(fullpath, linkpath, sizeof(linkpath));
            if (rllen < 0)
            {
@@ -8358,17 +8357,6 @@ do_pg_backup_start(const char *backupidstr, bool fast, TimeLineID *starttli_p,
                             ti->oid, escapedpath.data);
 
            pfree(escapedpath.data);
-#else
-
-           /*
-            * If the platform does not have symbolic links, it should not be
-            * possible to have tablespaces - clearly somebody else created
-            * them. Warn about it and ignore.
-            */
-           ereport(WARNING,
-                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                    errmsg("tablespaces are not supported on this platform")));
-#endif
        }
        FreeDir(tblspcdir);
 
index 570ce3dbd5455bc573865cf1b7c0e32ba2e48fcf..526e82e388b2aacbbcc4b0b07923751de270b2eb 100644 (file)
@@ -213,7 +213,6 @@ TablespaceCreateDbspace(Oid spcOid, Oid dbOid, bool isRedo)
 Oid
 CreateTableSpace(CreateTableSpaceStmt *stmt)
 {
-#ifdef HAVE_SYMLINK
    Relation    rel;
    Datum       values[Natts_pg_tablespace];
    bool        nulls[Natts_pg_tablespace] = {0};
@@ -391,12 +390,6 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
    table_close(rel, NoLock);
 
    return tablespaceoid;
-#else                          /* !HAVE_SYMLINK */
-   ereport(ERROR,
-           (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-            errmsg("tablespaces are not supported on this platform")));
-   return InvalidOid;          /* keep compiler quiet */
-#endif                         /* HAVE_SYMLINK */
 }
 
 /*
@@ -407,7 +400,6 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
 void
 DropTableSpace(DropTableSpaceStmt *stmt)
 {
-#ifdef HAVE_SYMLINK
    char       *tablespacename = stmt->tablespacename;
    TableScanDesc scandesc;
    Relation    rel;
@@ -573,11 +565,6 @@ DropTableSpace(DropTableSpaceStmt *stmt)
 
    /* We keep the lock on pg_tablespace until commit */
    table_close(rel, NoLock);
-#else                          /* !HAVE_SYMLINK */
-   ereport(ERROR,
-           (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-            errmsg("tablespaces are not supported on this platform")));
-#endif                         /* HAVE_SYMLINK */
 }
 
 
index 7f85071229b65c1293ad53548fe5070061ceb295..09f071300d44a0722572851ca3fc4230654838d1 100644 (file)
@@ -1330,7 +1330,6 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly,
 #endif
            )
        {
-#if defined(HAVE_READLINK) || defined(WIN32)
            char        linkpath[MAXPGPATH];
            int         rllen;
 
@@ -1349,18 +1348,6 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly,
 
            size += _tarWriteHeader(sink, pathbuf + basepathlen + 1, linkpath,
                                    &statbuf, sizeonly);
-#else
-
-           /*
-            * If the platform does not have symbolic links, it should not be
-            * possible to have tablespaces - clearly somebody else created
-            * them. Warn about it and ignore.
-            */
-           ereport(WARNING,
-                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                    errmsg("tablespaces are not supported on this platform")));
-           continue;
-#endif                         /* HAVE_READLINK */
        }
        else if (S_ISDIR(statbuf.st_mode))
        {
index 89690be2ed1fef9f3817a2d50755e51e4cbbcdfd..af0d924459e4d48e79f2a0976e0efc0a5af4e9e4 100644 (file)
@@ -302,8 +302,6 @@ pg_tablespace_location(PG_FUNCTION_ARGS)
        tablespaceOid == GLOBALTABLESPACE_OID)
        PG_RETURN_TEXT_P(cstring_to_text(""));
 
-#if defined(HAVE_READLINK) || defined(WIN32)
-
    /*
     * Find the location of the tablespace by reading the symbolic link that
     * is in pg_tblspc/<oid>.
@@ -349,12 +347,6 @@ pg_tablespace_location(PG_FUNCTION_ARGS)
    targetpath[rllen] = '\0';
 
    PG_RETURN_TEXT_P(cstring_to_text(targetpath));
-#else
-   ereport(ERROR,
-           (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-            errmsg("tablespaces are not supported on this platform")));
-   PG_RETURN_NULL();
-#endif
 }
 
 /*
index 89b888eaa5aa0b1e951aa641ec6639ea034f1f5a..2c93ffe8114cfa3861a1f8f1ca8045eaf47bedf0 100644 (file)
@@ -2646,13 +2646,9 @@ create_xlog_or_symlink(void)
                pg_fatal("could not access directory \"%s\": %m", xlog_dir);
        }
 
-#ifdef HAVE_SYMLINK
        if (symlink(xlog_dir, subdirloc) != 0)
            pg_fatal("could not create symbolic link \"%s\": %m",
                     subdirloc);
-#else
-       pg_fatal("symlinks are not supported on this platform");
-#endif
    }
    else
    {
index 1a877ba54e444a867ee27f4b4d0540e06c7fa676..8694b05e68c069711098d97ae6afc5f340060113 100644 (file)
@@ -2763,12 +2763,8 @@ main(int argc, char **argv)
                           PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
                           "pg_xlog" : "pg_wal");
 
-#ifdef HAVE_SYMLINK
        if (symlink(xlog_dir, linkloc) != 0)
            pg_fatal("could not create symbolic link \"%s\": %m", linkloc);
-#else
-       pg_fatal("symlinks are not supported on this platform");
-#endif
        free(linkloc);
    }
 
index 6cb288f0992610b23dab42274ae1118c612e71a6..5e6d8b89c49c512694cca95a46c7165ac4d583e5 100644 (file)
@@ -437,7 +437,6 @@ recurse_dir(const char *datadir, const char *parentpath,
        else if (pgwin32_is_junction(fullpath))
 #endif
        {
-#if defined(HAVE_READLINK) || defined(WIN32)
            char        link_target[MAXPGPATH];
            int         len;
 
@@ -460,10 +459,6 @@ recurse_dir(const char *datadir, const char *parentpath,
            if ((parentpath && strcmp(parentpath, "pg_tblspc") == 0) ||
                strcmp(path, "pg_wal") == 0)
                recurse_dir(datadir, path, callback);
-#else
-           pg_fatal("\"%s\" is a symbolic link, but symbolic links are not supported on this platform",
-                    fullpath);
-#endif                         /* HAVE_READLINK */
        }
    }
 
index f7d44b09569caeb7b2c71088312ea97a117dd8ae..fdcad0ee8cf23c087769166cd80f5a225c331e75 100644 (file)
@@ -250,6 +250,10 @@ find_my_exec(const char *argv0, char *retpath)
  * Note: we are not particularly tense about producing nice error messages
  * because we are not really expecting error here; we just determined that
  * the symlink does point to a valid executable.
+ *
+ * Here we test HAVE_READLINK, which excludes Windows.  There's no point in
+ * using our junction point-based replacement code for this, because that only
+ * works for directories.
  */
 static int
 resolve_symlinks(char *path)
index 120eacfb200e840dc37608900be890938e76b692..15e01efa068728614f8bdbeb8fd8e0644fb83daa 100644 (file)
 /* Define to 1 if you have the <readline/readline.h> header file. */
 #undef HAVE_READLINE_READLINE_H
 
-/* Define to 1 if you have the `readlink' function. */
-#undef HAVE_READLINK
-
 /* Define to 1 if you have the `readv' function. */
 #undef HAVE_READV
 
 /* Define to 1 if `tm_zone' is a member of `struct tm'. */
 #undef HAVE_STRUCT_TM_TM_ZONE
 
-/* Define to 1 if you have the `symlink' function. */
-#undef HAVE_SYMLINK
-
 /* Define to 1 if you have the `syncfs' function. */
 #undef HAVE_SYNCFS
 
index 7a1a02f6598a403d12f84a1c0d5336ec4db7eeb1..7dad6caa639923c2959ca538f990b9d2133bc31c 100644 (file)
@@ -522,11 +522,19 @@ extern bool wait_result_is_any_signal(int exit_status, bool include_command_not_
 /*
  * Interfaces that we assume all Unix system have.  We retain individual macros
  * for better documentation.
+ *
+ * For symlink-related functions, there is often no need to test these macros,
+ * because we provided basic support on Windows that can work with absolute
+ * paths to directories.  Code that wants to test for complete symlink support
+ * (including relative paths and non-directories) should be conditional on
+ * HAVE_READLINK or HAVE_SYMLINK.
  */
 #ifndef WIN32
 #define HAVE_GETRLIMIT 1
+#define HAVE_READLINK 1
 #define HAVE_SETSID 1
 #define HAVE_SHM_OPEN 1
+#define HAVE_SYMLINK 1
 #endif
 
 #endif                         /* PG_PORT_H */
index a9680dc863010f6ab758978116ec5bf675eb8e1b..71db5f60f8ac5f945612359fa72086caf8ebfe57 100644 (file)
@@ -337,7 +337,6 @@ sub GenerateFiles
        HAVE_READLINE_H             => undef,
        HAVE_READLINE_HISTORY_H     => undef,
        HAVE_READLINE_READLINE_H    => undef,
-       HAVE_READLINK               => undef,
        HAVE_READV                  => undef,
        HAVE_RL_COMPLETION_MATCHES  => undef,
        HAVE_RL_COMPLETION_SUPPRESS_QUOTE        => undef,
@@ -380,7 +379,6 @@ sub GenerateFiles
        HAVE_STRUCT_SOCKADDR_UN                  => undef,
        HAVE_STRUCT_TM_TM_ZONE                   => undef,
        HAVE_SYNC_FILE_RANGE                     => undef,
-       HAVE_SYMLINK                             => 1,
        HAVE_SYNCFS                              => undef,
        HAVE_SYSLOG                              => undef,
        HAVE_SYS_EPOLL_H                         => undef,