From f3e393318ba36ef543f77fb8983902d466ebe8c8 Mon Sep 17 00:00:00 2001 From: Dan McGee 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