From 43b37b2acc7e8876371741d4901cdc11ad7ecadd Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 11 Dec 2017 18:19:11 +0100 Subject: Fix WEXITSTATUS compile error on openbsd (and ubuntu) I noticed that WEXITSTATUS was failing when compiling sibs on ubuntu. WEXITSTATUS uses address of input which fails if the input is directly passed by return of a function call. Also added error checking if the process was stopped/killed by receiving a signal or if it failed in any other way. --- src/Exec.cpp | 35 +++++++++++++++++++++++++++++++---- src/main.cpp | 5 +++++ 2 files changed, 36 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/Exec.cpp b/src/Exec.cpp index b245fd4..37ffef5 100644 --- a/src/Exec.cpp +++ b/src/Exec.cpp @@ -1,5 +1,7 @@ #include "../include/Exec.hpp" +using namespace std; + namespace sibs { Result exec(const char *cmd, bool print) @@ -20,9 +22,34 @@ namespace sibs } } - ExecResult execResult; - execResult.execStdout = result; - execResult.exitCode = WEXITSTATUS(pclose(pipe)); - return Result::Ok(execResult); + int processCloseResult = pclose(pipe); + if(WIFEXITED(processCloseResult)) + { + int returned = WEXITSTATUS(processCloseResult); + ExecResult execResult; + execResult.execStdout = result; + execResult.exitCode = returned; + return Result::Ok(execResult); + } + else if(WIFSIGNALED(processCloseResult)) + { + int signum = WSTOPSIG(processCloseResult); + string errMsg = "Exited due to receiving signal "; + errMsg += to_string(signum); + return Result::Err(errMsg); + } + else if(WIFSTOPPED(processCloseResult)) + { + int signum = WSTOPSIG(processCloseResult); + string errMsg = "Stopped due to receiving signal "; + errMsg += to_string(signum); + return Result::Err(errMsg); + } + else + { + string errMsg = "exec unexpected error on pclose: "; + errMsg += to_string(processCloseResult); + return Result::Err(errMsg); + } } } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 151e5a5..b1982bd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,11 @@ using namespace std; using namespace sibs; +// TODO: Fail if multiple versions of the same dependency is used +// as linking will fail because of multiple definitions of the same thing + +// TODO: Detect recursive dependencies and give error. + void usage() { printf("usage: sibs COMMAND\n\n"); -- cgit v1.2.3-70-g09d2