summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-12-16 18:33:04 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-12-16 18:33:04 +0100
commit716a4ffceeb0c47d24cb00a186fd7c7e3f40992f (patch)
tree0c48377e962219ff954120251ea07455b527e83a
parent65f8b90b01693e467359b7258d98ac64d7807c3f (diff)
downloadabrt-716a4ffceeb0c47d24cb00a186fd7c7e3f40992f.tar.gz
abrt-716a4ffceeb0c47d24cb00a186fd7c7e3f40992f.tar.xz
abrt-716a4ffceeb0c47d24cb00a186fd7c7e3f40992f.zip
lib/Plugins/CCpp.cpp: save gdb error messages too
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--lib/Plugins/CCpp.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/Plugins/CCpp.cpp b/lib/Plugins/CCpp.cpp
index c9a31c7e..15b47072 100644
--- a/lib/Plugins/CCpp.cpp
+++ b/lib/Plugins/CCpp.cpp
@@ -96,7 +96,7 @@ static string concat_str_vector(char **strings)
}
/* Returns status. See `man 2 wait` for status information. */
-static int ExecVP(char **pArgs, uid_t uid, string& pOutput)
+static int ExecVP(char **pArgs, uid_t uid, int redirect_stderr, string& pOutput)
{
int pipeout[2];
pid_t child;
@@ -114,8 +114,6 @@ static int ExecVP(char **pArgs, uid_t uid, string& pOutput)
xmove_fd(pipeout[1], STDOUT_FILENO);
/* Make sure stdin is safely open to nothing */
xmove_fd(xopen("/dev/null", O_RDONLY), STDIN_FILENO);
- /* Not a good idea, we won't see any error messages */
- /* close(STDERR_FILENO); */
struct passwd* pw = getpwuid(uid);
gid_t gid = pw ? pw->pw_gid : uid;
@@ -136,6 +134,11 @@ static int ExecVP(char **pArgs, uid_t uid, string& pOutput)
unsetenv("LC_NUMERIC");
unsetenv("LC_TIME");
+ if (redirect_stderr)
+ {
+ /* We want parent to see errors in the same stream */
+ xdup2(STDOUT_FILENO, STDERR_FILENO);
+ }
execvp(pArgs[0], pArgs);
/* VERB1 since sometimes we expect errors here */
VERB1 perror_msg("Can't execute '%s'", pArgs[0]);
@@ -309,7 +312,7 @@ static void GetBacktrace(const char *pDebugDumpDir,
args[11] = (char*)"info sharedlib";
args[12] = NULL;
- ExecVP(args, xatoi_u(UID.c_str()), pBacktrace);
+ ExecVP(args, xatoi_u(UID.c_str()), /*redirect_stderr:*/ 1, pBacktrace);
}
static void GetIndependentBuildIdPC(const char *unstrip_n_output,
@@ -355,7 +358,7 @@ static string run_unstrip_n(const char *pDebugDumpDir)
args[3] = NULL;
string output;
- ExecVP(args, xatoi_u(UID.c_str()), output);
+ ExecVP(args, xatoi_u(UID.c_str()), /*redirect_stderr:*/ 0, output);
free(args[1]);
@@ -385,8 +388,6 @@ static void InstallDebugInfos(const char *pDebugDumpDir,
{
close(pipeout[0]);
xmove_fd(pipeout[1], STDOUT_FILENO);
- /* We want parent to see errors in the same stream */
- xdup2(STDOUT_FILENO, STDERR_FILENO);
xmove_fd(xopen("/dev/null", O_RDONLY), STDIN_FILENO);
char *coredump = xasprintf("%s/"FILENAME_COREDUMP, pDebugDumpDir);
@@ -394,6 +395,8 @@ static void InstallDebugInfos(const char *pDebugDumpDir,
char *tempdir = xasprintf(LOCALSTATEDIR"/run/abrt/tmp-%u-%lu", (int)getpid(), (long)time(NULL));
/* log() goes to stderr/syslog, it's ok to use it here */
VERB1 log("Executing: %s %s %s %s", "abrt-debuginfo-install", coredump, tempdir, debuginfo_dirs);
+ /* We want parent to see errors in the same stream */
+ xdup2(STDOUT_FILENO, STDERR_FILENO);
execlp("abrt-debuginfo-install", "abrt-debuginfo-install", coredump, tempdir, debuginfo_dirs, NULL);
perror_msg("Can't execute '%s'", "abrt-debuginfo-install");
/* Serious error (1 means "some debuginfos not found") */
@@ -444,11 +447,11 @@ static void InstallDebugInfos(const char *pDebugDumpDir,
if (WIFEXITED(status))
{
if (WEXITSTATUS(status) > 1)
- error_msg("abrt-debuginfo-install exited with %u", (int)WEXITSTATUS(status));
+ error_msg("%s exited with %u", "abrt-debuginfo-install", (int)WEXITSTATUS(status));
}
else
{
- error_msg("abrt-debuginfo-install killed by signal %u", (int)WTERMSIG(status));
+ error_msg("%s killed by signal %u", "abrt-debuginfo-install", (int)WTERMSIG(status));
}
}