From 5fe8c7d6e50e3a310498f333e4f5130659c931fb Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 11 Jun 2004 00:57:25 +0000 Subject: [PATCH] More restructuring to use Win32 START with paths needing quotes. --- src/bin/pg_ctl/pg_ctl.c | 55 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index fbf11fbbe1..d7d44afbbf 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -4,7 +4,7 @@ * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.13 2004/06/10 22:20:53 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.14 2004/06/11 00:57:25 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -221,6 +221,41 @@ start_postmaster(void) * to pass everything to a shell to process them. */ char cmd[MAXPGPATH]; + int ret; + char *pgexec = postgres_path; + +#ifdef WIN32 + /* + * Win32 has a problem with the interaction between START and system(). + * There is no way to quote the executable name passed to START. + * Therefore, we put the executable name in a temporary batch file + * and run it via START. + */ + char tmp[MAXPGPATH] = "C:\\PG_CTL_XXXXXX", /* good location? */ + bat[MAXPGPATH]; + int fd = mkstemp(tmp); + + if (fd == -1) + { + fprintf(stderr, _("%s: cannot create batch file %s to start server: %s\n"), + progname, tmp, strerror(errno)); + exit(1); + } + write(fd, postgres_path, strlen(postgres_path)); + write(fd, "\n", 1); + close(fd); + + strcpy(bat, tmp); + strcat(bat, ".BAT"); + pgexec = bat; + if (rename(tmp, bat) == -1) + { + fprintf(stderr, _("%s: cannot rename batch file %s to %s: %s\n"), + progname, tmp, bat, strerror(errno)); + unlink(tmp); + exit(1); + } +#endif if (log_file != NULL) /* Win32 needs START /B rather than "&" */ @@ -229,7 +264,7 @@ start_postmaster(void) #else snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" >> \"%s\" 2>&1%s", #endif - SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, log_file, + SYSTEMQUOTE, pgexec, post_opts, DEVNULL, log_file, SYSTEMQUOTE); else #ifndef WIN32 @@ -237,8 +272,20 @@ start_postmaster(void) #else snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" 2>&1%s", #endif - SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, SYSTEMQUOTE); - return system(cmd); + SYSTEMQUOTE, pgexec, post_opts, DEVNULL, SYSTEMQUOTE); + + ret = system(cmd); + +#ifdef WIN32 + /* We are unlinking it while it is running, but that should be OK */ + if (unlink(bat)) + { + fprintf(stderr, _("%s: cannot remove batch file %s: %s\n"), + progname, bat, strerror(errno)); + exit(1); + } +#endif + return ret; } -- 2.40.0