From ed589ab0349b8ce020c5a7872ce1ac3603ba8557 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 14 May 2011 21:27:31 +0900 Subject: [PATCH] Run batch file with cmd.exe. Quoted user command. It seems that we have to specify the full path to cmd.exe in the first argument of CreateProcess() to run batch file in proper manner. We first determine the full path to cmd.exe. To do this, we get windir environment variable and concatenate it with "\system32\cmd.exe". --- src/util.cc | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/util.cc b/src/util.cc index 5c7d320d..c31e836e 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1478,12 +1478,12 @@ void executeHook { const std::string gidStr = util::itos(gid); const std::string numFilesStr = util::uitos(numFiles); +#ifndef __MINGW32__ A2_LOG_INFO(fmt("Executing user command: %s %s %s %s", command.c_str(), gidStr.c_str(), numFilesStr.c_str(), firstFilename.c_str())); -#ifndef __MINGW32__ pid_t cpid = fork(); if(cpid == -1) { A2_LOG_ERROR("fork() failed. Cannot execute user command."); @@ -1506,11 +1506,30 @@ void executeHook memset(&pi, 0, sizeof (pi)); - std::string cmdline = command; + bool batch = util::endsWith(util::toLower(command), ".bat"); + std::string cmdline; + std::string cmdexe; + if(batch) { + const char* p = getenv("windir"); + if(p) { + cmdexe = std::string(p); + cmdexe += "\\system32\\cmd.exe"; + } else { + A2_LOG_INFO("Failed to get windir environment variable." + " Executing batch file will fail."); + // TODO Might be useless. + cmdexe = "cmd.exe"; + } + cmdline += "/C \""; + } + strappend(cmdline, "\"", command, "\""); strappend(cmdline, " ", gidStr, " ", numFilesStr, " \"", firstFilename, "\""); - + if(batch) { + cmdline += "\""; + } + A2_LOG_INFO(fmt("Executing user command: %s", cmdline.c_str())); DWORD rc = CreateProcess( - NULL, + batch ? cmdexe.c_str() : NULL, (LPSTR)cmdline.c_str(), NULL, NULL,