int argvAppend(ARGV_t * argvp, ARGV_const_t av) { ARGV_t argv = *argvp; int argc = argvCount(argv); int ac = argvCount(av); int i; argv = xrealloc(argv, (argc + ac + 1) * sizeof(*argv)); for (i = 0; i < ac; i++) argv[argc + i] = xstrdup(av[i]); argv[argc + ac] = NULL; *argvp = argv; return 0; }
static int rpmfcExpandAppend(ARGV_t * argvp, ARGV_const_t av) { ARGV_t argv = *argvp; int argc = argvCount(argv); int ac = argvCount(av); int i; argv = xrealloc(argv, (argc + ac + 1) * sizeof(*argv)); for (i = 0; i < ac; i++) argv[argc + i] = rpmExpand(av[i], NULL); argv[argc + ac] = NULL; *argvp = argv; return 0; }
rpmpython rpmpythonNew(char ** av, uint32_t flags) { static char * _av[] = { "rpmpython", NULL }; #if defined(WITH_PYTHONEMBED) int initialize = (!(flags & 0x80000000) || _rpmpythonI == NULL); #endif rpmpython python = (flags & 0x80000000) ? rpmpythonI() : rpmpythonGetPool(_rpmpythonPool); if (_rpmpython_debug) fprintf(stderr, "==> %s(%p, %d) python %p\n", __FUNCTION__, av, flags, python); if (av == NULL) av = _av; #if defined(WITH_PYTHONEMBED) if (!Py_IsInitialized()) { Py_SetProgramName((char *)_av[0]); Py_Initialize(); } if (PycStringIO == NULL) PycStringIO = PyCObject_Import("cStringIO", "cStringIO_CAPI"); if (initialize) { int ac = argvCount((ARGV_t)av); (void) PySys_SetArgv(ac, (char **)av); (void) rpmpythonRun(python, rpmpythonInitStringIO, NULL); } #endif return rpmpythonLink(python); }
static JSObject * rpmtsLoadNVRA(JSContext *cx, JSObject *obj) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmtsClass, NULL); rpmts ts = ptr; JSObject * NVRA = JS_NewArrayObject(cx, 0, NULL); ARGV_t keys = NULL; int nkeys; int xx; int i; if (ts->rdb == NULL) (void) rpmtsOpenDB(ts, O_RDONLY); xx = rpmdbMireApply(rpmtsGetRdb(ts), RPMTAG_NVRA, RPMMIRE_STRCMP, NULL, &keys); nkeys = argvCount(keys); if (keys) for (i = 0; i < nkeys; i++) { JSString * valstr = JS_NewStringCopyZ(cx, keys[i]); jsval id = STRING_TO_JSVAL(valstr); JS_SetElement(cx, NVRA, i, &id); } JS_DefineProperty(cx, obj, "NVRA", OBJECT_TO_JSVAL(NVRA), NULL, NULL, JSPROP_ENUMERATE); if (_debug) fprintf(stderr, "==> %s(%p,%p) ptr %p NVRA %p\n", __FUNCTION__, cx, obj, ptr, NVRA); return NVRA; }
int main(int argc, char *argv[]) /*@globals __assert_program_name, rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@modifies __assert_program_name, _rpmrepo, rpmGlobalMacroContext, fileSystem, internalState @*/ { poptContext optCon = rpmioInit(argc, argv, optionsTable); const char ** av = NULL; int ac; int rc = 1; /* assume failure. */ int i; /*@-observertrans -readonlytrans @*/ __progname = "rpmgpg"; /*@=observertrans =readonlytrans @*/ av = poptGetArgs(optCon); if (av == NULL || av[0] == NULL) { poptPrintUsage(optCon, stderr, 0); goto exit; } ac = argvCount(av); if (av != NULL) for (i = 0; i < ac; i++) { } rc = 0; exit: optCon = rpmioFini(optCon); return rc; }
int main(int argc, char *argv[]) { poptContext optCon = rpmioInit(argc, argv, optionsTable); const char * pythonFN = NULL; int pythonFlags = 0; rpmpython python = rpmpythonNew(pythonFN, pythonFlags); ARGV_t av = poptGetArgs(optCon); int ac = argvCount(av); const char * fn; int rc = 1; /* assume failure */ if (ac < 1) { poptPrintUsage(optCon, stderr, 0); goto exit; } while ((fn = *av++) != NULL) { const char * result; rpmRC ret; result = NULL; if ((ret = rpmpythonRunFile(python, fn, &result)) != RPMRC_OK) goto exit; if (result != NULL && *result != '\0') fprintf(stdout, "%s\n", result); } rc = 0; exit: python = rpmpythonFree(python); optCon = rpmioFini(optCon); return rc; }
int argvSort(ARGV_t argv, int (*compar)(const void *, const void *)) { if (compar == NULL) compar = argvCmp; qsort(argv, argvCount(argv), sizeof(*argv), compar); return 0; }
int argvAppend(/*@out@*/ ARGV_t * argvp, ARGV_t av) { int ac = argvCount(av); if (av != NULL && ac > 0) { ARGV_t argv = *argvp; int argc = argvCount(argv); argv = xrealloc(argv, (argc + ac + 1) * sizeof(*argv)); while (*av++) argv[argc++] = xstrdup(av[-1]); argv[argc] = NULL; *argvp = argv; } return 0; }
rpmtcl rpmtclNew(char ** av, uint32_t flags) { rpmtcl tcl = #ifdef NOTYET (flags & 0x80000000) ? rpmtclI() : #endif rpmtclGetPool(_rpmtclPool); #if defined(WITH_TCL) static char * _av[] = { "rpmtcl", NULL }; Tcl_Interp * tclI = Tcl_CreateInterp(); char b[32]; int ac; if (av == NULL) av = _av; ac = argvCount((ARGV_t)av); Tcl_SetVar(tclI, "argv", Tcl_Merge(ac-1, (const char *const *)av+1), TCL_GLOBAL_ONLY); (void)sprintf(b, "%d", ac-1); Tcl_SetVar(tclI, "argc", b, TCL_GLOBAL_ONLY); Tcl_SetVar(tclI, "argv0", av[0], TCL_GLOBAL_ONLY); Tcl_SetVar(tclI, "tcl_interactive", "0", TCL_GLOBAL_ONLY); tcl->I = tclI; { Tcl_Channel tclout = Tcl_GetStdChannel(TCL_STDOUT); Tcl_SetChannelOption(tclI, tclout, "-translation", "auto"); Tcl_StackChannel(tclI, &rpmtclIO, tcl, TCL_WRITABLE, tclout); tcl->tclout = (void *) tclout; } #endif tcl->iob = rpmiobNew(0); return rpmtclLink(tcl); }
char *argvJoin(ARGV_const_t argv, const char *sep) { int argc = argvCount(argv); if (argc < 1) return NULL; /* calculate lengths */ size_t lenbuf[32], *lens = lenbuf; if (argc > 32) lens = xmalloc(argc * sizeof(*lens)); size_t argvlen = 0; for (int i = 0; i < argc; i++) { size_t len = strlen(argv[i]); lens[i] = len; argvlen += len; } /* alloate destination buffer */ size_t seplen = sep ? strlen(sep) : 0; char *dest = xmalloc(argvlen + seplen * (argc - 1) + 1); /* first element */ size_t len = lens[0]; char *p = memcpy(dest, argv[0], len); p += len; /* remaining elements, with separators */ switch (seplen) { case 0: for (int i = 1; i < argc; i++) { len = lens[i]; memcpy(p, argv[i], len); p += len; } break; case 1: for (int i = 1; i < argc; i++) { *p++ = *sep; len = lens[i]; memcpy(p, argv[i], len); p += len; } break; default: for (int i = 1; i < argc; i++) { memcpy(p, sep, seplen); p += seplen; len = lens[i]; memcpy(p, argv[i], len); p += len; } break; } *p = '\0'; if (lens != lenbuf) free(lens); return dest; }
ARGV_t argvSearch(ARGV_const_t argv, const char *val, int (*compar)(const void *, const void *)) { if (argv == NULL) return NULL; if (compar == NULL) compar = argvCmp; return bsearch(&val, argv, argvCount(argv), sizeof(*argv), compar); }
int rpmtdFromArgv(rpmtd td, rpmTagVal tag, ARGV_t argv) { int count = argvCount(argv); rpmTagType type = rpmTagGetTagType(tag); if (type != RPM_STRING_ARRAY_TYPE || count < 1) return 0; return rpmtdSet(td, tag, type, argv, count); }
ARGV_t argvSearch(ARGV_t argv, ARGstr_t val, int (*compar)(ARGstr_t *, ARGstr_t *)) { if (argv == NULL) return NULL; if (compar == NULL) compar = argvCmp; return bsearch(&val, argv, argvCount(argv), sizeof(*argv), (int(*)(const void *, const void *))compar); }
int main(int argc, char *argv[]) { poptContext con = rpmioInit(argc, argv, optionsTable); ARGV_t av = poptGetArgs(con); int ac = argvCount(av);; const char ** keyids = NULL; int ec = 0; int xx; _rpmhkp_lvl = RPMLOG_INFO; /* XXX default is RPMLOG_DEBUG */ if (_hkp_keyserver == NULL) _hkp_keyserver = xstrdup("keys.rpm5.org"); if (_rpmhkp_spew) _rpmhkp_debug = -1; /* XXX no macros are loaded if using poptIO. */ addMacro(NULL, "_hkp_keyserver", NULL, _hkp_keyserver, -1); addMacro(NULL, "_hkp_keyserver_query", NULL, _hkp_keyserver_query, -1); if (ac == 0) { xx = argvAppend(&keyids, _keyids); } else { int gotstdin = 0; int i; for (i = 0; i < ac; i++) { if (strcmp(av[i], "-")) { xx = argvAdd(&keyids, (ARGstr_t)av[i]); continue; } if (gotstdin) continue; gotstdin++; if (argvFgets(&keyids, NULL)) goto exit; } } ec = rpmhkpReadKeys(keyids); if (_rpmhkp_stats) _rpmhkpPrintStats(NULL); exit: keyids = argvFree(keyids); _hkp_keyserver = _free(_hkp_keyserver); /*@i@*/ urlFreeCache(); con = rpmioFini(con); return ec; }
int argvAdd(ARGV_t * argvp, const char *val) { ARGV_t argv; int argc; if (argvp == NULL) return -1; argc = argvCount(*argvp); *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp)); argv = *argvp; argv[argc++] = xstrdup(val); argv[argc ] = NULL; return 0; }
int argvAdd(/*@out@*/ ARGV_t * argvp, ARGstr_t val) { ARGV_t argv; int argc; if (argvp == NULL) return -1; argc = argvCount(*argvp); /*@-unqualifiedtrans@*/ *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp)); /*@=unqualifiedtrans@*/ argv = *argvp; argv[argc++] = xstrdup(val); argv[argc ] = NULL; return 0; }
int main(int argc, char **argv) { poptContext optCon = rpmioInit(argc, argv, optionsTable); const char ** av = NULL; int ac; int r = -1; _rpmaug_debug = -1; if (_rpmaugLoadargv != NULL) _rpmaugLoadpath = argvJoin(_rpmaugLoadargv, PATH_SEP_CHAR); _rpmaugI = rpmaugNew(_rpmaugRoot, _rpmaugLoadpath, _rpmaugFlags); if (_rpmaugI == NULL) { fprintf(stderr, "Failed to initialize Augeas\n"); goto exit; } #if defined(WITH_READLINE) readline_init(); #endif av = poptGetArgs(optCon); ac = argvCount(av); if (ac > 0) { // Accept one command from the command line const char * cmd = argvJoin(av, ' '); const char *buf; buf = NULL; r = rpmaugRun(NULL, cmd, &buf); cmd = _free(cmd); if (buf && *buf) fprintf(stdout, "%s", buf); } else { r = main_loop(); } exit: if (_rpmaugLoadargv) _rpmaugLoadpath = _free(_rpmaugLoadpath); _rpmaugLoadargv = argvFree(_rpmaugLoadargv); _rpmaugI = rpmaugFree(_rpmaugI); optCon = rpmioFini(optCon); return (r == 0 ? EXIT_SUCCESS : EXIT_FAILURE); }
int main(int argc, char *argv[]) { poptContext optCon = rpmioInit(argc, argv, optionsTable); const char * perlFN = NULL; int perlFlags = 0; rpmperl perl = rpmperlNew(perlFN, perlFlags); ARGV_t av = poptGetArgs(optCon); int ac = argvCount(av); #ifdef NOTYET const char * fn; #endif const char * result; int rc = 1; /* assume failure */ #ifdef NOTYET if (ac < 1) { poptPrintUsage(optCon, stderr, 0); goto exit; } while ((fn = *av++) != NULL) { rpmRC ret; result = NULL; if ((ret = rpmperlRunFile(perl, fn, &result)) != RPMRC_OK) goto exit; if (result != NULL && *result != '\0') fprintf(stdout, "%s\n", result); } rc = 0; #else result = NULL; if (rpmperlRun(perl, "print \"Hello, world!\n\";", &result) != RPMRC_OK) goto exit; if (result && *result) fprintf(stdout, "%s\n", result); rc = 0; #endif exit: perl = rpmperlFree(perl); optCon = rpmioFini(optCon); return rc; }
int main(int argc, char *argv[]) { poptContext optCon = rpmioInit(argc, argv, optionsTable); ARGV_t av = NULL; int ac; const char * dn; int rc = 0; if (__debug) { _av_debug = -1; _dav_debug = -1; _ftp_debug = -1; _url_debug = -1; _rpmio_debug = -1; } av = poptGetArgs(optCon); ac = argvCount(av); if (ac < 1) { poptPrintUsage(optCon, stderr, 0); goto exit; } while (rc == 0 && (dn = *av++) != NULL) { #ifdef DYING /* XXX davOpendir() is adding pesky trailing '/'. */ /* XXX Add pesky trailing '/' to http:// URI's */ size_t nb = strlen(dn); dn = rpmExpand(dn, (dn[nb-1] != '/' ? "/" : NULL), NULL); rc = dirWalk(dn); dn = _free(dn); #else rc = dirWalk(dn); #endif } exit: optCon = rpmioFini(optCon); return rc; }
int main(int argc, char *argv[]) { poptContext optCon = rpmioInit(argc, argv, optionsTable); rpmtget tget = xcalloc(1, sizeof(*tget)); ARGV_t av = NULL; int ac; int rc = 0; int xx; if (__debug) { _av_debug = -1; _dav_debug = -1; _ftp_debug = -1; _url_debug = -1; _rpmio_debug = -1; } av = poptGetArgs(optCon); ac = argvCount(av); if (ac < 1) { poptPrintUsage(optCon, stderr, 0); goto exit; } tget->pattern = hrefpat; xx = mireAppend(RPMMIRE_PCRE, 0, tget->pattern, NULL, &tget->mires, &tget->nmires); while (rc == 0 && (tget->uri = *av++) != NULL) rc = readFile(tget); tget->mires = mireFreeAll(tget->mires, tget->nmires); tget->nmires = 0; exit: optCon = rpmioFini(optCon); return rc; }
rpmruby rpmrubyNew(char ** av, uint32_t flags) { static char * _av[] = { "rpmruby", NULL }; rpmruby ruby = (flags & 0x80000000) ? rpmrubyI() : rpmrubyGetPool(_rpmrubyPool); int xx; RUBYDBG((stderr, "--> %s(%p,0x%x) ruby %p\n", __FUNCTION__, av, flags, ruby)); /* If failure, or retrieving already initialized _rpmrubyI, just exit. */ if (ruby == NULL || ruby == _rpmrubyI) goto exit; if (av == NULL) av = _av; ruby->flags = flags; xx = argvAppend(&ruby->av, (ARGV_t)av); ruby->ac = argvCount(ruby->av); /* XXX FIXME: 0x40000000 => xruby.c wrapper without interpreter. */ if (ruby->flags & 0x40000000) { static size_t _rpmrubyStackSize = 4 * 1024 * 1024; /* XXX save as global interpreter. */ _rpmrubyI = ruby; ruby->nstack = _rpmrubyStackSize; ruby->stack = malloc(ruby->nstack); assert(ruby->stack != NULL); gettimeofday(&ruby->start, NULL); /* starting time for log entries */ if (_rpmruby_debug) ruby->zlog = rpmzLogNew(&ruby->start); /* initialize logging */ /* initialize the relay mechanism */ ruby->ruby_coroutine_lock = yarnNewLock(0); ruby->main_coroutine_lock = yarnNewLock(0); } else { #if defined(WITH_RUBYEMBED) VALUE variable_in_this_stack_frame; /* RUBY_INIT_STSCK */ #if defined(HAVE_RUBY_DEFINES_H) /* XXX ruby-1.9.2 */ ruby_sysinit(&ruby->ac, (char ***) &ruby->av); /* XXX ruby-1.9.2p0 ruby_bind_stack() patch needed */ { uint8_t * b = ruby->stack; uint8_t * e = b + ruby->nstack; ruby_bind_stack((VALUE *)b, (VALUE *) e); } #endif /* NOTYET */ ruby_init_stack(&variable_in_this_stack_frame); /* RUBY_INIT_STACK */ ruby_init(); ruby_init_loadpath(); ruby_script((char *)av[0]); if (av[1]) ruby_set_argv(argvCount((ARGV_t)av)-1, av+1); rb_gv_set("$result", rb_str_new2("")); #if !defined(HAVE_RUBY_DEFINES_H) /* XXX ruby-1.8.6 */ (void) rpmrubyRun(ruby, rpmrubyInitStringIO, NULL); #endif #endif /* WITH_RUBYEMBED */ } exit: return rpmrubyLink(ruby); }
static ModuleRec newModule(const char *path, const char *name, const char *types, uint32_t flags) { ModuleRec mod; uint8_t *raw = NULL; ssize_t rawlen = 0; const char *buildDir = "%{_builddir}/%{?buildsubdir}/"; if (!path) { rpmlog(RPMLOG_ERR, _("%%semodule requires a file path\n")); return NULL; } mod = xcalloc(1, sizeof(*mod)); mod->path = rpmGenPath(buildDir, NULL, path); if ((rpmioSlurp(mod->path, &raw, &rawlen)) != 0 || raw == NULL) { rpmlog(RPMLOG_ERR, _("Failed to read policy file: %s\n"), mod->path); goto err; } mod->data = b64encode(raw, rawlen, -1); if (!mod->data) { rpmlog(RPMLOG_ERR, _("Failed to encode policy file: %s\n"), mod->path); goto err; } if (name) { mod->name = xstrdup(name); } else { /* assume base name (minus extension) if name is not given */ char *tmp = xstrdup(mod->path); char *bname = basename(tmp); char *end = strchr(bname, '.'); if (end) *end = '\0'; if (strlen(bname) > 0) { mod->name = xstrdup(bname); } else { rpmlog(RPMLOG_ERR, _("Failed to determine a policy name: %s\n"), mod->path); _free(tmp); goto err; } _free(tmp); } if (types) { mod->types = argvSplitString(types, ",", ARGV_SKIPEMPTY); argvSort(mod->types, NULL); if (argvSearch(mod->types, RPMPOL_TYPE_DEFAULT, NULL) && argvCount(mod->types) > 1) { rpmlog(RPMLOG_WARNING, _("'%s' type given with other types in %%semodule %s. Compacting types to '%s'.\n"), RPMPOL_TYPE_DEFAULT, mod->path, RPMPOL_TYPE_DEFAULT); mod->types = argvFree(mod->types); argvAdd(&mod->types, RPMPOL_TYPE_DEFAULT); } } else { argvAdd(&mod->types, RPMPOL_TYPE_DEFAULT); } mod->flags = flags; return mod; err: freeModule(mod); return NULL; }
/** * Parse arguments (to next new line) for parameterized macro. * @todo Use popt rather than getopt to parse args. * @param mb macro expansion state * @param me macro entry slot * @param se arguments to parse * @param lastc stop parsing at lastc * @return address to continue parsing */ static const char * grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se, const char * lastc) { const char *opts, *o; char *args = NULL; ARGV_t argv = NULL; int argc = 0; int c; /* Copy macro name as argv[0] */ argvAdd(&argv, me->name); addMacro(mb->mc, "0", NULL, me->name, mb->depth); /* * Make a copy of se up to lastc string that we can pass to argvSplit(). * Append the results to main argv. */ { ARGV_t av = NULL; char *s = xcalloc((lastc-se)+1, sizeof(*s)); memcpy(s, se, (lastc-se)); argvSplit(&av, s, " \t"); argvAppend(&argv, av); argvFree(av); free(s); } /* * The macro %* analoguous to the shell's $* means "Pass all non-macro * parameters." Consequently, there needs to be a macro that means "Pass all * (including macro parameters) options". This is useful for verifying * parameters during expansion and yet transparently passing all parameters * through for higher level processing (e.g. %description and/or %setup). * This is the (potential) justification for %{**} ... */ args = argvJoin(argv + 1, " "); addMacro(mb->mc, "**", NULL, args, mb->depth); free(args); /* * POSIX states optind must be 1 before any call but glibc uses 0 * to (re)initialize getopt structures, eww. */ #ifdef __GLIBC__ optind = 0; #else optind = 1; #endif opts = me->opts; argc = argvCount(argv); /* Define option macros. */ while((c = getopt(argc, argv, opts)) != -1) { char *name = NULL, *body = NULL; if (c == '?' || (o = strchr(opts, c)) == NULL) { rpmlog(RPMLOG_ERR, _("Unknown option %c in %s(%s)\n"), (char)c, me->name, opts); goto exit; } rasprintf(&name, "-%c", c); if (optarg) { rasprintf(&body, "-%c %s", c, optarg); } else { rasprintf(&body, "-%c", c); } addMacro(mb->mc, name, NULL, body, mb->depth); free(name); free(body); if (optarg) { rasprintf(&name, "-%c*", c); addMacro(mb->mc, name, NULL, optarg, mb->depth); free(name); } } /* Add argument count (remaining non-option items) as macro. */ { char *ac = NULL; rasprintf(&ac, "%d", (argc - optind)); addMacro(mb->mc, "#", NULL, ac, mb->depth); free(ac); } /* Add macro for each argument */ if (argc - optind) { for (c = optind; c < argc; c++) { char *name = NULL; rasprintf(&name, "%d", (c - optind + 1)); addMacro(mb->mc, name, NULL, argv[c], mb->depth); free(name); } } /* Add concatenated unexpanded arguments as yet another macro. */ args = argvJoin(argv + optind, " "); addMacro(mb->mc, "*", NULL, args ? args : "", mb->depth); free(args); exit: argvFree(argv); return *lastc ? lastc + 1 : lastc; }
static int printGlob(const char * path) { rpmop op = memset(alloca(sizeof(*op)), 0, sizeof(*op)); glob_t gl = { .gl_pathc = 0, .gl_pathv = NULL, .gl_offs = 0 }; int rc; int xx; fprintf(stderr, "===== %s\n", path); xx = rpmswEnter(op, 0); gl.gl_pathc = 0; gl.gl_pathv = NULL; gl.gl_offs = 0; rc = Glob(path, 0, my_Glob_error, &gl); if (rc != 0) { fprintf(stderr, "*** Glob rc %d\n", rc); } else if (rpmIsVerbose()) { int i; for (i = 0; i < (int)gl.gl_pathc; i++) fprintf(stderr, "%5d %s\n", i, gl.gl_pathv[i]); } Globfree(&gl); xx = rpmswExit(op, 0); if (_rpmsw_stats) rpmswPrint("glob:", op, NULL); return rc; } static struct poptOption optionsTable[] = { { "debug", 'd', POPT_ARG_VAL, &__debug, -1, NULL, NULL }, { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0, N_("Common options for all rpmio executables:"), NULL }, POPT_AUTOHELP POPT_TABLEEND }; int main(int argc, char *argv[]) { poptContext optCon = rpmioInit(argc, argv, optionsTable); ARGV_t av; int ac; const char * dn; int rc = 0; if (__debug) { _av_debug = -1; _dav_debug = -1; _ftp_debug = -1; _url_debug = -1; _rpmio_debug = -1; } av = poptGetArgs(optCon); ac = argvCount(av); if (ac < 1) { poptPrintUsage(optCon, stderr, 0); goto exit; } while (rc == 0 && (dn = *av++) != NULL) rc = printGlob(dn); exit: optCon = rpmioFini(optCon); return rc; }
int main(int argc, char *const argv[]) { poptContext optCon = rpmioInit(argc, argv, optionsTable); ARGV_t av; int ac; rpmdict dict; EVR_t evr = (EVR_t) xcalloc(1, sizeof(*evr)); const char * arg; int rc = 0; int xx; int i; if ((progname = strrchr(argv[0], '/')) != NULL) progname++; else progname = argv[0]; av = NULL; (void) argvAppend(&av, poptGetArgs(optCon)); ac = argvCount(av); if (ac == 0 || !strcmp(*av, "-")) { av = NULL; xx = argvFgets(&av, NULL); ac = argvCount(av); } dict = rpmdictCreate(); if (av != NULL) for (i = 0; (arg = av[i]) != NULL; i++) { if (*arg == '\0') /* Skip cruft */ continue; s.total++; if (nofiles && *arg == '/') { /* Skip file paths. */ s.files++; continue; } if (noKdigests && isKdigest(arg)) { /* Skip kernel MD5/SHA1. */ s.Kdigest++; continue; } if (noOdigests && isOdigest(arg)) { /* Skip OCAML EVR strings. */ s.Odigest++; continue; } /* Split E:V-R into components. */ xx = rpmEVRparse(arg, evr); if (evr->F[RPMEVR_E] == NULL) { evr->F[RPMEVR_E] = "0"; s.Emiss++; } if (evr->F[RPMEVR_R] == NULL) { evr->F[RPMEVR_R] = ""; s.Rmiss++; } rpmdictAdd(dict, evr->F[RPMEVR_E]); rpmdictAdd(dict, evr->F[RPMEVR_V]); rpmdictAdd(dict, evr->F[RPMEVR_R]); if (__debug) fprintf(stderr, "%5d: %s => %s:%s-%s\n", s.total, arg, evr->F[RPMEVR_E], evr->F[RPMEVR_V], evr->F[RPMEVR_R]); evr->str = _free(evr->str); } (void) argvSort(dict->av,(int (*)(const char **, const char **))rpmdictCmp); /* Compute size of string & uuid store. */ if (av != NULL) for (i = 0; av[i] != NULL; i++) { s.strnb += sizeof(*av) + strlen(av[i]) + 1; s.uuidnb += 64/8; } s.strnb += sizeof(*av) + 1; /* Compute size of dictionary store. */ for (i = 0; dict->av[i] != NULL; i++) { s.dictnb += sizeof(*dict->av) + strlen(dict->av[i]) + 1; } s.dictnb += sizeof(*dict->av) + 1; fprintf(stderr, "total:%u files:%u Kdigest:%u Odigest:%u Emiss:%u Rmiss:%u dictlen:%u strnb:%u dictnb:%u uuidnb:%u\n", s.total, s.files, s.Kdigest, s.Odigest, s.Emiss, s.Rmiss, argvCount(dict->av), (unsigned)s.strnb, (unsigned)s.dictnb, (unsigned)s.uuidnb); if (__debug) argvPrint("E:V-R dictionary", dict->av, NULL); evr = _free(evr); dict = rpmdictFree(dict); av = argvFree(av); optCon = rpmioFini(optCon); return rc; }
int processPackages(rpmts *ts, int tscount, const char *packagelistfn, int ignoremissing) { int rc = 0; int count = 0; int sz = 100; int i = 0; int missing = 0; FILE *f = fopen(packagelistfn, "r" ); if(f) { char line[255]; while(fgets(line, sizeof(line), f)) { int len = strlen(line) - 1; if(len > 0) // Trim trailing whitespace while(len > 0 && isspace(line[len])) line[len--] = '\0'; if(len > 0) { int found = 0; for(i=0; i<tscount; i++) { ARGV_t keys = NULL; rpmdb db = rpmtsGetRdb(ts[i]); rc = rpmdbMireApply(db, RPMTAG_NAME, RPMMIRE_STRCMP, line, &keys); if (keys) { int nkeys = argvCount(keys); if( nkeys == 1 ) { char *value = NULL; rc = getPackageStr(ts[i], keys[0], RPMTAG_PACKAGEORIGIN, &value); if(rc == 0) fprintf(outf, "%s\n", value); else fprintf(stderr, "Failed to get package origin for %s\n", line); found = 1; } else if( nkeys > 1 ) { int keyindex = 0; fprintf(stderr, "Multiple matches for %s:\n", line); for( keyindex=0; keyindex<nkeys; keyindex++) { char *value = NULL; rc = getPackageStr(ts[i], keys[keyindex], RPMTAG_PACKAGEORIGIN, &value); if(rc == 0) fprintf(stderr, " %s\n", value); else fprintf(stderr, " (%s)\n", keys[keyindex]); } } } if(found) break; } if( !found ) { if( ignoremissing ) { fprintf(stderr, "Unable to resolve package %s - ignoring\n", line); } else { fprintf(stderr, "Unable to resolve package %s\n", line); missing = 1; } } } count++; } fclose(f); if( missing ) { fprintf(stderr, "ERROR: some packages were missing\n"); rc = 1; } } else { perror(packagelistfn); rc = -1; } return rc; }
int printDepList(rpmts *ts, int tscount) { int rc = 0; if( tscount > 1 ) fprintf(stderr, ">1 database specified with dependency list, using first only\n"); /* Get list of names */ rpmdb db = rpmtsGetRdb(ts[0]); ARGV_t names = NULL; rc = rpmdbMireApply(db, RPMTAG_NAME, RPMMIRE_STRCMP, NULL, &names); int nnames = argvCount(names); /* Get list of NVRAs */ ARGV_t keys = NULL; rc = rpmdbMireApply(db, RPMTAG_NVRA, RPMMIRE_STRCMP, NULL, &keys); if (keys) { int i, j; HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he)); int nkeys = argvCount(keys); for(i=0; i<nkeys; i++) { rpmmi mi = rpmmiInit(db, RPMTAG_NVRA, keys[i], 0); Header h; if ((h = rpmmiNext(mi)) != NULL) { /* Get name of package */ he->tag = RPMTAG_NAME; rc = (headerGet(h, he, 0) != 1); char *name = strdup((char *)he->p.ptr); /* Get its requires */ he->tag = RPMTAG_REQUIRENAME; if (rc = (headerGet(h, he, 0) != 1)) { if (debugmode) { printf("DEBUG: %s requires null\n", name); } rc = 0; free(name); (void)rpmmiFree(mi); continue; } ARGV_t reqs = (ARGV_t)he->p.ptr; /* Get its requireflags */ he->tag = RPMTAG_REQUIREFLAGS; rc = (headerGet(h, he, 0) != 1); rpmuint32_t *reqflags = (rpmuint32_t *)he->p.ui32p; for(j=0; j<he->c; j++) { int k; char *prov = NULL; for(k=0; k<nnames; k++) { if(strcmp(names[k], reqs[j]) == 0) { prov = names[k]; break; } } if(prov) { if((int)reqflags[j] & 0x80000) fprintf(outf, "%s|%s [REC]\n", name, prov); else fprintf(outf, "%s|%s\n", name, prov); } else { rc = lookupProvider(ts[0], reqs[j], &prov); if(rc==0 && prov) { if((int)reqflags[j] & 0x80000) fprintf(outf, "%s|%s [REC]\n", name, prov); else fprintf(outf, "%s|%s\n", name, prov); free(prov); } } } free(name); } (void)rpmmiFree(mi); } } return rc; }
static JSBool rpmts_dbkeys(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmtsClass, NULL); rpmts ts = ptr; jsval tagid = JSVAL_VOID; jsval v = JSVAL_VOID; rpmTag tag = RPMTAG_NVRA; rpmMireMode _mode = RPMMIRE_PCRE; const char * _pat = "^a.*$"; ARGV_t _av = NULL; JSBool ok = JS_FALSE; int xx; _METHOD_DEBUG_ENTRY(_debug); if (!(ok = JS_ConvertArguments(cx, argc, argv, "/vvu", &v, &tagid, &v, &_mode))) goto exit; if (!JSVAL_IS_VOID(tagid)) { /* XXX TODO: make sure both tag and key were specified. */ tag = JSVAL_IS_INT(tagid) ? (rpmTag) JSVAL_TO_INT(tagid) : tagValue(JS_GetStringBytes(JS_ValueToString(cx, tagid))); } if (JSVAL_IS_VOID(v)) _pat = "^.*$"; else if (JSVAL_IS_NULL(v)) _pat = NULL; else if (JSVAL_IS_STRING(v)) _pat = JS_GetStringBytes(JS_ValueToString(cx, v)); #ifdef NOTYET else if (JSVAL_IS_NUMBER(v)) { uint32_t _u = 0; if (!JS_ValueToECMAUint32(cx, v, &_u)) { *rval = JSVAL_VOID; goto exit; } } else ; #endif switch (_mode) { default: *rval = JSVAL_VOID; goto exit; break; case RPMMIRE_DEFAULT: case RPMMIRE_STRCMP: case RPMMIRE_REGEX: case RPMMIRE_GLOB: case RPMMIRE_PCRE: break; } if (rpmtsGetRdb(ts) == NULL) xx = rpmtsOpenDB(ts, O_RDONLY); if (rpmdbMireApply(rpmtsGetRdb(ts), tag, _mode, _pat, &_av)) *rval = JSVAL_VOID; else if (_av == NULL || _av[0] == NULL) *rval = JSVAL_NULL; else { int _ac = argvCount(_av); int i; JSObject * arr = JS_NewArrayObject(cx, 0, NULL); *rval = OBJECT_TO_JSVAL(arr); for (i = 0; i < _ac; i++) { v = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, _av[i])); ok = JS_SetElement(cx, arr, i, &v); } } exit: ok = JS_TRUE; _av = argvFree(_av); return ok; }