Diff for /parser3/src/main/pa_exec.C between versions 1.48.2.18.2.4 and 1.48.2.18.2.7

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()]"

Removed from v.1.48.2.18.2.4  
changed lines
  Added in v.1.48.2.18.2.7


E-mail: