Fix for Win32 START - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Fix for Win32 START |
Date | |
Msg-id | 200406111637.i5BGbVR12013@candle.pha.pa.us Whole thread Raw |
List | pgsql-patches |
After digging, I found START can accept a quoted executable name if you put a title of "" before it. I have remove the batch file hack and documented this requirement. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: src/bin/pg_ctl/pg_ctl.c =================================================================== RCS file: /cvsroot/pgsql-server/src/bin/pg_ctl/pg_ctl.c,v retrieving revision 1.15 diff -c -c -r1.15 pg_ctl.c *** src/bin/pg_ctl/pg_ctl.c 11 Jun 2004 04:17:21 -0000 1.15 --- src/bin/pg_ctl/pg_ctl.c 11 Jun 2004 16:32:45 -0000 *************** *** 221,291 **** * 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 "&" */ #ifndef WIN32 snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" >> \"%s\" 2>&1 &%s", #else ! snprintf(cmd, MAXPGPATH, "%sSTART /B %s %s < \"%s\" >> \"%s\" 2>&1%s", #endif ! SYSTEMQUOTE, pgexec, post_opts, DEVNULL, log_file, SYSTEMQUOTE); else #ifndef WIN32 snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" 2>&1 &%s", #else ! snprintf(cmd, MAXPGPATH, "%sSTART /B %s %s < \"%s\" 2>&1%s", #endif ! 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; } --- 221,253 ---- * to pass everything to a shell to process them. */ char cmd[MAXPGPATH]; /* ! * Win32 needs START /B rather than "&". ! * ! * Win32 has a problem with START and quoted executable names. ! * You must add a "" as the title at the beginning so you can quote ! * the executable name: ! * http://www.winnetmag.com/Article/ArticleID/14589/14589.html ! * http://dev.remotenetworktechnology.com/cmd/cmdfaq.htm */ if (log_file != NULL) #ifndef WIN32 snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" >> \"%s\" 2>&1 &%s", #else ! snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s < \"%s\" >> \"%s\" 2>&1%s", #endif ! SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, log_file, SYSTEMQUOTE); else #ifndef WIN32 snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" 2>&1 &%s", #else ! snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s < \"%s\" 2>&1%s", #endif ! SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, SYSTEMQUOTE); ! return system(cmd); }
pgsql-patches by date: