Move --pipe handling to cliutils helpers
authorPanu Matilainen <pmatilai@redhat.com>
Fri, 20 Aug 2010 10:47:05 +0000 (13:47 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Fri, 20 Aug 2010 10:52:47 +0000 (13:52 +0300)
cliutils.c
cliutils.h
rpmbuild.c
rpmqv.c

index f022803..23c6323 100644 (file)
@@ -2,6 +2,8 @@
 #if HAVE_MCHECK_H
 #include <mcheck.h>
 #endif
+#include <sys/wait.h>
+
 #include <rpm/rpmlog.h>
 #include <rpm/rpmlib.h>
 #include <rpm/rpmfileutil.h>
@@ -10,6 +12,8 @@
 #include "cliutils.h"
 #include "debug.h"
 
+static pid_t pipeChild = 0;
+
 RPM_GNUC_NORETURN
 void argerror(const char * desc)
 {
@@ -110,3 +114,37 @@ int finishCli(poptContext optCon, int rc)
     /* XXX Avoid exit status overflow. Status 255 is special to xargs(1) */
     return (rc > 254) ? 254 : rc;
 }
+
+int initPipe(void)
+{
+    int p[2];
+
+    if (pipe(p) < 0) {
+       fprintf(stderr, _("creating a pipe for --pipe failed: %m\n"));
+       return -1;
+    }
+
+    if (!(pipeChild = fork())) {
+       (void) signal(SIGPIPE, SIG_DFL);
+       (void) close(p[1]);
+       (void) dup2(p[0], STDIN_FILENO);
+       (void) close(p[0]);
+       (void) execl("/bin/sh", "/bin/sh", "-c", rpmcliPipeOutput, NULL);
+       fprintf(stderr, _("exec failed\n"));
+       exit(EXIT_FAILURE);
+    }
+
+    (void) close(p[0]);
+    (void) dup2(p[1], STDOUT_FILENO);
+    (void) close(p[1]);
+    return 0;
+}
+
+void finishPipe(void)
+{
+    int status;
+    if (pipeChild) {
+       (void) fclose(stdout);
+       (void) waitpid(pipeChild, &status, 0);
+    }
+}
index 830b4c4..ea45398 100644 (file)
@@ -17,4 +17,8 @@ poptContext initCli(const char *ctx, struct poptOption *optionsTable,
 /* Free up common resources, return "normalized" exit code */
 int finishCli(poptContext optCon, int rc);
 
+int initPipe(void);
+
+void finishPipe(void);
+
 #endif /* _CLIUTIL_H */
index 3b0b8ce..51fcbfe 100644 (file)
@@ -6,7 +6,6 @@ const char *__progname;
 #include <errno.h>
 #include <libgen.h>
 #include <ctype.h>
-#include <sys/wait.h>
 
 #include <rpm/rpmcli.h>
 #include <rpm/rpmlib.h>                        /* RPMSIGTAG, rpmReadPackageFile .. */
@@ -387,11 +386,8 @@ int main(int argc, char *argv[])
     char * passPhrase = "";
 
     const char *pkg = NULL;
-    pid_t pipeChild = 0;
     poptContext optCon;
     int ec = 0;
-    int status;
-    int p[2];
        
     setprogname(argv[0]);      /* Retrofit glibc __progname */
 
@@ -451,25 +447,8 @@ int main(int argc, char *argv[])
     /* rpmbuild is rather chatty by default */
     rpmSetVerbosity(quiet ? RPMLOG_WARNING : RPMLOG_INFO);
 
-    if (rpmcliPipeOutput) {
-       if (pipe(p) < 0) {
-           fprintf(stderr, _("creating a pipe for --pipe failed: %m\n"));
-           goto exit;
-       }
-
-       if (!(pipeChild = fork())) {
-           (void) signal(SIGPIPE, SIG_DFL);
-           (void) close(p[1]);
-           (void) dup2(p[0], STDIN_FILENO);
-           (void) close(p[0]);
-           (void) execl("/bin/sh", "/bin/sh", "-c", rpmcliPipeOutput, NULL);
-           fprintf(stderr, _("exec failed\n"));
-       }
-
-       (void) close(p[0]);
-       (void) dup2(p[1], STDOUT_FILENO);
-       (void) close(p[1]);
-    }
+    if (rpmcliPipeOutput && initPipe())
+       exit(EXIT_FAILURE);
        
     ts = rpmtsCreate();
     (void) rpmtsSetRootDir(ts, rpmcliRootDir);
@@ -550,12 +529,7 @@ int main(int argc, char *argv[])
 exit:
 
     ts = rpmtsFree(ts);
-
-    if (pipeChild) {
-       (void) fclose(stdout);
-       (void) waitpid(pipeChild, &status, 0);
-    }
-
+    finishPipe();
     freeNames();
     ba->buildRootOverride = _free(ba->buildRootOverride);
     ba->targets = _free(ba->targets);
diff --git a/rpmqv.c b/rpmqv.c
index 87d4b75..f63e015 100644 (file)
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -3,7 +3,6 @@ const char *__progname;
 
 #define        _AUTOHELP
 
-#include <sys/wait.h>
 #include <rpm/rpmcli.h>
 #include <rpm/rpmlib.h>                        /* RPMSIGTAG, rpmReadPackageFile .. */
 #include <rpm/rpmbuild.h>
@@ -118,11 +117,8 @@ int main(int argc, char *argv[])
     char * passPhrase = "";
 #endif
 
-    pid_t pipeChild = 0;
     poptContext optCon;
     int ec = 0;
-    int status;
-    int p[2];
 #ifdef IAM_RPMEIU
     int i;
 #endif
@@ -403,25 +399,8 @@ int main(int argc, char *argv[])
     }
 #endif /* IAM_RPMK */
 
-    if (rpmcliPipeOutput) {
-       if (pipe(p) < 0) {
-           fprintf(stderr, _("creating a pipe for --pipe failed: %m\n"));
-           goto exit;
-       }
-
-       if (!(pipeChild = fork())) {
-           (void) signal(SIGPIPE, SIG_DFL);
-           (void) close(p[1]);
-           (void) dup2(p[0], STDIN_FILENO);
-           (void) close(p[0]);
-           (void) execl("/bin/sh", "/bin/sh", "-c", rpmcliPipeOutput, NULL);
-           fprintf(stderr, _("exec failed\n"));
-       }
-
-       (void) close(p[0]);
-       (void) dup2(p[1], STDOUT_FILENO);
-       (void) close(p[1]);
-    }
+    if (rpmcliPipeOutput && initPipe())
+       exit(EXIT_FAILURE);
        
     ts = rpmtsCreate();
     (void) rpmtsSetRootDir(ts, rpmcliRootDir);
@@ -554,13 +533,8 @@ int main(int argc, char *argv[])
     }
 
 exit:
-
     ts = rpmtsFree(ts);
-
-    if (pipeChild) {
-       (void) fclose(stdout);
-       (void) waitpid(pipeChild, &status, 0);
-    }
+    finishPipe();
 
 #ifdef IAM_RPMQV
     qva->qva_queryFormat = _free(qva->qva_queryFormat);