diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c index 06af6d4278..66a70cac8a 100644 --- a/contrib/pg_upgrade/option.c +++ b/contrib/pg_upgrade/option.c @@ -57,7 +57,7 @@ parseCommandLine(int argc, char *argv[]) int optindex = 0; /* used by getopt_long */ int os_user_effective_id; FILE *fp; - int i; + char **filename; time_t run_time = time(NULL); user_opts.transfer_mode = TRANSFER_MODE_COPY; @@ -188,11 +188,12 @@ parseCommandLine(int argc, char *argv[]) } /* label start of upgrade in logfiles */ - for (i = 0; i < NUM_LOG_FILES; i++) + for (filename = output_files; *filename != NULL; filename++) { - if ((fp = fopen_priv(output_files[i], "a")) == NULL) - pg_log(PG_FATAL, "cannot write to log file %s\n", - output_files[i]); + if ((fp = fopen_priv(*filename, "a")) == NULL) + pg_log(PG_FATAL, "cannot write to log file %s\n", *filename); + + /* Start with newline because we might be appending to a file. */ fprintf(fp, "\n" "-----------------------------------------------------------------\n" " pg_upgrade run on %s" diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c index cc74f11808..7297efd124 100644 --- a/contrib/pg_upgrade/pg_upgrade.c +++ b/contrib/pg_upgrade/pg_upgrade.c @@ -55,11 +55,16 @@ ClusterInfo old_cluster, new_cluster; OSInfo os_info; -char *output_files[NUM_LOG_FILES] = { +char *output_files[] = { SERVER_LOG_FILE, +#ifdef WIN32 + /* file is unique on Win32 */ + SERVER_LOG_FILE2, +#endif RESTORE_LOG_FILE, UTILITY_LOG_FILE, - INTERNAL_LOG_FILE + INTERNAL_LOG_FILE, + NULL }; @@ -454,21 +459,14 @@ cleanup(void) /* Remove dump and log files? */ if (!log_opts.retain) { - char filename[MAXPGPATH]; - int i; + char **filename; - for (i = 0; i < NUM_LOG_FILES; i++) - { - snprintf(filename, sizeof(filename), "%s", output_files[i]); - unlink(filename); - } + for (filename = output_files; *filename != NULL; filename++) + unlink(*filename); /* remove SQL files */ - snprintf(filename, sizeof(filename), "%s", ALL_DUMP_FILE); - unlink(filename); - snprintf(filename, sizeof(filename), "%s", GLOBALS_DUMP_FILE); - unlink(filename); - snprintf(filename, sizeof(filename), "%s", DB_DUMP_FILE); - unlink(filename); + unlink(ALL_DUMP_FILE); + unlink(GLOBALS_DUMP_FILE); + unlink(DB_DUMP_FILE); } } diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index 6dcb1a5b50..0d6269a850 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -40,7 +40,6 @@ #define UTILITY_LOG_FILE "pg_upgrade_utility.log" #define INTERNAL_LOG_FILE "pg_upgrade_internal.log" -#define NUM_LOG_FILES 4 extern char *output_files[]; /* @@ -49,8 +48,10 @@ extern char *output_files[]; * On Win32, we can't send both pg_upgrade output and command output to the * same file because we get the error: "The process cannot access the file * because it is being used by another process." so send the pg_ctl - * command-line output to the utility log file on Windows, rather than - * into the server log file. + * command-line output to a new file, rather than into the server log file. + * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms + * keep the pg_ctl output file open even after pg_ctl exits, perhaps by the + * running postmaster. * * We could use the Windows pgwin32_open() flags to allow shared file * writes but is unclear how all other tools would use those flags, so @@ -60,7 +61,7 @@ extern char *output_files[]; #ifndef WIN32 #define SERVER_LOG_FILE2 SERVER_LOG_FILE #else -#define SERVER_LOG_FILE2 UTILITY_LOG_FILE +#define SERVER_LOG_FILE2 "pg_upgrade_server2.log" #endif