|
|
| version 1.35, 2002/04/16 09:38:49 | version 1.40, 2002/11/20 09:44:43 |
|---|---|
| Line 4 | Line 4 |
| Copyright(c) 2000,2001, 2002 ArtLebedev Group(http://www.artlebedev.com) | Copyright(c) 2000,2001, 2002 ArtLebedev Group(http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| $Id$ | |
| @todo setrlimit | @todo setrlimit |
| */ | */ |
| static const char* IDENT_EXEC_C="$Date$"; | |
| #include "pa_config_includes.h" | #include "pa_config_includes.h" |
| #include "pa_exec.h" | #include "pa_exec.h" |
| Line 27 | Line 26 |
| #ifdef WIN32 | #ifdef WIN32 |
| /// this func from http://www.ccas.ru/~posp/popov/spawn.htm | /// this func from http://www.ccas.ru/~posp/popov/spawn.htm |
| static BOOL WINAPI CreateHiddenConsoleProcess(LPCTSTR szCmdLine, | static DWORD CreateHiddenConsoleProcess(LPCTSTR szCmdLine, |
| char *szEnv, | char *szEnv, |
| PROCESS_INFORMATION* ppi, | PROCESS_INFORMATION* ppi, |
| LPHANDLE phInWrite, | LPHANDLE phInWrite, |
| LPHANDLE phOutRead, | LPHANDLE phOutRead, |
| LPHANDLE phErrRead) | LPHANDLE phErrRead) |
| { | { |
| BOOL fCreated; | DWORD result=0; |
| BOOL fCreated; | |
| STARTUPINFO si; | STARTUPINFO si; |
| SECURITY_ATTRIBUTES sa={0}; | SECURITY_ATTRIBUTES sa={0}; |
| HANDLE hInRead; | HANDLE hInRead; |
| Line 88 static BOOL WINAPI CreateHiddenConsolePr | Line 88 static BOOL WINAPI CreateHiddenConsolePr |
| dir, | dir, |
| &si, | &si, |
| ppi); | ppi); |
| if(!fCreated) | |
| result=GetLastError(); | |
| CloseHandle(hInRead); | CloseHandle(hInRead); |
| CloseHandle(hOutWrite); | CloseHandle(hOutWrite); |
| Line 96 static BOOL WINAPI CreateHiddenConsolePr | Line 98 static BOOL WINAPI CreateHiddenConsolePr |
| if(!fCreated) | if(!fCreated) |
| goto error; | goto error; |
| return TRUE; | return result; |
| error: | error: |
| if(!result/*yet*/) | |
| result=GetLastError(); // get it | |
| CloseHandle(*phInWrite); | CloseHandle(*phInWrite); |
| CloseHandle(*phOutRead); | CloseHandle(*phOutRead); |
| CloseHandle(*phErrRead); | CloseHandle(*phErrRead); |
| return FALSE; | return result; |
| } | } |
| static void read_pipe(String& result, HANDLE hOutRead, const char *file_spec, | static void read_pipe(String& result, HANDLE hOutRead, const char *file_spec, |
| Line 136 static const char *buildCommand(Pool& po | Line 141 static const char *buildCommand(Pool& po |
| string.APPEND_AS_IS(begin, end-begin, | string.APPEND_AS_IS(begin, end-begin, |
| origin_string.origin().file, 0); | origin_string.origin().file, 0); |
| string << " " << file_spec_cstr; | string << " " << file_spec_cstr; |
| if(argv) | |
| for(int i=0; i<argv->size(); i++) | |
| string << argv->get_string(i)->cstr(); | |
| result=string.cstr(); | result=string.cstr(); |
| } | } |
| } | } |
| Line 278 static int get_exit_status(int pid) { | Line 280 static int get_exit_status(int pid) { |
| static void read_pipe(String& result, int file, const char *file_spec, String::Untaint_lang lang){ | static void read_pipe(String& result, int file, const char *file_spec, String::Untaint_lang lang){ |
| while(true) { | while(true) { |
| char *buf=(char *)result.pool().malloc(MAX_STRING); | char *buf=(char *)result.pool().malloc(MAX_STRING); |
| size_t size=read(file, buf, MAX_STRING); | ssize_t size=read(file, buf, MAX_STRING); |
| if(!size) | if(size<=0) |
| break; | break; |
| result.APPEND(buf, size, lang, file_spec, 0); | result.APPEND(buf, size, lang, file_spec, 0); |
| } | } |
| Line 299 static void append_env_pair(const Hash:: | Line 301 static void append_env_pair(const Hash:: |
| string << key << "=" << *static_cast<String *>(value); | string << key << "=" << *static_cast<String *>(value); |
| char ***env_ref=static_cast<char ***>(info); | char ***env_ref=static_cast<char ***>(info); |
| **env_ref=string.cstr(); (*env_ref)++; | **env_ref=string.cstr(String::UL_PASSAPPENED); (*env_ref)++; |
| #endif | #endif |
| } | } |
| Line 330 int pa_exec( | Line 332 int pa_exec( |
| env->for_each(append_env_pair, &string); | env->for_each(append_env_pair, &string); |
| env_cstr=string.cstr(); | 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:"<unknown>", (long)error); | |
| } else { | |
| const char *in_cstr=in.cstr(); | const char *in_cstr=in.cstr(); |
| DWORD written_size; | DWORD written_size; |
| WriteFile(hInWrite, in_cstr, in.size(), &written_size, NULL); | WriteFile(hInWrite, in_cstr, in.size(), &written_size, NULL); |
| Line 351 from http://www.apache.org/websrc/cvsweb | Line 367 from http://www.apache.org/websrc/cvsweb |
| */ | */ |
| CloseHandle(pi.hProcess); | CloseHandle(pi.hProcess); |
| CloseHandle(pi.hThread); | 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 | #else |