From f3e393318ba36ef543f77fb8983902d466ebe8c8 Mon Sep 17 00:00:00 2001
From: Dan McGee <dan@archlinux.org>
Date: Tue, 21 Jun 2011 18:49:47 -0500
Subject: [PATCH 2/3] pg_upgrade: remove libpath from cluster info struct

We only use this item in one check and then no longer need it.
Additionally, get_pkglibdir() is currently run before we do our checks
on the bin/ directory, so an incorrectly specified bin/ directory will
evoke failures at the "wrong" point.

Move the entire function into the file that uses it so it can remain
static.
---
 contrib/pg_upgrade/check.c      |   35 +++++++++++++++++++++++++++++-
 contrib/pg_upgrade/option.c     |   45 ---------------------------------------
 contrib/pg_upgrade/pg_upgrade.h |    1 -
 3 files changed, 34 insertions(+), 47 deletions(-)

diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
index 2b481da..5ff2d81 100644
--- a/contrib/pg_upgrade/check.c
+++ b/contrib/pg_upgrade/check.c
@@ -19,6 +19,7 @@ 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 char *get_pkglibdir(const char *bindir);
 
 
 void
@@ -246,14 +247,17 @@ void
 check_cluster_compatibility(bool live_check)
 {
 	char		libfile[MAXPGPATH];
+	char	   *libpath;
 	FILE	   *lib_test;
 
 	/*
 	 * Test pg_upgrade_support.so is in the proper place.	 We cannot copy it
 	 * ourselves because install directories are typically root-owned.
 	 */
-	snprintf(libfile, sizeof(libfile), "%s/pg_upgrade_support%s", new_cluster.libpath,
+	libpath = get_pkglibdir(new_cluster.bindir);
+	snprintf(libfile, sizeof(libfile), "%s/pg_upgrade_support%s", libpath,
 			 DLSUFFIX);
+	pg_free(libpath);
 
 	if ((lib_test = fopen(libfile, "r")) == NULL)
 		pg_log(PG_FATAL,
@@ -730,3 +734,32 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
 	else
 		check_ok();
 }
+
+
+static char *
+get_pkglibdir(const char *bindir)
+{
+	char		cmd[MAXPGPATH];
+	char		bufin[MAX_STRING];
+	FILE	   *output;
+	int			i;
+
+	snprintf(cmd, sizeof(cmd), "\"%s/pg_config\" --pkglibdir", bindir);
+
+	if ((output = popen(cmd, "r")) == NULL)
+		pg_log(PG_FATAL, "Could not get pkglibdir data: %s\n",
+			   getErrorText(errno));
+
+	fgets(bufin, sizeof(bufin), output);
+
+	if (output)
+		pclose(output);
+
+	/* Remove trailing newline */
+	i = strlen(bufin) - 1;
+
+	if (bufin[i] == '\n')
+		bufin[i] = '\0';
+
+	return pg_strdup(bufin);
+}
diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c
index 8153e30..18ce9d7 100644
--- a/contrib/pg_upgrade/option.c
+++ b/contrib/pg_upgrade/option.c
@@ -19,8 +19,6 @@
 static void usage(void);
 static void validateDirectoryOption(char **dirpath,
 				   char *envVarName, char *cmdLineOption, char *description);
-static void get_pkglibdirs(void);
-static char *get_pkglibdir(const char *bindir);
 
 
 UserOpts	user_opts;
@@ -213,8 +211,6 @@ parseCommandLine(int argc, char *argv[])
 							"old cluster data resides");
 	validateDirectoryOption(&new_cluster.pgdata, "NEWDATADIR", "-D",
 							"new cluster data resides");
-
-	get_pkglibdirs();
 }
 
 
@@ -314,44 +310,3 @@ validateDirectoryOption(char **dirpath, char *envVarName,
 #endif
 		(*dirpath)[strlen(*dirpath) - 1] = 0;
 }
-
-
-static void
-get_pkglibdirs(void)
-{
-	/*
-	 * we do not need to know the libpath in the old cluster, and might not
-	 * have a working pg_config to ask for it anyway.
-	 */
-	old_cluster.libpath = NULL;
-	new_cluster.libpath = get_pkglibdir(new_cluster.bindir);
-}
-
-
-static char *
-get_pkglibdir(const char *bindir)
-{
-	char		cmd[MAXPGPATH];
-	char		bufin[MAX_STRING];
-	FILE	   *output;
-	int			i;
-
-	snprintf(cmd, sizeof(cmd), "\"%s/pg_config\" --pkglibdir", bindir);
-
-	if ((output = popen(cmd, "r")) == NULL)
-		pg_log(PG_FATAL, "Could not get pkglibdir data: %s\n",
-			   getErrorText(errno));
-
-	fgets(bufin, sizeof(bufin), output);
-
-	if (output)
-		pclose(output);
-
-	/* Remove trailing newline */
-	i = strlen(bufin) - 1;
-
-	if (bufin[i] == '\n')
-		bufin[i] = '\0';
-
-	return pg_strdup(bufin);
-}
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index a3a0856..c27b58a 100644
--- a/contrib/pg_upgrade/pg_upgrade.h
+++ b/contrib/pg_upgrade/pg_upgrade.h
@@ -185,7 +185,6 @@ typedef struct
 	uint32		major_version;	/* PG_VERSION of cluster */
 	char		major_version_str[64];	/* string PG_VERSION of cluster */
 	Oid			pg_database_oid;	/* OID of pg_database relation */
-	char	   *libpath;		/* pathname for cluster's pkglibdir */
 	char	   *tablespace_suffix;		/* directory specification */
 } ClusterInfo;
 
-- 
1.7.5.4

