ben 97/11/16 07:43:20
Modified: src ApacheCore.mak CHANGES Makefile.nt src/main conf.h http_main.c util_script.c src/os/win32 os.h util_win32.c Log: Deal with Win32 spawn of the Devil problems. Also add buildmark support (I know, I know, these should be separate, but I'm in a hurry and I forgot). Revision Changes Path 1.21 +138 -65 apachen/src/ApacheCore.mak Index: ApacheCore.mak =================================================================== RCS file: /export/home/cvs/apachen/src/ApacheCore.mak,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- ApacheCore.mak 1997/10/20 20:19:11 1.20 +++ ApacheCore.mak 1997/11/16 15:43:11 1.21 @@ -28,10 +28,6 @@ NULL=nul !ENDIF -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - !IF "$(CFG)" == "ApacheCore - Win32 Release" OUTDIR=.\CoreR @@ -53,6 +49,7 @@ CLEAN : [EMAIL PROTECTED] "$(INTDIR)\alloc.obj" [EMAIL PROTECTED] "$(INTDIR)\buff.obj" + [EMAIL PROTECTED] "$(INTDIR)\buildmark.obj" [EMAIL PROTECTED] "$(INTDIR)\explain.obj" [EMAIL PROTECTED] "$(INTDIR)\fnmatch.obj" [EMAIL PROTECTED] "$(INTDIR)\getopt.obj" @@ -102,12 +99,46 @@ "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" +CPP=cl.exe CPP_PROJ=/nologo /MD /W3 /GX /O2 /I ".\regex" /I ".\main" /D "WIN32" /D\ "NDEBUG" /D "_WINDOWS" /Fp"$(INTDIR)\ApacheCore.pch" /YX /Fo"$(INTDIR)\\"\ /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=.\CoreR/ CPP_SBRS=. + +.c{$(CPP_OBJS)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(CPP_OBJS)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(CPP_OBJS)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(CPP_SBRS)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(CPP_SBRS)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(CPP_SBRS)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +MTL=midl.exe MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\ApacheCore.bsc" BSC32_SBRS= \ @@ -123,6 +154,7 @@ LINK32_OBJS= \ "$(INTDIR)\alloc.obj" \ "$(INTDIR)\buff.obj" \ + "$(INTDIR)\buildmark.obj" \ "$(INTDIR)\explain.obj" \ "$(INTDIR)\fnmatch.obj" \ "$(INTDIR)\getopt.obj" \ @@ -193,6 +225,8 @@ [EMAIL PROTECTED] "$(INTDIR)\alloc.sbr" [EMAIL PROTECTED] "$(INTDIR)\buff.obj" [EMAIL PROTECTED] "$(INTDIR)\buff.sbr" + [EMAIL PROTECTED] "$(INTDIR)\buildmark.obj" + [EMAIL PROTECTED] "$(INTDIR)\buildmark.sbr" [EMAIL PROTECTED] "$(INTDIR)\explain.obj" [EMAIL PROTECTED] "$(INTDIR)\explain.sbr" [EMAIL PROTECTED] "$(INTDIR)\fnmatch.obj" @@ -287,17 +321,52 @@ "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" +CPP=cl.exe CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I ".\regex" /I ".\main" /D "WIN32"\ /D "_DEBUG" /D "_WINDOWS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\ApacheCore.pch" /YX\ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=.\CoreD/ CPP_SBRS=.\CoreD/ + +.c{$(CPP_OBJS)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(CPP_OBJS)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(CPP_OBJS)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(CPP_SBRS)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(CPP_SBRS)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(CPP_SBRS)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +MTL=midl.exe MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\ApacheCore.bsc" BSC32_SBRS= \ "$(INTDIR)\alloc.sbr" \ "$(INTDIR)\buff.sbr" \ + "$(INTDIR)\buildmark.sbr" \ "$(INTDIR)\explain.sbr" \ "$(INTDIR)\fnmatch.sbr" \ "$(INTDIR)\getopt.sbr" \ @@ -356,6 +425,7 @@ LINK32_OBJS= \ "$(INTDIR)\alloc.obj" \ "$(INTDIR)\buff.obj" \ + "$(INTDIR)\buildmark.obj" \ "$(INTDIR)\explain.obj" \ "$(INTDIR)\fnmatch.obj" \ "$(INTDIR)\getopt.obj" \ @@ -405,36 +475,6 @@ !ENDIF -.c{$(CPP_OBJS)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(CPP_OBJS)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(CPP_OBJS)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(CPP_SBRS)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(CPP_SBRS)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(CPP_SBRS)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - !IF "$(CFG)" == "ApacheCore - Win32 Release" || "$(CFG)" ==\ "ApacheCore - Win32 Debug" @@ -446,6 +486,7 @@ ".\main\alloc.h"\ ".\main\buff.h"\ ".\main\conf.h"\ + ".\main\http_log.h"\ ".\main\httpd.h"\ ".\main\multithread.h"\ ".\os\win32\os.h"\ @@ -486,6 +527,7 @@ ".\main\alloc.h"\ ".\main\buff.h"\ ".\main\conf.h"\ + ".\main\http_log.h"\ ".\main\http_main.h"\ ".\main\httpd.h"\ ".\os\win32\os.h"\ @@ -503,6 +545,7 @@ ".\main\alloc.h"\ ".\main\buff.h"\ ".\main\conf.h"\ + ".\main\http_log.h"\ ".\main\http_main.h"\ ".\main\httpd.h"\ ".\os\win32\os.h"\ @@ -517,13 +560,36 @@ !ENDIF +SOURCE=.\buildmark.c + +!IF "$(CFG)" == "ApacheCore - Win32 Release" + + +"$(INTDIR)\buildmark.obj" : $(SOURCE) "$(INTDIR)" + + +!ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" + + +"$(INTDIR)\buildmark.obj" "$(INTDIR)\buildmark.sbr" : $(SOURCE) "$(INTDIR)" + + +!ENDIF + SOURCE=.\main\explain.c -DEP_CPP_EXPLA=\ - ".\main\explain.h"\ - !IF "$(CFG)" == "ApacheCore - Win32 Release" +DEP_CPP_EXPLA=\ + ".\main\alloc.h"\ + ".\main\buff.h"\ + ".\main\conf.h"\ + ".\main\explain.h"\ + ".\main\httpd.h"\ + ".\os\win32\os.h"\ + ".\os\win32\readdir.h"\ + ".\regex\regex.h"\ + "$(INTDIR)\explain.obj" : $(SOURCE) $(DEP_CPP_EXPLA) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) @@ -531,6 +597,16 @@ !ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" +DEP_CPP_EXPLA=\ + ".\main\alloc.h"\ + ".\main\buff.h"\ + ".\main\conf.h"\ + ".\main\explain.h"\ + ".\main\httpd.h"\ + ".\os\win32\os.h"\ + ".\os\win32\readdir.h"\ + ".\regex\regex.h"\ + "$(INTDIR)\explain.obj" "$(INTDIR)\explain.sbr" : $(SOURCE) $(DEP_CPP_EXPLA)\ "$(INTDIR)" @@ -1986,9 +2062,6 @@ !ENDIF SOURCE=.\os\win32\service.c - -!IF "$(CFG)" == "ApacheCore - Win32 Release" - DEP_CPP_SERVI=\ ".\main\conf.h"\ ".\main\multithread.h"\ @@ -1997,19 +2070,15 @@ ".\regex\regex.h"\ +!IF "$(CFG)" == "ApacheCore - Win32 Release" + + "$(INTDIR)\service.obj" : $(SOURCE) $(DEP_CPP_SERVI) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" -DEP_CPP_SERVI=\ - ".\main\conf.h"\ - ".\main\multithread.h"\ - ".\os\win32\os.h"\ - ".\os\win32\service.h"\ - ".\regex\regex.h"\ - "$(INTDIR)\service.obj" "$(INTDIR)\service.sbr" : $(SOURCE) $(DEP_CPP_SERVI)\ "$(INTDIR)" @@ -2027,6 +2096,7 @@ ".\main\buff.h"\ ".\main\conf.h"\ ".\main\http_conf_globals.h"\ + ".\main\http_log.h"\ ".\main\httpd.h"\ ".\os\win32\os.h"\ ".\os\win32\readdir.h"\ @@ -2044,6 +2114,7 @@ ".\main\buff.h"\ ".\main\conf.h"\ ".\main\http_conf_globals.h"\ + ".\main\http_log.h"\ ".\main\httpd.h"\ ".\os\win32\os.h"\ ".\os\win32\readdir.h"\ @@ -2058,6 +2129,9 @@ !ENDIF SOURCE=.\main\util_date.c + +!IF "$(CFG)" == "ApacheCore - Win32 Release" + DEP_CPP_UTIL_D=\ ".\main\conf.h"\ ".\main\util_date.h"\ @@ -2065,15 +2139,18 @@ ".\regex\regex.h"\ -!IF "$(CFG)" == "ApacheCore - Win32 Release" - - "$(INTDIR)\util_date.obj" : $(SOURCE) $(DEP_CPP_UTIL_D) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" +DEP_CPP_UTIL_D=\ + ".\main\conf.h"\ + ".\main\util_date.h"\ + ".\os\win32\os.h"\ + ".\regex\regex.h"\ + "$(INTDIR)\util_date.obj" "$(INTDIR)\util_date.sbr" : $(SOURCE)\ $(DEP_CPP_UTIL_D) "$(INTDIR)" @@ -2179,21 +2256,26 @@ !ENDIF SOURCE=.\main\util_snprintf.c + +!IF "$(CFG)" == "ApacheCore - Win32 Release" + DEP_CPP_UTIL_SN=\ ".\main\conf.h"\ ".\os\win32\os.h"\ ".\regex\regex.h"\ -!IF "$(CFG)" == "ApacheCore - Win32 Release" - - "$(INTDIR)\util_snprintf.obj" : $(SOURCE) $(DEP_CPP_UTIL_SN) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" +DEP_CPP_UTIL_SN=\ + ".\main\conf.h"\ + ".\os\win32\os.h"\ + ".\regex\regex.h"\ + "$(INTDIR)\util_snprintf.obj" "$(INTDIR)\util_snprintf.sbr" : $(SOURCE)\ $(DEP_CPP_UTIL_SN) "$(INTDIR)" @@ -2203,9 +2285,6 @@ !ENDIF SOURCE=.\os\win32\util_win32.c - -!IF "$(CFG)" == "ApacheCore - Win32 Release" - DEP_CPP_UTIL_W=\ ".\main\alloc.h"\ ".\main\buff.h"\ @@ -2216,21 +2295,15 @@ ".\regex\regex.h"\ +!IF "$(CFG)" == "ApacheCore - Win32 Release" + + "$(INTDIR)\util_win32.obj" : $(SOURCE) $(DEP_CPP_UTIL_W) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" -DEP_CPP_UTIL_W=\ - ".\main\alloc.h"\ - ".\main\buff.h"\ - ".\main\conf.h"\ - ".\main\httpd.h"\ - ".\os\win32\os.h"\ - ".\os\win32\readdir.h"\ - ".\regex\regex.h"\ - "$(INTDIR)\util_win32.obj" "$(INTDIR)\util_win32.sbr" : $(SOURCE)\ $(DEP_CPP_UTIL_W) "$(INTDIR)" 1.515 +9 -6 apachen/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apachen/src/CHANGES,v retrieving revision 1.514 retrieving revision 1.515 diff -u -r1.514 -r1.515 --- CHANGES 1997/11/16 02:17:01 1.514 +++ CHANGES 1997/11/16 15:43:12 1.515 @@ -1,8 +1,11 @@ Changes with Apache 1.3b3 + *) WIN32: Work around brain-damaged spawn calls that can't deal + with spaces and slashes. [Ben Laurie] + *) WIN32: Fix the code so CGIs can use socket calls on Windows. - The problem was that certain environment variables needed for - sockets to work under Win32 were not being passed. + The problem was that certain undocumented environment variables + needed for sockets to work under Win32 were not being passed. [Frank Faubert <[EMAIL PROTECTED]>] *) Add a "-V" command line flag to the httpd binary. This @@ -158,9 +161,9 @@ *) Make single-exe Windows install. [Ben Laurie and Eric Esselink] - *) Make CGI work under Win95. [Ben Laurie and Paul Sutton] + *) WIN32: Make CGI work under Win95. [Ben Laurie and Paul Sutton] - *) Make index.html and friends work under Win95. [Ben Laurie] + *) WIN32: Make index.html and friends work under Win95. [Ben Laurie] *) PORT: Solaris 2.4 needs Spencer regex, the system regex is broken. [John Line <[EMAIL PROTECTED]>] PR#1321 @@ -413,7 +416,7 @@ *) Further enhance aplog_error() to not log filename, line number, and errno information when it isn't applicable. [Ken Coar, Dean Gaudet] - *) Canonicalise filenames under Win32. Short filenames are + *) WIN32: Canonicalise filenames under Win32. Short filenames are converted to long ones. Backslashes are converted to forward slashes. Case is converted to lower. Parts of URLs that do not correspond to files are left completely alone. [Ben Laurie] @@ -821,7 +824,7 @@ if there is one. If there isn't one, the behaviour is unchanged. [Ken Coar, Roy Fielding, Andrey A. Chernov] - *) On Win32, modules can now be dynamically loaded DLLs using the + *) WIN32: Modules can now be dynamically loaded DLLs using the LoadModule/LoadFile directives. Note that module DLLs must be compiled with the multithreaded DLL version of the runtime library. [Alexei Kosut and Ben Laurie] 1.18 +6 -4 apachen/src/Makefile.nt Index: Makefile.nt =================================================================== RCS file: /export/home/cvs/apachen/src/Makefile.nt,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- Makefile.nt 1997/10/10 08:26:31 1.17 +++ Makefile.nt 1997/11/16 15:43:13 1.18 @@ -18,10 +18,11 @@ set CFG=regex - Win32 Release nmake /nologo -f regex.mak cd .. - set CFG=ApacheCore - Win32 Release - nmake /nologo -f ApacheCore.mak - set CFG=Apache - Win32 Release - nmake /nologo -f Apache.mak + del CoreR\buildmark.obj + set CFG=ApacheCore - Win32 Release + nmake /nologo -f ApacheCore.mak + set CFG=Apache - Win32 Release + nmake /nologo -f Apache.mak cd os\win32 set CFG=ApacheModuleStatus - Win32 Release nmake /nologo -f ApacheModuleStatus.mak @@ -56,6 +57,7 @@ set CFG=regex - Win32 Debug nmake /nologo -f regex.mak cd .. + del CoreD\buildmark.obj set CFG=ApacheCore - Win32 Debug nmake /nologo -f ApacheCore.mak set CFG=Apache - Win32 Debug 1.161 +2 -0 apachen/src/main/conf.h Index: conf.h =================================================================== RCS file: /export/home/cvs/apachen/src/main/conf.h,v retrieving revision 1.160 retrieving revision 1.161 diff -u -r1.160 -r1.161 --- conf.h 1997/11/13 17:05:16 1.160 +++ conf.h 1997/11/16 15:43:15 1.161 @@ -63,6 +63,8 @@ #include <sys/stat.h> #ifdef WIN32 +/* include process.h first so we can override spawn[lv]e* properly */ +#include <process.h> #include "../os/win32/os.h" #else #include "os.h" 1.252 +0 -4 apachen/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/http_main.c,v retrieving revision 1.251 retrieving revision 1.252 diff -u -r1.251 -r1.252 --- http_main.c 1997/11/15 19:04:51 1.251 +++ http_main.c 1997/11/16 15:43:16 1.252 @@ -2647,9 +2647,7 @@ #else printf("Server version \"%s\"\n", SERVER_VERSION); #endif -#ifndef WIN32 printf("Server built: %s\n", SERVER_BUILT); -#endif printf("Server compiled with....\n"); #ifdef BIG_SECURITY_HOLE printf(" -D BIG_SECURITY_HOLE\n"); @@ -4325,9 +4323,7 @@ break; case 'v': printf("Server version %s.\n", SERVER_VERSION); -#ifndef WIN32 printf("Server built: %s\n", SERVER_BUILT); -#endif exit(0); case 'V': show_compile_settings(); 1.84 +0 -7 apachen/src/main/util_script.c Index: util_script.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/util_script.c,v retrieving revision 1.83 retrieving revision 1.84 diff -u -r1.83 -r1.84 --- util_script.c 1997/11/12 00:50:44 1.83 +++ util_script.c 1997/11/16 15:43:17 1.84 @@ -680,7 +680,6 @@ int i, sz; char *dot; char *exename; - char *s; int is_exe = 0; interpreter[0] = 0; @@ -745,12 +744,6 @@ } } - /* FIXME: Probably ought to do this in another buffer - Ben - * This really annoys me - Win95 (and not NT) spawn[vl]e don't - * like '/'! - Ben */ - for (s = r->filename; *s; ++s) - if (*s == '/') - *s = '\\'; if ((!r->args) || (!r->args[0]) || (ind(r->args, '=') >= 0)) { if (is_exe || is_binary) { 1.7 +11 -1 apachen/src/os/win32/os.h Index: os.h =================================================================== RCS file: /export/home/cvs/apachen/src/os/win32/os.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- os.h 1997/10/21 09:12:13 1.6 +++ os.h 1997/11/16 15:43:19 1.7 @@ -21,7 +21,7 @@ #define NO_USE_SIGACTION #define NO_TIMES #define NO_GETTIMEOFDAY -#define NEED_PROCESS_H +//#define NEED_PROCESS_H although we do, this is specially handled in conf.h #define USE_LONGJMP #define HAVE_MMAP #define MULTITHREAD @@ -82,3 +82,13 @@ #define stat(f,ps) os_stat(f,ps) API_EXPORT(int) os_stat(const char *szPath,struct stat *pStat); + +#define _spawnv(mode,cmdname,argv) os_spawnv(mode,cmdname,argv) +#define spawnv(mode,cmdname,argv) os_spawnv(mode,cmdname,argv) +API_EXPORT(int) os_spawnv(int mode,const char *cmdname,const char *const *argv); +#define _spawnve(mode,cmdname,argv,envp) os_spawnve(mode,cmdname,argv,envp) +#define spawnve(mode,cmdname,argv,envp) os_spawnve(mode,cmdname,argv,envp) +API_EXPORT(int) os_spawnve(int mode,const char *cmdname,const char *const *argv,const char *const *envp); +#define _spawnle os_spawnle +#define spawnle os_spawnle +API_EXPORT(int) os_spawnle(int mode,const char *cmdname,...); 1.3 +132 -0 apachen/src/os/win32/util_win32.c Index: util_win32.c =================================================================== RCS file: /export/home/cvs/apachen/src/os/win32/util_win32.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- util_win32.c 1997/10/21 09:12:14 1.2 +++ util_win32.c 1997/11/16 15:43:19 1.3 @@ -1,6 +1,7 @@ #include <windows.h> #include <assert.h> #include <sys/stat.h> +#include <stdarg.h> #include "httpd.h" @@ -86,3 +87,134 @@ } return stat(szPath,pStat); } + +/* +Fix two really crap problems with Win32 spawn[lv]e*: + + 1. Win32 doesn't deal with spaces in argv. + 2. Win95 doesn't like / in cmdname. +*/ + +#undef _spawnv +API_EXPORT(int) os_spawnv(int mode,const char *cmdname,const char *const *argv) +{ + int n; + char **aszArgs; + const char *szArg; + char *szCmd; + char *s; + + szCmd=_alloca(strlen(cmdname)+1); + strcpy(szCmd,cmdname); + for(s=szCmd ; *s ; ++s) + if(*s == '/') + *s='\\'; + + for(n=0 ; argv[n] ; ++n) + ; + + aszArgs=_alloca((n+1)*sizeof(const char *)); + + for(n=0 ; szArg=argv[n] ; ++n) + if(strchr(szArg,' ')) + { + int l=strlen(szArg); + + aszArgs[n]=_alloca(l+2+1); + aszArgs[n][0]='"'; + strcpy(&aszArgs[n][1],szArg); + aszArgs[n][l+1]='"'; + aszArgs[n][l+2]='\0'; + } + else + aszArgs[n]=(char *)szArg; + + aszArgs[n]=NULL; + + return _spawnv(mode,szCmd,aszArgs); + } + +#undef _spawnve +API_EXPORT(int) os_spawnve(int mode,const char *cmdname,const char *const *argv,const char *const *envp) +{ + int n; + char **aszArgs; + const char *szArg; + char *szCmd; + char *s; + + szCmd=_alloca(strlen(cmdname)+1); + strcpy(szCmd,cmdname); + for(s=szCmd ; *s ; ++s) + if(*s == '/') + *s='\\'; + + for(n=0 ; argv[n] ; ++n) + ; + + aszArgs=_alloca((n+1)*sizeof(const char *)); + + for(n=0 ; szArg=argv[n] ; ++n) + if(strchr(szArg,' ')) + { + int l=strlen(szArg); + + aszArgs[n]=_alloca(l+2+1); + aszArgs[n][0]='"'; + strcpy(&aszArgs[n][1],szArg); + aszArgs[n][l+1]='"'; + aszArgs[n][l+2]='\0'; + } + else + aszArgs[n]=(char *)szArg; + + aszArgs[n]=NULL; + + return _spawnve(mode,szCmd,aszArgs,envp); + } + +API_EXPORT(int) os_spawnle(int mode,const char *cmdname,...) +{ + int n; + va_list vlist; + char **aszArgs; + const char *szArg; + const char *const *aszEnv; + char *szCmd; + char *s; + + szCmd=_alloca(strlen(cmdname)+1); + strcpy(szCmd,cmdname); + for(s=szCmd ; *s ; ++s) + if(*s == '/') + *s='\\'; + + va_start(vlist,cmdname); + for(n=0 ; va_arg(vlist,const char *) ; ++n) + ; + va_end(vlist); + + aszArgs=_alloca((n+1)*sizeof(const char *)); + + va_start(vlist,cmdname); + for(n=0 ; szArg=va_arg(vlist,const char *) ; ++n) + if(strchr(szArg,' ')) + { + int l=strlen(szArg); + + aszArgs[n]=_alloca(l+2+1); + aszArgs[n][0]='"'; + strcpy(&aszArgs[n][1],szArg); + aszArgs[n][l+1]='"'; + aszArgs[n][l+2]='\0'; + } + else + aszArgs[n]=(char *)szArg; + + aszArgs[n]=NULL; + + aszEnv=va_arg(vlist,const char *const *); + va_end(vlist); + + return _spawnve(mode,szCmd,aszArgs,aszEnv); + }