13 #include "boost/version.hpp"
14 #include "boost/filesystem/convenience.hpp"
21 namespace bf = boost::filesystem;
23 int run_script(std::string
const& shell, std::string
const& script) {
27 if((pid = fork()) < 0) {
28 std::cerr <<
"fork failed, to run " << script << std::endl;;
33 execlp(shell.c_str(),
"sh",
"-c", script.c_str(),
static_cast<char const*
>(0));
34 std::cerr <<
"child failed becuase '" << strerror(errno) <<
"'\n";
37 while(waitpid(pid, &status, 0) < 0) {
39 std::cerr <<
"child process failed " << strerror(errno) <<
"\n";
43 if(WIFSIGNALED(status)) {
44 std::cerr <<
"child existed because of a signal " << WTERMSIG(status) <<
"\n";
48 if(WIFSIGNALED(status)) {
49 std::cerr <<
"child existed because of a signal " << WTERMSIG(status) <<
"\n";
51 if(WIFEXITED(status)) {
58 bf::path currentPath(bf::initial_path().
string());
61 std::cout <<
"Usage: " << argv[0] <<
" shell subdir script1 script2 ... scriptN\n\n"
62 <<
"where shell is the path+shell (e.g., /bin/bash) intended to run the scripts\n"
63 <<
"and subdir is the subsystem/package/subdir in which the scripts are found\n"
64 <<
"(e.g., FWCore/Utilities/test)\n"
67 std::cout <<
"Current directory is: " << currentPath.string() <<
'\n';
72 std::cout <<
"Executable name: " << argv[0] <<
'\n';
76 char const* goodDirectory =
"[A-Za-z0-9/_.-]+";
79 std::cout <<
"argument " <<
i <<
": " << argv[
i] <<
'\n';
82 std::string shell(argv[1]);
83 std::cerr <<
"shell is: " << shell <<
'\n';
85 std::cout <<
"Current directory is: " << currentPath.string() <<
'\n';
88 char const* topdir = getenv(
"SCRAMRT_LOCALRT");
89 if(!topdir) topdir = getenv(
"LOCALRT");
92 std::cerr <<
"Invalid top directory '" << topdir <<
"'" << std::endl;;
96 catch(std::runtime_error
const&
e) {
97 std::cerr <<
"Invalid top directory '" << topdir <<
"'" << std::endl;;
102 char const* arch = getenv(
"SCRAM_ARCH");
107 #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 47
108 std::string maybe_arch = exepath.parent_path().filename().string();
110 std::string maybe_arch = exepath.branch_path().leaf();
112 if(setenv(
"SCRAM_ARCH", maybe_arch.c_str(), 1) != 0) {
113 std::cerr <<
"SCRAM_ARCH not set and attempt to set it failed\n";
116 arch = getenv(
"SCRAM_ARCH");
122 std::cerr <<
"Neither SCRAMRT_LOCALRT nor LOCALRT is defined" << std::endl;;
128 std::cerr <<
"Invalid test directory '" << argv[2] <<
"'" << std::endl;;
132 catch(std::runtime_error
const& e) {
133 std::cerr <<
"Invalid test directory '" << argv[2] <<
"'" << std::endl;;
138 std::string testdir(topdir); testdir +=
"/src/"; testdir += argv[2];
139 std::string tmpdir(topdir); tmpdir +=
"/tmp/"; tmpdir += arch;
140 std::string testbin(topdir); testbin +=
"/test/"; testbin += arch;
142 std::cout <<
"topdir is: " << topdir <<
'\n';
143 std::cout <<
"testdir is: " << testdir <<
'\n';
144 std::cout <<
"tmpdir is: " << tmpdir <<
'\n';
145 std::cout <<
"testbin is: " << testbin <<
'\n';
147 if(setenv(
"LOCAL_TEST_DIR", testdir.c_str(),1) != 0) {
148 std::cerr <<
"Could not set LOCAL_TEST_DIR to " << testdir << std::endl;;
151 if(setenv(
"LOCAL_TMP_DIR", tmpdir.c_str(),1) != 0) {
152 std::cerr <<
"Could not set LOCAL_TMP_DIR to " << tmpdir << std::endl;;
155 if(setenv(
"LOCAL_TOP_DIR", topdir,1) != 0) {
156 std::cerr <<
"Could not set LOCAL_TOP_DIR to " << topdir << std::endl;;
159 if(setenv(
"LOCAL_TEST_BIN", testbin.c_str(),1) != 0) {
160 std::cerr <<
"Could not set LOCAL_TEST_BIN to " << testbin << std::endl;;
166 for(
int i = 3;
i < argc && rc == 0; ++
i) {
168 scriptname += argv[
i];
169 std::cout <<
"Running script: " << scriptname << std::endl;
173 std::cout <<
"status = " << rc << std::endl;
174 return rc == 0 ? 0 : -1;
183 std::cerr <<
"Caught an edm::Exception in "
188 std::cerr <<
"Caught a cms::Exception in "
193 std::cerr <<
"Caught a std::exception in "
198 std::cerr <<
"Caught an unknown exception in "
int do_work(int argc, char *argv[], char **env)
bool untaintString(char const *pattern, char const *regexp)
int run_script(std::string const &shell, std::string const &script)
int ptomaine(int argc, char *argv[], char **env)