Thread: Fix for Win32 START

Fix for Win32 START

From
Bruce Momjian
Date:
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);
  }