--- parser3/src/main/pa_exec.C 2002/04/16 09:38:49 1.35 +++ parser3/src/main/pa_exec.C 2002/11/20 09:44:43 1.40 @@ -4,12 +4,11 @@ Copyright(c) 2000,2001, 2002 ArtLebedev Group(http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: pa_exec.C,v 1.35 2002/04/16 09:38:49 paf Exp $ - - @todo setrlimit */ +static const char* IDENT_EXEC_C="$Date: 2002/11/20 09:44:43 $"; + #include "pa_config_includes.h" #include "pa_exec.h" @@ -27,14 +26,15 @@ #ifdef WIN32 /// this func from http://www.ccas.ru/~posp/popov/spawn.htm -static BOOL WINAPI CreateHiddenConsoleProcess(LPCTSTR szCmdLine, +static DWORD CreateHiddenConsoleProcess(LPCTSTR szCmdLine, char *szEnv, PROCESS_INFORMATION* ppi, LPHANDLE phInWrite, LPHANDLE phOutRead, LPHANDLE phErrRead) { - BOOL fCreated; + DWORD result=0; + BOOL fCreated; STARTUPINFO si; SECURITY_ATTRIBUTES sa={0}; HANDLE hInRead; @@ -88,6 +88,8 @@ static BOOL WINAPI CreateHiddenConsolePr dir, &si, ppi); + if(!fCreated) + result=GetLastError(); CloseHandle(hInRead); CloseHandle(hOutWrite); @@ -96,14 +98,17 @@ static BOOL WINAPI CreateHiddenConsolePr if(!fCreated) goto error; - return TRUE; + return result; error: + if(!result/*yet*/) + result=GetLastError(); // get it + CloseHandle(*phInWrite); CloseHandle(*phOutRead); CloseHandle(*phErrRead); - return FALSE; + return result; } static void read_pipe(String& result, HANDLE hOutRead, const char *file_spec, @@ -136,9 +141,6 @@ static const char *buildCommand(Pool& po string.APPEND_AS_IS(begin, end-begin, origin_string.origin().file, 0); string << " " << file_spec_cstr; - if(argv) - for(int i=0; isize(); i++) - string << argv->get_string(i)->cstr(); result=string.cstr(); } } @@ -278,8 +280,8 @@ static int get_exit_status(int pid) { static void read_pipe(String& result, int file, const char *file_spec, String::Untaint_lang lang){ while(true) { char *buf=(char *)result.pool().malloc(MAX_STRING); - size_t size=read(file, buf, MAX_STRING); - if(!size) + ssize_t size=read(file, buf, MAX_STRING); + if(size<=0) break; result.APPEND(buf, size, lang, file_spec, 0); } @@ -299,7 +301,7 @@ static void append_env_pair(const Hash:: string << key << "=" << *static_cast(value); char ***env_ref=static_cast(info); - **env_ref=string.cstr(); (*env_ref)++; + **env_ref=string.cstr(String::UL_PASSAPPENED); (*env_ref)++; #endif } @@ -330,7 +332,21 @@ int pa_exec( env->for_each(append_env_pair, &string); env_cstr=string.cstr(); } - if(CreateHiddenConsoleProcess(cmd, env_cstr, &pi, &hInWrite, &hOutRead, &hErrRead)) { + if(DWORD error=CreateHiddenConsoleProcess(cmd, env_cstr, &pi, &hInWrite, &hOutRead, &hErrRead)) { + char szErrorDesc[MAX_STRING]; + char *param="the file you tried to run"; + size_t error_size=FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUMENT_ARRAY , NULL, error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), + szErrorDesc, sizeof(szErrorDesc), ¶m); + if(error_size>3) // ".\r\n" + szErrorDesc[error_size-3]=0; + + throw Exception(0, + &file_spec, + "exec failed - %s (%ld). Consider adding shbang line (#!x:\\interpreter\\command line)", + error_size?szErrorDesc:"", (long)error); + } else { const char *in_cstr=in.cstr(); DWORD written_size; WriteFile(hInWrite, in_cstr, in.size(), &written_size, NULL); @@ -351,21 +367,6 @@ from http://www.apache.org/websrc/cvsweb */ CloseHandle(pi.hProcess); CloseHandle(pi.hThread); - } else { - DWORD error=GetLastError(); - char szErrorDesc[MAX_STRING]; - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, - MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), - szErrorDesc, sizeof(szErrorDesc), NULL); - size_t error_size=strlen(szErrorDesc); - if(error_size>3) // ".\r\n" - szErrorDesc[error_size-3]=0; - - throw Exception(0, - &file_spec, - "(real command line=\"%s\") exec failed - %s (%ld)", - cmd, - szErrorDesc, (long)error); } #else