You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rb...@hyperreal.org on 1999/12/15 02:15:31 UTC

cvs commit: apache-2.0/src/lib/apr/threadproc/win32 proc.c

rbb         99/12/14 17:15:31

  Modified:    src/lib/apr/threadproc/win32 proc.c
  Log:
  Fix process creation on Windows.  We need to pretty much always provide absolute
  paths instead of relative paths when we want to specify a new directory.
  Submitted by:	Allan Edwards
  Reviewed by:	Ryan Bloom
  
  Revision  Changes    Path
  1.13      +47 -3     apache-2.0/src/lib/apr/threadproc/win32/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/threadproc/win32/proc.c,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- proc.c	1999/11/01 20:02:37	1.12
  +++ proc.c	1999/12/15 01:15:30	1.13
  @@ -151,7 +151,21 @@
   ap_status_t ap_setprocattr_dir(struct procattr_t *attr, 
                                  const char *dir) 
   {
  -    attr->currdir = ap_pstrdup(attr->cntxt, dir);
  +    char path[MAX_PATH];
  +    int length;
  +
  +    if (dir[0] != '\\' && dir[1] != ':') { 
  +        length = GetCurrentDirectory(MAX_PATH, path);
  +
  +        if (length == 0 || length + strlen(dir) + 1 >= MAX_PATH)
  +            return APR_ENOMEM;
  +
  +        attr->currdir = ap_pstrcat(attr->cntxt, path, "\\", dir, NULL);
  +    }
  +    else {
  +        attr->currdir = ap_pstrdup(attr->cntxt, dir);
  +    }
  +
       if (attr->currdir) {
           return APR_SUCCESS;
       }
  @@ -212,9 +226,39 @@
           if (attr->child_err) {
               attr->si.hStdError = attr->child_err->filehand;
           }
  +    }
  +
  +    if (attr->cmdtype == APR_PROGRAM) {
  +        if (attr->currdir == NULL) {
  +            cmdline = ap_pstrdup(cont, progname);
  +        }
  +        else {
  +            cmdline = ap_pstrcat(cont, attr->currdir, "\\", progname, NULL);
  +        }
       }
  -    cmdline = ap_pstrdup(cont, progname);
  -    i = 0;
  +    else {
  +        char * shell_cmd;
  +        OSVERSIONINFO osver;
  +        osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  +
  +        /*
  +         * Use CMD.EXE for NT, COMMAND.COM for WIN95
  +         */
  +        if (GetVersionEx(&osver)) {
  +            if (osver.dwPlatformId != VER_PLATFORM_WIN32_NT) {
  +            shell_cmd = ap_pstrdup(cont, "COMMAND.COM /C ");
  +         }
  +         else {
  +            shell_cmd = ap_pstrdup(cont, "CMD.EXE /C ");
  +          }
  +       }
  +       else {
  +          shell_cmd = ap_pstrdup(cont, "CMD.EXE /C ");
  +       }
  +       cmdline = ap_pstrcat(cont, shell_cmd, progname, NULL);
  +    }
  +
  +    i = 1;
       while (args && args[i]) {
           cmdline = ap_pstrcat(cont, cmdline, " ", args[i], NULL);
           i++;