From c6635bd7ba4618b7d8507c77d2226f889e3d37d9 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 22 Jun 2011 17:47:24 -0400 Subject: [PATCH] Adjust pg_upgrade check for pg_upgrade_support to happen after the binary directory has been validated. Backpatch to 9.1. Dan McGee --- contrib/pg_upgrade/check.c | 56 ++++++++++++++++++++++++--------- contrib/pg_upgrade/option.c | 45 -------------------------- contrib/pg_upgrade/pg_upgrade.h | 1 - 3 files changed, 41 insertions(+), 61 deletions(-) diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c index 2b481da489..377dea2b6f 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 void check_for_support_lib(ClusterInfo *cluster); void @@ -245,21 +246,7 @@ check_cluster_versions(void) void check_cluster_compatibility(bool live_check) { - char libfile[MAXPGPATH]; - 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, - DLSUFFIX); - - if ((lib_test = fopen(libfile, "r")) == NULL) - pg_log(PG_FATAL, - "pg_upgrade_support%s must be created and installed in %s\n", DLSUFFIX, libfile); - else - fclose(lib_test); + check_for_support_lib(&new_cluster); /* get/check pg_control data of servers */ get_control_data(&old_cluster, live_check); @@ -730,3 +717,42 @@ check_for_reg_data_type_usage(ClusterInfo *cluster) else check_ok(); } + + +/* + * 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) + pg_log(PG_FATAL, "Could not get pkglibdir data: %s\n", + getErrorText(errno)); + + fgets(libdir, sizeof(libdir), output); + + 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); +} diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c index abb74a5bfa..735ee6758d 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(); } @@ -316,44 +312,3 @@ validateDirectoryOption(char **dirpath, #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 a3a0856309..c27b58aa58 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; -- 2.40.0