From 02b183acb42831bbeba819fde568263f19f2acdc Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 19 Mar 2012 09:31:50 -0400
Subject: [PATCH] In pg_upgrade, remove dependency on pg_config, as that might
 not be in the non-development install.  Instead, use the LOAD mechanism to
 check for the pg_upgrade_support shared object, like we do for other shared
 object checks.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Backpatch to 9.1.

Report from Àlvaro
---
 contrib/pg_upgrade/check.c    | 42 -----------------------------------
 contrib/pg_upgrade/function.c | 15 +++++++++----
 2 files changed, 11 insertions(+), 46 deletions(-)

diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
index 4b716b6721e..2669c096586 100644
--- a/contrib/pg_upgrade/check.c
+++ b/contrib/pg_upgrade/check.c
@@ -20,7 +20,6 @@ static void check_is_super_user(ClusterInfo *cluster);
 static void check_for_prepared_transactions(ClusterInfo *cluster);
 static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
 static void check_for_reg_data_type_usage(ClusterInfo *cluster);
-static void check_for_support_lib(ClusterInfo *cluster);
 static void get_bin_version(ClusterInfo *cluster);
 
 
@@ -265,8 +264,6 @@ check_cluster_versions(void)
 void
 check_cluster_compatibility(bool live_check)
 {
-	check_for_support_lib(&new_cluster);
-
 	/* get/check pg_control data of servers */
 	get_control_data(&old_cluster, live_check);
 	get_control_data(&new_cluster, false);
@@ -836,45 +833,6 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
 }
 
 
-/*
- * Test pg_upgrade_support.so is in the proper place.	 We cannot copy it
- * ourselves because install directories are typically root-owned.
- */
-static void
-check_for_support_lib(ClusterInfo *cluster)
-{
-	char		cmd[MAXPGPATH];
-	char		libdir[MAX_STRING];
-	char		libfile[MAXPGPATH];
-	FILE	   *lib_test;
-	FILE	   *output;
-
-	snprintf(cmd, sizeof(cmd), "\"%s/pg_config\" --pkglibdir", cluster->bindir);
-
-	if ((output = popen(cmd, "r")) == NULL ||
-		fgets(libdir, sizeof(libdir), output) == NULL)
-		pg_log(PG_FATAL, "Could not get pkglibdir data using %s: %s\n",
-			   cmd, getErrorText(errno));
-
-
-	pclose(output);
-
-	/* Remove trailing newline */
-	if (strchr(libdir, '\n') != NULL)
-		*strchr(libdir, '\n') = '\0';
-
-	snprintf(libfile, sizeof(libfile), "%s/pg_upgrade_support%s", libdir,
-			 DLSUFFIX);
-
-	if ((lib_test = fopen(libfile, "r")) == NULL)
-		pg_log(PG_FATAL,
-			   "The pg_upgrade_support module must be created and installed in the %s cluster.\n",
-				CLUSTER_NAME(cluster));
-
-	fclose(lib_test);
-}
-
-
 static void
 get_bin_version(ClusterInfo *cluster)
 {
diff --git a/contrib/pg_upgrade/function.c b/contrib/pg_upgrade/function.c
index 322503946ea..fe8fb408cd2 100644
--- a/contrib/pg_upgrade/function.c
+++ b/contrib/pg_upgrade/function.c
@@ -13,6 +13,7 @@
 
 #include "access/transam.h"
 
+#define PG_UPGRADE_SUPPORT	"$libdir/pg_upgrade_support"
 
 /*
  * install_support_functions_in_new_db()
@@ -154,17 +155,17 @@ get_loadable_libraries(void)
 		PQfinish(conn);
 	}
 
+	totaltups++;	/* reserve for pg_upgrade_support */
+
 	/* Allocate what's certainly enough space */
-	if (totaltups > 0)
-		os_info.libraries = (char **) pg_malloc(totaltups * sizeof(char *));
-	else
-		os_info.libraries = NULL;
+	os_info.libraries = (char **) pg_malloc(totaltups * sizeof(char *));
 
 	/*
 	 * Now remove duplicates across DBs.  This is pretty inefficient code, but
 	 * there probably aren't enough entries to matter.
 	 */
 	totaltups = 0;
+	os_info.libraries[totaltups++] = pg_strdup(PG_UPGRADE_SUPPORT);
 
 	for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
 	{
@@ -256,6 +257,12 @@ check_loadable_libraries(void)
 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
 		{
 			found = true;
+
+			/* exit and report missing support library with special message */
+			if (strcmp(lib, PG_UPGRADE_SUPPORT) == 0)
+				pg_log(PG_FATAL,
+				   "The pg_upgrade_support module must be created and installed in the new cluster.\n");
+
 			if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
 				pg_log(PG_FATAL, "Could not open file \"%s\": %s\n",
 					   output_path, getErrorText(errno));
-- 
GitLab