|
|
| version 1.48.2.10, 2003/02/04 12:08:57 | version 1.48.2.12, 2003/02/06 14:24:50 |
|---|---|
| Line 111 error: | Line 111 error: |
| return result; | return result; |
| } | } |
| static void read_pipe(Pool& pool, StringPtr result, HANDLE hOutRead, const char* file_spec, | static StringPtr read_pipe(Pool& pool, HANDLE hOutRead, const char* file_spec, |
| String::Untaint_lang lang){ | String::Untaint_lang lang){ |
| StringPtr result(new String); | |
| while(true) { | while(true) { |
| char *buf=new(pool) char[MAX_STRING]; | char *buf=new(pool) char[MAX_STRING]; |
| unsigned long size; | unsigned long size; |
| Line 120 static void read_pipe(Pool& pool, String | Line 121 static void read_pipe(Pool& pool, String |
| break; | break; |
| result->APPEND(buf, size, lang, file_spec, 0); | result->APPEND(buf, size, lang, file_spec, 0); |
| } | } |
| return result; | |
| } | } |
| static CharPtr buildCommand(CharPtr file_spec_cstr, Array<StringPtr>& argv) { | static CharPtr buildCommand(CharPtr file_spec_cstr, ArrayString& argv) { |
| CharPtr result=file_spec_cstr; | CharPtr result=file_spec_cstr; |
| if(FILE *f=fopen(file_spec_cstr, "r")) { | if(FILE *f=fopen(file_spec_cstr, "r")) { |
| try { | try { |
| Line 277 static int get_exit_status(int pid) { | Line 279 static int get_exit_status(int pid) { |
| WEXITSTATUS(status) : -2; | WEXITSTATUS(status) : -2; |
| } | } |
| static void read_pipe(Pool& pool, StringPtr result, int file, const char* file_spec, String::Untaint_lang lang){ | static StringPtr read_pipe(Pool& pool, int file, const char* file_spec, String::Untaint_lang lang){ |
| StringPtr result(new String); | |
| while(true) { | while(true) { |
| char *buf=new(pool) char[MAX_STRING]; | char *buf=new(pool) char[MAX_STRING]; |
| ssize_t size=read(file, buf, MAX_STRING); | ssize_t size=read(file, buf, MAX_STRING); |
| Line 285 static void read_pipe(Pool& pool, String | Line 288 static void read_pipe(Pool& pool, String |
| break; | break; |
| result->APPEND(buf, size, lang, file_spec, 0); | result->APPEND(buf, size, lang, file_spec, 0); |
| } | } |
| return result; | |
| } | } |
| #endif | #endif |
| Line 314 static void append_env_pair(HashStringSt | Line 318 static void append_env_pair(HashStringSt |
| } | } |
| /// @todonow unix part to smart_ptr | /// @todonow unix part to smart_ptr |
| int pa_exec(Pool& pool, | PA_exec_result pa_exec(Pool& pool, |
| bool forced_allow, | bool forced_allow, |
| StringPtr file_spec, | StringPtr file_spec, |
| HashStringString& env, | HashStringString& env, |
| Array<StringPtr>& argv, | ArrayString& argv, |
| StringPtr in, StringPtr out, StringPtr err) { | String& in) { |
| PA_exec_result result; | |
| #ifdef NO_PA_EXECS | #ifdef NO_PA_EXECS |
| if(!forced_allow) | if(!forced_allow) |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| Line 355 int pa_exec(Pool& pool, | Line 361 int pa_exec(Pool& pool, |
| "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 { |
| CharPtr in_cstr=in->cstr(); | CharPtr 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); |
| // EOF for stupid text reads | // EOF for stupid text reads |
| // normally they should read CONTENT_LENGTH bytes, | // normally they should read CONTENT_LENGTH bytes, |
| // without this char | // without this char |
| WriteFile(hInWrite, "\x1A", 1, &written_size, NULL); | WriteFile(hInWrite, "\x1A", 1, &written_size, NULL); |
| CloseHandle(hInWrite); | CloseHandle(hInWrite); |
| read_pipe(pool, out, hOutRead, file_spec_cstr, String::UL_AS_IS); | result.out=read_pipe(pool, hOutRead, file_spec_cstr, String::UL_AS_IS); |
| CloseHandle(hOutRead); | CloseHandle(hOutRead); |
| read_pipe(pool, err, hErrRead, file_spec_cstr, String::UL_TAINTED); | result.err=read_pipe(pool, hErrRead, file_spec_cstr, String::UL_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 428 from http://www.apache.org/websrc/cvsweb | Line 434 from http://www.apache.org/websrc/cvsweb |
| write(pipe_write, in_cstr, in->size()); | write(pipe_write, in_cstr, in->size()); |
| } | } |
| close(pipe_write); | close(pipe_write); |
| read_pipe(pool, out, pipe_read, file_spec_cstr, String::UL_AS_IS); | result.out=read_pipe(pool, pipe_read, file_spec_cstr, String::UL_AS_IS); |
| close(pipe_read); | close(pipe_read); |
| read_pipe(pool, err, pipe_err, file_spec_cstr, String::UL_TAINTED); | result.err=read_pipe(pool, pipe_err, file_spec_cstr, String::UL_TAINTED); |
| close(pipe_err); | close(pipe_err); |
| return get_exit_status(pid); // negative may mean "-errno[execl()]" | result.status=get_exit_status(pid); // negative may mean "-errno[execl()]" |
| } else | } else |
| throw Exception(0, | throw Exception(0, |
| file_spec, | file_spec, |
| "%s error: %s (%d)", pid<0?"fork":"pipe", strerror(errno), errno); | "%s error: %s (%d)", pid<0?"fork":"pipe", strerror(errno), errno); |
| #endif | #endif |
| return 0; | return result; |
| } | } |