Make --pipe command failures reflect our exit codes (RhBug:735481)
authorPanu Matilainen <pmatilai@redhat.com>
Mon, 5 Sep 2011 05:38:31 +0000 (08:38 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Mon, 5 Sep 2011 05:38:31 +0000 (08:38 +0300)
cliutils.c
cliutils.h
rpmbuild.c
rpmqv.c
rpmspec.c

index cbbc7fe..5edecc5 100644 (file)
@@ -2,6 +2,7 @@
 #if HAVE_MCHECK_H
 #include <mcheck.h>
 #endif
+#include <errno.h>
 #include <sys/wait.h>
 
 #include <rpm/rpmlog.h>
@@ -69,11 +70,20 @@ int initPipe(void)
     return 0;
 }
 
-void finishPipe(void)
+int finishPipe(void)
 {
-    int status;
+    int rc = 0;
     if (pipeChild) {
+       int status;
+       pid_t reaped;
+
        (void) fclose(stdout);
-       (void) waitpid(pipeChild, &status, 0);
+       do {
+           reaped = waitpid(pipeChild, &status, 0);
+       } while (reaped == -1 && errno == EINTR);
+           
+       if (reaped == -1 || !WIFEXITED(status) || WEXITSTATUS(status))
+           rc = 1;
     }
+    return rc;
 }
index 875b950..35aa252 100644 (file)
@@ -15,6 +15,6 @@ void printUsage(poptContext con, FILE * fp, int flags);
 
 int initPipe(void);
 
-void finishPipe(void);
+int finishPipe(void);
 
 #endif /* _CLIUTIL_H */
index c51aa36..a338c3c 100644 (file)
@@ -628,7 +628,8 @@ int main(int argc, char *argv[])
     }
 
     rpmtsFree(ts);
-    finishPipe();
+    if (finishPipe())
+       ec = EXIT_FAILURE;
     free(ba->buildRootOverride);
     argvFree(build_targets);
 
diff --git a/rpmqv.c b/rpmqv.c
index 4841cb8..2b415e6 100644 (file)
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -333,7 +333,8 @@ int main(int argc, char *argv[])
     }
 
     rpmtsFree(ts);
-    finishPipe();
+    if (finishPipe())
+       ec = EXIT_FAILURE;
 
 #ifdef IAM_RPMQV
     free(qva->qva_queryFormat);
index e760698..f7f6962 100644 (file)
--- a/rpmspec.c
+++ b/rpmspec.c
@@ -110,7 +110,8 @@ int main(int argc, char *argv[])
     }
 
     rpmtsFree(ts);
-    finishPipe();
+    if (finishPipe())
+       ec = EXIT_FAILURE;
 
     free(qva->qva_queryFormat);