|
|
| version 1.48.2.18.2.4, 2003/03/20 14:19:09 | version 1.48.2.18.2.7, 2003/03/21 15:00:36 |
|---|---|
| Line 111 error: | Line 111 error: |
| return result; | return result; |
| } | } |
| static const String& read_pipeHANDLE hOutRead, const char* file_spec, | static void read_pipe(String& result, HANDLE hOutRead, String::Language lang){ |
| String::Untaint_lang lang){ | |
| const String& result(new String); | |
| while(true) { | while(true) { |
| char *buf=new char[MAX_STRING]; | char *buf=new(PointerFreeGC) char[MAX_STRING]; |
| unsigned long size; | unsigned long size; |
| if(!ReadFile(hOutRead, buf, MAX_STRING, &size, NULL) || !size) | if(!ReadFile(hOutRead, buf, MAX_STRING, &size, NULL) || !size) |
| break; | break; |
| result->APPEND(buf, size, lang, file_spec, 0); | result.append(buf, size, lang); |
| } | } |
| return result; | |
| } | } |
| static const char* buildCommand(const char* file_spec_cstr, const ArrayString& argv) { | static const char* buildCommand(const char* file_spec_cstr, const ArrayString& argv) { |
| Line 279 static int get_exit_status(int pid) { | Line 276 static int get_exit_status(int pid) { |
| WEXITSTATUS(status) : -2; | WEXITSTATUS(status) : -2; |
| } | } |
| static const String& read_pipeint file, const char* file_spec, String::Untaint_lang lang){ | static void read_pipe(String& result, int file, String::Language lang){ |
| const String& result(new String); | |
| while(true) { | while(true) { |
| char *buf=new char[MAX_STRING]; | char *buf=new(PointerFreeGC) char[MAX_STRING]; |
| ssize_t size=read(file, buf, MAX_STRING); | ssize_t size=read(file, buf, MAX_STRING); |
| if(size<=0) | if(size<=0) |
| break; | break; |
| result->APPEND(buf, size, lang, file_spec, 0); | result.append(buf, size, lang); |
| } | } |
| return result; | |
| } | } |
| #endif | #endif |
| Line 296 static const String& read_pipeint file, | Line 291 static const String& read_pipeint file, |
| #ifndef DOXYGEN | #ifndef DOXYGEN |
| struct Append_env_pair_info { | struct Append_env_pair_info { |
| #ifdef WIN32 | #ifdef WIN32 |
| String* string; | String& string; |
| Append_env_pair_info(String& astring): string(astring) {} | |
| #else | #else |
| ; | |
| char **env_ref; | char **env_ref; |
| #endif | #endif |
| }; | }; |
| #endif | #endif |
| ///@test maybe here and at argv construction --- cstr(String::UL_UNSPECIFIED | ///@test maybe here and at argv construction --- cstr(String::L_UNSPECIFIED |
| static void append_env_pair(HashStringString::key_type key, HashStringString::value_type value, | static void append_env_pair(HashStringString::key_type key, HashStringString::value_type value, |
| Append_env_pair_info *info) { | Append_env_pair_info *info) { |
| #ifdef WIN32 | #ifdef WIN32 |
| *info->string << key << "=" << value; | info->string << key << "=" << *value; |
| info->string->APPEND_AS_IS("", 1, 0, 0); // zero byte | info->string.append("", 1, String::L_AS_IS); // zero byte |
| #else | #else |
| String string; | String string; |
| string << key << "=" << value; | string << key << "=" << *value; |
| *(info->env_ref++)=string.cstr(*info->String::UL_UNSPECIFIED); | *(info->env_ref++)=string.cstr(*info->String::L_UNSPECIFIED); |
| #endif | #endif |
| } | } |
| Line 329 PA_exec_result pa_exec( | Line 324 PA_exec_result pa_exec( |
| #ifdef NO_PA_EXECS | #ifdef NO_PA_EXECS |
| if(!forced_allow) | if(!forced_allow) |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| file_spec, | &file_spec, |
| "parser execs are disabled [recompile parser without --disable-execs configure option]"); | "parser execs are disabled [recompile parser without --disable-execs configure option]"); |
| #endif | #endif |
| char* file_spec_cstr=file_spec->cstr(String::UL_FILE_SPEC); | const char* file_spec_cstr=file_spec.cstr(String::L_FILE_SPEC); |
| #ifdef WIN32 | #ifdef WIN32 |
| PROCESS_INFORMATION pi; | PROCESS_INFORMATION pi; |
| HANDLE hInWrite, hOutRead, hErrRead; | HANDLE hInWrite, hOutRead, hErrRead; |
| const char* cmd=buildCommand(file_spec->cstr(String::UL_FILE_SPEC), argv); | const char* cmd=buildCommand(file_spec.cstr(String::L_FILE_SPEC), argv); |
| const char* env_cstr; | char* env_cstr; |
| if(env) { | if(env) { |
| String string; | String string; |
| Append_env_pair_info info={&string}; | Append_env_pair_info info(string); |
| env->for_each(append_env_pair, &info); | env->for_each(append_env_pair, &info); |
| env_cstr=info.string->cstr(String::UL_UNSPECIFIED); | env_cstr=info.string.cstrm(String::L_UNSPECIFIED); |
| } | } |
| if(DWORD error=CreateHiddenConsoleProcess(cmd, env_cstr, &pi, &hInWrite, &hOutRead, &hErrRead)) { | if(DWORD error=CreateHiddenConsoleProcess(cmd, env_cstr, &pi, &hInWrite, &hOutRead, &hErrRead)) { |
| char szErrorDesc[MAX_STRING]; | char szErrorDesc[MAX_STRING]; |
| Line 357 PA_exec_result pa_exec( | Line 352 PA_exec_result pa_exec( |
| szErrorDesc[error_size-3]=0; | szErrorDesc[error_size-3]=0; |
| throw Exception(0, | throw Exception(0, |
| file_spec, | &file_spec, |
| "exec failed - %s (%ld). Consider adding shbang line (#!x:\\interpreter\\command line)", | "exec failed - %s (%ld). Consider adding shbang line (#!x:\\interpreter\\command line)", |
| error_size?szErrorDesc:"<unknown>", (long)error); | error_size?szErrorDesc:"<unknown>", (long)error); |
| } else { | } else { |
| Line 369 PA_exec_result pa_exec( | Line 364 PA_exec_result pa_exec( |
| // without this char | // without this char |
| WriteFile(hInWrite, "\x1A", 1, &written_size, NULL); | WriteFile(hInWrite, "\x1A", 1, &written_size, NULL); |
| CloseHandle(hInWrite); | CloseHandle(hInWrite); |
| result.out=read_pipe(hOutRead, file_spec_cstr, String::UL_AS_IS); | read_pipe(result.out, hOutRead, String::L_AS_IS); |
| CloseHandle(hOutRead); | CloseHandle(hOutRead); |
| result.err=read_pipe(hErrRead, file_spec_cstr, String::UL_TAINTED); | read_pipe(result.err, hErrRead, String::L_TAINTED); |
| CloseHandle(hErrRead); | CloseHandle(hErrRead); |
| /* | /* |
| from http://www.apache.org/websrc/cvsweb.cgi/apache-1.3/src/main/util_script.c?rev=1.151&content-type=text/vnd.viewcvs-markup | from http://www.apache.org/websrc/cvsweb.cgi/apache-1.3/src/main/util_script.c?rev=1.151&content-type=text/vnd.viewcvs-markup |
| Line 436 from http://www.apache.org/websrc/cvsweb | Line 431 from http://www.apache.org/websrc/cvsweb |
| write(pipe_write, in_cstr, in.length()); | write(pipe_write, in_cstr, in.length()); |
| } | } |
| close(pipe_write); | close(pipe_write); |
| result.out=read_pipe(pipe_read, file_spec_cstr, String::UL_AS_IS); | result.out=read_pipe(pipe_read, file_spec_cstr, String::L_AS_IS); |
| close(pipe_read); | close(pipe_read); |
| result.err=read_pipe(pipe_err, file_spec_cstr, String::UL_TAINTED); | result.err=read_pipe(pipe_err, file_spec_cstr, String::L_TAINTED); |
| close(pipe_err); | close(pipe_err); |
| result.status=get_exit_status(pid); // negative may mean "-errno[execl()]" | result.status=get_exit_status(pid); // negative may mean "-errno[execl()]" |