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
  [EMAIL PROTECTED]               |  (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);
  }
  
  
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to