/*@-mustmod@*/ int argvFgets(ARGV_t * argvp, void * fd) { FILE * fp = (fd ? fdGetFILE(fd) : stdin); ARGV_t av = NULL; char buf[BUFSIZ]; char * b, * be; int rc = 0; if (fp == NULL) return -2; while (!rc && (b = fgets(buf, (int)sizeof(buf), fp)) != NULL) { buf[sizeof(buf)-1] = '\0'; be = b + strlen(buf); if (be > b) be--; while (strchr("\r\n", *be) != NULL) *be-- = '\0'; rc = argvAdd(&av, b); } if (!rc) rc = ferror(fp); if (!rc) rc = (feof(fp) ? 0 : 1); if (!rc && argvp) *argvp = av; else av = argvFree(av); /*@-nullstate@*/ /* XXX *argvp may be NULL. */ return rc; /*@=nullstate@*/ }
static int readLineFromOFI(rpmSpec spec, OFI_t *ofi) { retry: /* Make sure the current file is open */ if (ofi->fd == NULL) { ofi->fd = Fopen(ofi->fileName, "r.fpio"); if (ofi->fd == NULL || Ferror(ofi->fd)) { /* XXX Fstrerror */ rpmlog(RPMLOG_ERR, _("Unable to open %s: %s\n"), ofi->fileName, Fstrerror(ofi->fd)); return PART_ERROR; } spec->lineNum = ofi->lineNum = 0; } /* Make sure we have something in the read buffer */ if (!(ofi->readPtr && *(ofi->readPtr))) { FILE * f = fdGetFILE(ofi->fd); if (f == NULL || !fgets(ofi->readBuf, BUFSIZ, f)) { /* EOF */ if (spec->readStack->next) { rpmlog(RPMLOG_ERR, _("Unclosed %%if\n")); return PART_ERROR; } /* remove this file from the stack */ spec->fileStack = ofi->next; (void) Fclose(ofi->fd); ofi->fileName = _free(ofi->fileName); ofi = _free(ofi); /* only on last file do we signal EOF to caller */ ofi = spec->fileStack; if (ofi == NULL) return 1; /* otherwise, go back and try the read again. */ goto retry; } ofi->readPtr = ofi->readBuf; ofi->lineNum++; spec->lineNum = ofi->lineNum; if (spec->sl) { speclines sl = spec->sl; if (sl->sl_nlines == sl->sl_nalloc) { sl->sl_nalloc += 100; sl->sl_lines = (char **) xrealloc(sl->sl_lines, sl->sl_nalloc * sizeof(*(sl->sl_lines))); } sl->sl_lines[sl->sl_nlines++] = xstrdup(ofi->readBuf); } } return 0; }
void rpmRunFileTriggers(const char * rootDir) { miRE matches_any = mireNew(RPMMIRE_DEFAULT, 0); int nft = 0; struct filetrigger *list = NULL; const char * fn = NULL; FD_t fd = NULL; FILE * fp = NULL; int xx; rpmlog(RPMLOG_DEBUG, D_("[filetriggers] starting\n")); fn = rpmGenPath(rootDir, files_awaiting_filetriggers, NULL); if (!filetriggers_dir()) goto exit; getFiletriggers(rootDir, matches_any, &nft, &list); if (nft <= 0) goto exit; fd = Fopen(fn, "r.fpio"); if (fd == NULL) goto exit; fp = fdGetFILE(fd); if (fp != NULL) { void (*oldhandler)(int) = signal(SIGPIPE, SIG_IGN); char tmp[BUFSIZ]; int i; rpmlog(RPMLOG_DEBUG, D_("[filetriggers] testing files from list: %s\n"), fn); while (fgets(tmp, (int)sizeof(tmp), fp)) { size_t tmplen = strlen(tmp); if (tmplen > 0 && tmp[tmplen-1] == '\n') tmp[--tmplen] = '\0'; if (!is_regexp_matching(matches_any, tmp)) continue; rpmlog(RPMLOG_DEBUG, D_("[filetriggers] matches-any regexp found %s\n"), tmp); for (i = 0; i < nft; i++) { ssize_t nw; if (!is_regexp_matching(list[i].mire, tmp)) /*@innercontinue@*/ continue; rpmlog(RPMLOG_DEBUG, D_("[filetriggers] file name '%s' matches pattern '%s'\n"), tmp, list[i].mire->pattern); mayStartFiletrigger(rootDir, &list[i]); nw = write(list[i].command_pipe, tmp, tmplen); } } xx = Fclose(fd); fd = NULL; fp = NULL; for (i = 0; i < nft; i++) { int status; if (list[i].command_pipe) { pid_t pid; xx = close(list[i].command_pipe); rpmlog(RPMLOG_DEBUG, D_("[filetriggers] waiting for %s to end\n"), list[i].name); pid = waitpid(list[i].command_pid, &status, 0); list[i].command_pipe = 0; } } freeFiletriggers(matches_any, nft, list); oldhandler = signal(SIGPIPE, oldhandler); } exit: if (fn != NULL) xx = unlink(fn); fn = _free(fn); }
/* * @todo Single use by %%doc in files.c prevents static. */ rpmRC doScript(rpmSpec spec, rpmBuildFlags what, const char *name, const char *sb, int test) { const char * rootDir = spec->rootDir; char *scriptName = NULL; char * buildDir = rpmGenPath(rootDir, "%{_builddir}", ""); char * buildCmd = NULL; char * buildTemplate = NULL; char * buildPost = NULL; const char * mTemplate = NULL; const char * mCmd = NULL; const char * mPost = NULL; int argc = 0; const char **argv = NULL; FILE * fp = NULL; FD_t fd; FD_t xfd; pid_t pid; pid_t child; int status; rpmRC rc; switch (what) { case RPMBUILD_PREP: mTemplate = "%{__spec_prep_template}"; mPost = "%{__spec_prep_post}"; mCmd = "%{__spec_prep_cmd}"; break; case RPMBUILD_BUILD: mTemplate = "%{__spec_build_template}"; mPost = "%{__spec_build_post}"; mCmd = "%{__spec_build_cmd}"; break; case RPMBUILD_INSTALL: mTemplate = "%{__spec_install_template}"; mPost = "%{__spec_install_post}"; mCmd = "%{__spec_install_cmd}"; break; case RPMBUILD_CHECK: mTemplate = "%{__spec_check_template}"; mPost = "%{__spec_check_post}"; mCmd = "%{__spec_check_cmd}"; break; case RPMBUILD_CLEAN: mTemplate = "%{__spec_clean_template}"; mPost = "%{__spec_clean_post}"; mCmd = "%{__spec_clean_cmd}"; break; case RPMBUILD_RMBUILD: mTemplate = "%{__spec_clean_template}"; mPost = "%{__spec_clean_post}"; mCmd = "%{__spec_clean_cmd}"; break; case RPMBUILD_STRINGBUF: default: mTemplate = "%{___build_template}"; mPost = "%{___build_post}"; mCmd = "%{___build_cmd}"; break; } if ((what != RPMBUILD_RMBUILD) && sb == NULL) { rc = RPMRC_OK; goto exit; } fd = rpmMkTempFile(rootDir, &scriptName); if (fd == NULL || Ferror(fd)) { rpmlog(RPMLOG_ERR, _("Unable to open temp file.\n")); rc = RPMRC_FAIL; goto exit; } if (fdGetFILE(fd) == NULL) xfd = Fdopen(fd, "w.fpio"); else xfd = fd; if ((fp = fdGetFILE(xfd)) == NULL) { rc = RPMRC_FAIL; goto exit; } if (*rootDir == '\0') rootDir = "/"; buildTemplate = rpmExpand(mTemplate, NULL); buildPost = rpmExpand(mPost, NULL); (void) fputs(buildTemplate, fp); if (what != RPMBUILD_PREP && what != RPMBUILD_RMBUILD && spec->buildSubdir) fprintf(fp, "cd '%s'\n", spec->buildSubdir); if (what == RPMBUILD_RMBUILD) { if (spec->buildSubdir) fprintf(fp, "rm -rf '%s'\n", spec->buildSubdir); } else if (sb != NULL) fprintf(fp, "%s", sb); (void) fputs(buildPost, fp); (void) Fclose(xfd); if (test) { rc = RPMRC_OK; goto exit; } if (buildDir && buildDir[0] != '/') { rc = RPMRC_FAIL; goto exit; } buildCmd = rpmExpand(mCmd, " ", scriptName, NULL); (void) poptParseArgvString(buildCmd, &argc, &argv); rpmlog(RPMLOG_NOTICE, _("Executing(%s): %s\n"), name, buildCmd); if (!(child = fork())) { /* NSPR messes with SIGPIPE, reset to default for the kids */ signal(SIGPIPE, SIG_DFL); errno = 0; (void) execvp(argv[0], (char *const *)argv); rpmlog(RPMLOG_ERR, _("Exec of %s failed (%s): %s\n"), scriptName, name, strerror(errno)); _exit(127); /* exit 127 for compatibility with bash(1) */ } pid = waitpid(child, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status)) { rpmlog(RPMLOG_ERR, _("Bad exit status from %s (%s)\n"), scriptName, name); rc = RPMRC_FAIL; } else rc = RPMRC_OK; exit: if (scriptName) { if (rc == RPMRC_OK) (void) unlink(scriptName); scriptName = _free(scriptName); } argv = _free(argv); buildCmd = _free(buildCmd); buildTemplate = _free(buildTemplate); buildPost = _free(buildPost); buildDir = _free(buildDir); return rc; }
/**@todo Infinite loops through manifest files exist, operator error for now. */ rpmRC rpmReadPackageManifest(FD_t fd, int * argcPtr, char *** argvPtr) { StringBuf sb = newStringBuf(); char * s = NULL; char * se; int ac = 0; char ** av = NULL; int argc = (argcPtr ? *argcPtr : 0); char ** argv = (argvPtr ? *argvPtr : NULL); FILE * f = fdGetFILE(fd); rpmRC rpmrc = RPMRC_OK; int i, j, next, npre; if (f != NULL) while (1) { char line[BUFSIZ]; /* Read next line. */ s = fgets(line, sizeof(line) - 1, f); if (s == NULL) { /* XXX Ferror check needed */ break; } /* Skip comments. */ if ((se = strchr(s, '#')) != NULL) *se = '\0'; /* Trim white space. */ se = s + strlen(s); while (se > s && (se[-1] == '\n' || se[-1] == '\r')) *(--se) = '\0'; while (*s && strchr(" \f\n\r\t\v", *s) != NULL) s++; if (*s == '\0') continue; /* Sanity checks: skip obviously binary lines and dash (for stdin) */ if (*s < 32 || rstreq(s, "-")) { rpmrc = RPMRC_NOTFOUND; goto exit; } /* Concatenate next line in buffer. */ *se++ = ' '; *se = '\0'; appendStringBuf(sb, s); } if (s == NULL) /* XXX always true */ s = getStringBuf(sb); if (!(s && *s)) { rpmrc = RPMRC_NOTFOUND; goto exit; } /* Glob manifest items. */ rpmrc = rpmGlob(s, &ac, &av); if (rpmrc != RPMRC_OK) goto exit; rpmlog(RPMLOG_DEBUG, "adding %d args from manifest.\n", ac); /* Count non-NULL args, keeping track of 1st arg after last NULL. */ npre = 0; next = 0; if (argv != NULL) for (i = 0; i < argc; i++) { if (argv[i] != NULL) npre++; else if (i >= next) next = i + 1; } /* Copy old arg list, inserting manifest before argv[next]. */ if (argv != NULL) { int nac = npre + ac; char ** nav = xcalloc((nac + 1), sizeof(*nav)); for (i = 0, j = 0; i < next; i++) { if (argv[i] != NULL) nav[j++] = argv[i]; } if (ac) memcpy(nav + j, av, ac * sizeof(*nav)); if ((argc - next) > 0) memcpy(nav + j + ac, argv + next, (argc - next) * sizeof(*nav)); nav[nac] = NULL; if (argvPtr) *argvPtr = argv = _free(argv); av = _free(av); av = nav; ac = nac; } /* Save new argc/argv list. */ if (argvPtr) { *argvPtr = _free(*argvPtr); *argvPtr = av; } if (argcPtr) *argcPtr = ac; exit: if (argvPtr == NULL || (rpmrc != RPMRC_OK && av)) { if (av) for (i = 0; i < ac; i++) av[i] = _free(av[i]); av = _free(av); } sb = freeStringBuf(sb); /* FIX: *argvPtr may be NULL. */ return rpmrc; }