From 37fe854259fe36b4dce0b1a824e5fa88fa064f9c Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Tue, 11 Jan 2022 13:06:32 -0600
Subject: [PATCH 2/2] f!move the mkdir and logfile stuff to a new function
 instead of rearranging get_restricted_token()

---
 src/bin/pg_upgrade/option.c     | 37 -------------------------
 src/bin/pg_upgrade/pg_upgrade.c | 48 ++++++++++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c
index aa4c4d61edf..767935d761f 100644
--- a/src/bin/pg_upgrade/option.c
+++ b/src/bin/pg_upgrade/option.c
@@ -9,7 +9,6 @@
 
 #include "postgres_fe.h"
 
-#include <time.h>
 #ifdef WIN32
 #include <io.h>
 #endif
@@ -64,10 +63,6 @@ parseCommandLine(int argc, char *argv[])
 	int			option;			/* Command line option */
 	int			optindex = 0;	/* used by getopt_long */
 	int			os_user_effective_id;
-	FILE	   *fp;
-	char	  **filename;
-	time_t		run_time = time(NULL);
-	char		filename_path[MAXPGPATH];
 
 	user_opts.do_sync = true;
 	user_opts.transfer_mode = TRANSFER_MODE_COPY;
@@ -217,41 +212,9 @@ parseCommandLine(int argc, char *argv[])
 	if (log_opts.basedir == NULL)
 		log_opts.basedir = "pg_upgrade_output.d";
 
-	if (mkdir(log_opts.basedir, 00700))
-		pg_fatal("could not create directory \"%s\": %m\n", log_opts.basedir);
-
-	snprintf(filename_path, sizeof(filename_path), "%s/log", log_opts.basedir);
-	if (mkdir(filename_path, 00700))
-		pg_fatal("could not create directory \"%s\": %m\n", filename_path);
-
-	snprintf(filename_path, sizeof(filename_path), "%s/dump", log_opts.basedir);
-	if (mkdir(filename_path, 00700))
-		pg_fatal("could not create directory \"%s\": %m\n", filename_path);
-
-	snprintf(filename_path, sizeof(filename_path), "%s/log/%s", log_opts.basedir, INTERNAL_LOG_FILE);
-	if ((log_opts.internal = fopen_priv(filename_path, "a")) == NULL)
-		pg_fatal("could not open log file \"%s\": %m\n", filename_path);
-
 	if (log_opts.verbose)
 		pg_log(PG_REPORT, "Running in verbose mode\n");
 
-	/* label start of upgrade in logfiles */
-	for (filename = output_files; *filename != NULL; filename++)
-	{
-		snprintf(filename_path, sizeof(filename_path), "%s/log/%s",
-				log_opts.basedir, *filename);
-		if ((fp = fopen_priv(filename_path, "a")) == NULL)
-			pg_fatal("could not write to log file \"%s\": %m\n", filename_path);
-
-		/* Start with newline because we might be appending to a file. */
-		fprintf(fp, "\n"
-				"-----------------------------------------------------------------\n"
-				"  pg_upgrade run on %s"
-				"-----------------------------------------------------------------\n\n",
-				ctime(&run_time));
-		fclose(fp);
-	}
-
 	/* Turn off read-only mode;  add prefix to PGOPTIONS? */
 	if (getenv("PGOPTIONS"))
 	{
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
index f90cd74be0e..5ed491f5c23 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -37,6 +37,8 @@
 
 #include "postgres_fe.h"
 
+#include <time.h>
+
 #ifdef HAVE_LANGINFO_H
 #include <langinfo.h>
 #endif
@@ -53,6 +55,7 @@ static void prepare_new_globals(void);
 static void create_new_objects(void);
 static void copy_xact_xlog_xid(void);
 static void set_frozenxids(bool minmxid_only);
+static void make_dirs(void);
 static void setup(char *argv0, bool *live_check);
 static void cleanup(void);
 
@@ -84,9 +87,11 @@ main(int argc, char **argv)
 	/* Set default restrictive mask until new cluster permissions are read */
 	umask(PG_MODE_MASK_OWNER);
 
+	parseCommandLine(argc, argv);
+
 	get_restricted_token();
 
-	parseCommandLine(argc, argv);
+	make_dirs();
 
 	adjust_data_dir(&old_cluster);
 	adjust_data_dir(&new_cluster);
@@ -196,6 +201,47 @@ main(int argc, char **argv)
 	return 0;
 }
 
+static void
+make_dirs(void)
+{
+	FILE	*fp;
+	char	**filename;
+	time_t	run_time = time(NULL);
+	char	filename_path[MAXPGPATH];
+
+	if (mkdir(log_opts.basedir, 00700))
+		pg_fatal("could not create directory \"%s\": %m\n", log_opts.basedir);
+
+	snprintf(filename_path, sizeof(filename_path), "%s/log", log_opts.basedir);
+	if (mkdir(filename_path, 00700))
+		pg_fatal("could not create directory \"%s\": %m\n", filename_path);
+
+	snprintf(filename_path, sizeof(filename_path), "%s/dump", log_opts.basedir);
+	if (mkdir(filename_path, 00700))
+		pg_fatal("could not create directory \"%s\": %m\n", filename_path);
+
+	snprintf(filename_path, sizeof(filename_path), "%s/log/%s", log_opts.basedir, INTERNAL_LOG_FILE);
+	if ((log_opts.internal = fopen_priv(filename_path, "a")) == NULL)
+		pg_fatal("could not open log file \"%s\": %m\n", filename_path);
+
+	/* label start of upgrade in logfiles */
+	for (filename = output_files; *filename != NULL; filename++)
+	{
+		snprintf(filename_path, sizeof(filename_path), "%s/log/%s",
+				log_opts.basedir, *filename);
+		if ((fp = fopen_priv(filename_path, "a")) == NULL)
+			pg_fatal("could not write to log file \"%s\": %m\n", filename_path);
+
+		/* Start with newline because we might be appending to a file. */
+		fprintf(fp, "\n"
+				"-----------------------------------------------------------------\n"
+				"  pg_upgrade run on %s"
+				"-----------------------------------------------------------------\n\n",
+				ctime(&run_time));
+		fclose(fp);
+	}
+}
+
 
 static void
 setup(char *argv0, bool *live_check)
-- 
2.17.1

