#if HAVE_MCHECK_H
#include <mcheck.h>
#endif
+#include <sys/wait.h>
+
#include <rpm/rpmlog.h>
#include <rpm/rpmlib.h>
#include <rpm/rpmfileutil.h>
#include "cliutils.h"
#include "debug.h"
+static pid_t pipeChild = 0;
+
RPM_GNUC_NORETURN
void argerror(const char * desc)
{
/* 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);
+ }
+}
/* Free up common resources, return "normalized" exit code */
int finishCli(poptContext optCon, int rc);
+int initPipe(void);
+
+void finishPipe(void);
+
#endif /* _CLIUTIL_H */
#include <errno.h>
#include <libgen.h>
#include <ctype.h>
-#include <sys/wait.h>
#include <rpm/rpmcli.h>
#include <rpm/rpmlib.h> /* RPMSIGTAG, rpmReadPackageFile .. */
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 */
/* 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);
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);
#define _AUTOHELP
-#include <sys/wait.h>
#include <rpm/rpmcli.h>
#include <rpm/rpmlib.h> /* RPMSIGTAG, rpmReadPackageFile .. */
#include <rpm/rpmbuild.h>
char * passPhrase = "";
#endif
- pid_t pipeChild = 0;
poptContext optCon;
int ec = 0;
- int status;
- int p[2];
#ifdef IAM_RPMEIU
int i;
#endif
}
#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);
}
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);