]> granicus.if.org Git - postgresql/blobdiff - contrib/pg_upgrade/check.c
Adjust pg_upgrade check for pg_upgrade_support to happen after the
[postgresql] / contrib / pg_upgrade / check.c
index 2b481da4895ddae9ef46d0ff39d0c845bee78258..377dea2b6f758fba8ba53f7713b7e2e640b547f5 100644 (file)
@@ -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);
+}