# # # patch "ChangeLog" # from [b59d9d8054808010b55bc448c59ea4d4b46b61ca] # to [8a8cbd196d6e2bd2444e9a38c14046b88005b0fc] # # patch "win32/process.cc" # from [41614776a159bc9ece78cdceacf852c13c497c56] # to [ab93b7be4a7e9855b5441057f647bd95539bbb56] # ============================================================ --- ChangeLog b59d9d8054808010b55bc448c59ea4d4b46b61ca +++ ChangeLog 8a8cbd196d6e2bd2444e9a38c14046b88005b0fc @@ -1,5 +1,9 @@ 2007-02-08 Matthew Gregan + * win32/process.cc: Rework munge_argv_into_cmdline and its helpers + to use std::string rather than char *. Also add + WIN32_LEAN_AND_MEAN and make the rest of the code GNU-style. + * win32/{get_system_flavour.cc, inodeprint.cc, read_password.cc, terminal.cc}: More Win32_LEAN_AND_MEAN. ============================================================ --- win32/process.cc 41614776a159bc9ece78cdceacf852c13c497c56 +++ win32/process.cc ab93b7be4a7e9855b5441057f647bd95539bbb56 @@ -5,31 +5,35 @@ #include #include +#define WIN32_LEAN_AND_MEAN #include #include "sanity.hh" #include "platform.hh" -static std::string munge_inner_argument(const char* arg) +static std::string +munge_inner_argument(std::string arg) { std::string result; bool has_space = false; - int quotes = 0; + unsigned quotes = 0; bool space_outside_quote = false; - const char* arg_end = arg + std::strlen(arg) - 1; - for (const char* c = arg; *c; ++c) { - switch (*c) { - case ' ': - has_space = true; - if (quotes % 2 == 0) - space_outside_quote = true; - break; - case '"': - quotes++; - break; + for (std::string::const_iterator it = arg.begin(); + it != arg.end(); ++it) + { + switch (*it) + { + case ' ': + has_space = true; + if (quotes % 2 == 0) + space_outside_quote = true; + break; + case '"': + ++quotes; + break; + } } - } I(quotes % 2 == 0); @@ -40,14 +44,17 @@ static std::string munge_inner_argument( // copy argument if (quotes == 0) result += arg; - else { - // escape inner quotes - for (const char* c = arg; *c; ++c) { - if (*c == '"' && c != arg && '"' && c != arg_end) - result += '\\'; - result += *c; + else + { + // escape inner quotes + for (std::string::const_iterator it = arg.begin(); + it != arg.end(); ++it) + { + if (*it == '"' && it != arg.begin() && it != arg.end() - 1) + result += '\\'; + result += *it; + } } - } // quote end of argument if (has_space && space_outside_quote) @@ -56,76 +63,85 @@ static std::string munge_inner_argument( return result; } -static std::string munge_argument(const char* arg) +static std::string +munge_argument(std::string arg) { - std::string result; - // handle DOS-style '/file:c:\path to\file.txt' by splitting at the colon // and handling the last part as a standard argument, then reassembling // for the cmdline. - if (arg[0] == '/') { - const char* dos_cmd = std::strchr(arg, ':'); - if (dos_cmd != 0) { - result += std::string(arg, dos_cmd - arg + 1); - result += munge_inner_argument(dos_cmd + 1); - } else - result += arg; - return result; - } - - if (*arg == 0) + if (arg.empty()) return "\"\""; + else if (arg[0] == '/') + { + std::string result; + std::string::size_type dos_cmd = arg.find(':'); + if (dos_cmd != std::string::size_type) + { + result += arg.substr(0, dos_cmd + 1); + result += munge_inner_argument(std::string(dos_cmd + 1)); + } + else + result += arg; + return result; + } else return munge_inner_argument(arg); } -std::string munge_argv_into_cmdline(const char* const argv[]) +std::string +munge_argv_into_cmdline(const char * const argv[]) { std::string cmdline; - for (int i = 0; argv[i]; ++i) { - cmdline += munge_argument(argv[i]); - cmdline += " "; - } + for (int i = 0; argv[i]; ++i) + { + cmdline += munge_argument(std::string(argv[i])); + cmdline += " "; + } return cmdline; } -int existsonpath(const char *exe) +int +existsonpath(const char * exe) { if (SearchPath(NULL, exe, ".exe", 0, NULL, NULL)==0) return -1; return 0; } -bool is_executable(const char *path) +bool +is_executable(const char * path) { return false; /* Basically meaningless on win32 */ } -int make_executable(const char *path) +int +make_executable(const char * path) { return 0; /* Basically meaningless on win32 */ } -pid_t process_spawn(const char * const argv[]) +pid_t +process_spawn(const char * const argv[]) { - char *realexe,*filepart; + char * realexe, * filepart; int realexelen; - std::string cmd,tmp1,tmp2; + std::string cmd, tmp1, tmp2; std::string::iterator it; STARTUPINFO si; PROCESS_INFORMATION pi; - realexelen = strlen(argv[0])+1+MAX_PATH; - realexe = (char*)malloc(realexelen); - if (realexe==NULL) return 0; + realexelen = strlen(argv[0]) + 1 + MAX_PATH; + realexe = new char[realexelen]; + if (realexe == NULL) + return 0; L(FL("searching for exe: %s\n") % argv[0]); - if (SearchPath(NULL, argv[0], ".exe", realexelen, realexe, &filepart)==0) + if (SearchPath(NULL, argv[0], ".exe", realexelen, realexe, &filepart) == 0) { os_err_t errnum = GetLastError(); L(FL("SearchPath failed, err=%s (%d)\n") % os_strerror(errnum) % errnum); - free(realexe); + delete [] realexe; return -1; } @@ -135,16 +151,16 @@ pid_t process_spawn(const char * const a memset(&si, 0, sizeof(si)); si.cb = sizeof(STARTUPINFO); /* We don't need to set any of the STARTUPINFO members */ - if (CreateProcess(realexe, (char*)cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)==0) + if (CreateProcess(realexe, (char *) cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)==0) { os_err_t errnum = GetLastError(); L(FL("CreateProcess failed, err=%s (%d)\n") % os_strerror(errnum) % errnum); - free(realexe); + delete [] realexe; return -1; } - free(realexe); + delete [] realexe; CloseHandle(pi.hThread); - return (pid_t)pi.hProcess; + return (pid_t) pi.hProcess; } struct redir @@ -155,8 +171,9 @@ struct redir redir(int which, char const * file); ~redir(); }; + redir::redir(int which, char const * filename) - : what(which) + : what(which) { if (!filename || *filename == '\0') { @@ -168,52 +185,55 @@ redir::redir(int which, char const * fil sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = 0; sa.bInheritHandle = true; - + file = CreateFile(filename, - (which==0?GENERIC_READ:GENERIC_WRITE), + (which == 0 ? GENERIC_READ:GENERIC_WRITE), FILE_SHARE_READ, &sa, - (which==0?OPEN_EXISTING:CREATE_ALWAYS), + (which == 0 ? OPEN_EXISTING:CREATE_ALWAYS), FILE_ATTRIBUTE_NORMAL, NULL); switch(which) - { - case 0: - saved = GetStdHandle(STD_INPUT_HANDLE); - SetStdHandle(STD_INPUT_HANDLE, file); - break; - case 1: - saved = GetStdHandle(STD_OUTPUT_HANDLE); - SetStdHandle(STD_OUTPUT_HANDLE, file); - break; - case 2: - saved = GetStdHandle(STD_ERROR_HANDLE); - SetStdHandle(STD_ERROR_HANDLE, file); - break; - } + { + case 0: + saved = GetStdHandle(STD_INPUT_HANDLE); + SetStdHandle(STD_INPUT_HANDLE, file); + break; + case 1: + saved = GetStdHandle(STD_OUTPUT_HANDLE); + SetStdHandle(STD_OUTPUT_HANDLE, file); + break; + case 2: + saved = GetStdHandle(STD_ERROR_HANDLE); + SetStdHandle(STD_ERROR_HANDLE, file); + break; + } } + redir::~redir() { switch(what) - { - case 0: - CloseHandle(GetStdHandle(STD_INPUT_HANDLE)); - SetStdHandle(STD_INPUT_HANDLE, saved); - break; - case 1: - CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); - SetStdHandle(STD_OUTPUT_HANDLE, saved); - break; - case 2: - CloseHandle(GetStdHandle(STD_ERROR_HANDLE)); - SetStdHandle(STD_ERROR_HANDLE, saved); - break; - } + { + case 0: + CloseHandle(GetStdHandle(STD_INPUT_HANDLE)); + SetStdHandle(STD_INPUT_HANDLE, saved); + break; + case 1: + CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); + SetStdHandle(STD_OUTPUT_HANDLE, saved); + break; + case 2: + CloseHandle(GetStdHandle(STD_ERROR_HANDLE)); + SetStdHandle(STD_ERROR_HANDLE, saved); + break; + } } -pid_t process_spawn_redirected(char const * in, - char const * out, - char const * err, - char const * const argv[]) + +pid_t +process_spawn_redirected(char const * in, + char const * out, + char const * err, + char const * const argv[]) { try { @@ -228,9 +248,10 @@ pid_t process_spawn_redirected(char cons } } -int process_wait(pid_t pid, int *res, int timeout) +int +process_wait(pid_t pid, int * res, int timeout) { - HANDLE hProcess = (HANDLE)pid; + HANDLE hProcess = static_cast(pid); DWORD time = INFINITE; if (timeout != -1) time = timeout * 1000; @@ -242,27 +263,30 @@ int process_wait(pid_t pid, int *res, in CloseHandle(hProcess); /* May well not work, but won't harm */ return -1; } - if (GetExitCodeProcess(hProcess, (DWORD*)res)==0) + if (GetExitCodeProcess(hProcess, static_cast(res)) == 0) *res = -1; CloseHandle(hProcess); /* Let the process die */ return 0; } -int process_kill(pid_t pid, int signal) +int +process_kill(pid_t pid, int signal) { - HANDLE hProcess = (HANDLE)pid; - if (TerminateProcess(hProcess, 1)==0) + HANDLE hProcess = static_cast(pid); + if (TerminateProcess(hProcess, 1) == 0) return -1; return 0; } -int process_sleep(unsigned int seconds) +int +process_sleep(unsigned int seconds) { - Sleep(seconds*1000); + Sleep(seconds * 1000); return 0; } -pid_t get_process_id() +pid_t +get_process_id() { return GetCurrentProcessId(); }