13
0

fix SystemExec for windows

This commit is contained in:
Robin Gareus 2014-04-20 02:51:00 +02:00
parent 1ea6321ad5
commit 3552c17b91

View File

@ -23,6 +23,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <algorithm>
#include <assert.h> #include <assert.h>
@ -266,10 +267,16 @@ SystemExec::make_wargs(char **a) {
std::string wa = cmd; std::string wa = cmd;
if (cmd[0] != '"' && cmd[cmd.size()] != '"' && strchr(cmd.c_str(), ' ')) { wa = "\"" + cmd + "\""; } if (cmd[0] != '"' && cmd[cmd.size()] != '"' && strchr(cmd.c_str(), ' ')) { wa = "\"" + cmd + "\""; }
std::replace(cmd.begin(), cmd.end(), '/', '\\' ); std::replace(cmd.begin(), cmd.end(), '/', '\\' );
char **tmp = a; char **tmp = ++a;
while (tmp && *tmp) { while (tmp && *tmp) {
wa.append(" \""); wa.append(" \"");
wa.append(*tmp); std::string arg(*tmp);
size_t start_pos = 0;
while((start_pos = arg.find("\\", start_pos)) != std::string::npos) {
arg.replace(start_pos, 1, "\\\\");
start_pos += 2;
}
wa.append(arg);
wa.append("\""); wa.append("\"");
tmp++; tmp++;
} }
@ -416,7 +423,11 @@ SystemExec::output_interposer()
if (bytesAvail < 1) {Sleep(500); printf("N/A\n"); continue;} if (bytesAvail < 1) {Sleep(500); printf("N/A\n"); continue;}
#endif #endif
if (stdoutP[0] == INVALID_HANDLE_VALUE) break; if (stdoutP[0] == INVALID_HANDLE_VALUE) break;
if (!ReadFile(stdoutP[0], data, BUFSIZ, &bytesRead, 0)) break; if (!ReadFile(stdoutP[0], data, BUFSIZ, &bytesRead, 0)) {
DWORD err = GetLastError();
if (err == ERROR_IO_PENDING) continue;
break;
}
if (bytesRead < 1) continue; /* actually not needed; but this is safe. */ if (bytesRead < 1) continue; /* actually not needed; but this is safe. */
data[bytesRead] = 0; data[bytesRead] = 0;
ReadStdout(data, bytesRead);/* EMIT SIGNAL */ ReadStdout(data, bytesRead);/* EMIT SIGNAL */