string result;
bool need_quotes = false;
bool backslash = false;
- for(string::const_iterator i=arg.begin(); i!=arg.end(); ++i)
+ for(char c: arg)
{
- if(*i=='\\')
+ if(c=='\\')
backslash = true;
- else if(*i=='"')
+ else if(c=='"')
{
if(backslash)
result += '\\';
result += '\\';
}
- else if(*i==' ')
+ else if(c==' ')
need_quotes = true;
- result += *i;
+ result += c;
}
if(need_quotes)
void Process::execute(const string &command, bool path_search, const Arguments &args)
{
string cmdline = quote_argument(command);
- for(Arguments::const_iterator i=args.begin(); i!=args.end(); ++i)
- append(cmdline, " ", quote_argument(*i));
+ for(const string &a: args)
+ append(cmdline, " ", quote_argument(a));
STARTUPINFO startup;
startup.cb = sizeof(STARTUPINFO);
}
const char *cmdptr = (path_search ? 0 : command.c_str());
const char *wd = (work_dir.empty() ? 0 : work_dir.c_str());
- if(!CreateProcess(cmdptr, const_cast<char *>(cmdline.c_str()), 0, 0, false, 0, 0, wd, &startup, &priv->info))
+ if(!CreateProcess(cmdptr, const_cast<char *>(cmdline.c_str()), 0, 0, true, 0, 0, wd, &startup, &priv->info))
throw system_error("CreateProcess");
- // XXX Should we close the duplicated handles? What if CreateProcess fails?
+
+ if(redirect)
+ {
+ CloseHandle(startup.hStdInput);
+ CloseHandle(startup.hStdOutput);
+ CloseHandle(startup.hStdError);
+ }
running = true;
{
running = false;
finished = true;
+ DWORD ec;
+ if(GetExitCodeProcess(priv->info.hProcess, &ec))
+ exit_code = ec;
}
return finished;