static rpmds singleDS(rpmTagVal tagN, const char * N, const char * EVR, rpmsenseFlags Flags, unsigned int instance, rpm_color_t Color) { rpmds ds = NULL; const char * Type; if (dsType(tagN, &Type, NULL, NULL)) goto exit; ds = xcalloc(1, sizeof(*ds)); ds->Type = Type; ds->tagN = tagN; ds->Count = 1; ds->nopromote = _rpmds_nopromote; ds->instance = instance; ds->N = rpmdsDupArgv(&N, 1); ds->EVR = rpmdsDupArgv(&EVR, 1); ds->Flags = xmalloc(sizeof(*ds->Flags)); ds->Flags[0] = Flags; ds->i = 0; if (Color) rpmdsSetColor(ds, Color); exit: return rpmdsLink(ds); }
static rpmds rpmdsDup(const rpmds ods) { rpmds ds = xcalloc(1, sizeof(*ds)); size_t nb; ds->Type = ods->Type; ds->tagN = ods->tagN; ds->Count = ods->Count; ds->i = ods->i; ds->l = ods->l; ds->u = ods->u; ds->nopromote = ods->nopromote; ds->N = rpmdsDupArgv(ods->N, ods->Count); /* XXX rpm prior to 3.0.2 did not always supply EVR and Flags. */ assert(ods->EVR != NULL); assert(ods->Flags != NULL); ds->EVR = rpmdsDupArgv(ods->EVR, ods->Count); nb = (ds->Count * sizeof(*ds->Flags)); ds->Flags = memcpy(xmalloc(nb), ods->Flags, nb); return rpmdsLink(ds); }
void rpmalAdd(rpmal al, rpmte p) { rpmalNum pkgNum; availablePackage alp; if (al->size == al->alloced) { al->alloced += al->delta; al->list = xrealloc(al->list, sizeof(*al->list) * al->alloced); } pkgNum = al->size++; alp = al->list + pkgNum; alp->p = p; alp->provides = rpmdsLink(rpmteDS(p, RPMTAG_PROVIDENAME)); alp->fi = rpmfiLink(rpmteFI(p)); if (al->providesHash != NULL) { // index is already created rpmalAddProvides(al, pkgNum, alp->provides); rpmalAddFiles(al, pkgNum, alp->fi); } assert(((rpmalNum)(alp - al->list)) == pkgNum); }
/* --- Object methods */ static JSBool rpmte_ds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmteClass, NULL); rpmte te = ptr; rpmTag tagN = RPMTAG_NAME; JSBool ok = JS_FALSE; _METHOD_DEBUG_ENTRY(_debug); if (!(ok = JS_ConvertArguments(cx, argc, argv, "/i", &tagN))) goto exit; { rpmds ds = NULL; JSObject *dso = NULL; if ((ds = rpmteDS(te, tagN)) == NULL) *rval = JSVAL_NULL; else if ((dso = JS_NewObject(cx, &rpmdsClass, NULL, NULL)) != NULL && JS_SetPrivate(cx, dso, rpmdsLink(ds, __FUNCTION__))) *rval = OBJECT_TO_JSVAL(dso); else { ds = rpmdsFree(ds); *rval = JSVAL_VOID; } } ok = JS_TRUE; exit: return ok; }
void rpmalAdd(rpmal al, rpmte p) { rpmalNum pkgNum; availablePackage alp; if (al->size == al->alloced) { al->alloced += al->delta; al->list = xrealloc(al->list, sizeof(*al->list) * al->alloced); } pkgNum = al->size++; alp = al->list + pkgNum; alp->p = p; alp->provides = rpmdsLink(rpmteDS(p, RPMTAG_PROVIDENAME)); alp->obsoletes = rpmdsLink(rpmteDS(p, RPMTAG_OBSOLETENAME)); alp->fi = rpmteFiles(p); /* * Transition-time safe-guard to catch private-pool uses. * File sets with no files have NULL pool, that's fine. But WTF is up * with the provides: every single package should have at least its * own name as a provide, and thus never NULL, and normal use matches * this expectation. However the test-suite is tripping up on NULL * NULL pool from NULL alp->provides in numerous cases? */ { rpmstrPool fipool = rpmfilesPool(alp->fi); rpmstrPool dspool = rpmdsPool(alp->provides); assert(fipool == NULL || fipool == al->pool); assert(dspool == NULL || dspool == al->pool); } /* Try to be lazy as delayed hash creation is cheaper */ if (al->providesHash != NULL) rpmalAddProvides(al, pkgNum, alp->provides); if (al->obsoletesHash != NULL) rpmalAddObsoletes(al, pkgNum, alp->obsoletes); if (al->fileHash != NULL) rpmalAddFiles(al, pkgNum, alp->fi); assert(((rpmalNum)(alp - al->list)) == pkgNum); }
static rpmds rpmdsCreate(rpmstrPool pool, rpmTagVal tagN, const char * Type, int Count, unsigned int instance) { rpmds ds = xcalloc(1, sizeof(*ds)); ds->pool = (pool != NULL) ? rpmstrPoolLink(pool) : rpmstrPoolCreate(); ds->tagN = tagN; ds->Type = Type; ds->Count = Count; ds->instance = instance; ds->nopromote = _rpmds_nopromote; ds->i = -1; return rpmdsLink(ds); }
rpmds rpmdsNew(Header h, rpmTagVal tagN, int flags) { rpmTagVal tagEVR, tagF; rpmds ds = NULL; const char * Type; struct rpmtd_s names; headerGetFlags hgflags = HEADERGET_ALLOC|HEADERGET_ARGV; if (dsType(tagN, &Type, &tagEVR, &tagF)) goto exit; if (headerGet(h, tagN, &names, hgflags) && rpmtdCount(&names) > 0) { struct rpmtd_s evr, flags; ds = xcalloc(1, sizeof(*ds)); ds->Type = Type; ds->i = -1; ds->DNEVR = NULL; ds->tagN = tagN; ds->N = names.data; ds->Count = rpmtdCount(&names); ds->nopromote = _rpmds_nopromote; ds->instance = headerGetInstance(h); headerGet(h, tagEVR, &evr, hgflags); ds->EVR = evr.data; headerGet(h, tagF, &flags, hgflags); ds->Flags = flags.data; /* ensure rpmlib() requires always have RPMSENSE_RPMLIB flag set */ if (tagN == RPMTAG_REQUIRENAME && ds->Flags) { for (int i = 0; i < ds->Count; i++) { if (!(ds->Flags[i] & RPMSENSE_RPMLIB) && rstreqn(ds->N[i], "rpmlib(", sizeof("rpmlib(")-1)) ds->Flags[i] |= RPMSENSE_RPMLIB; } } ds = rpmdsLink(ds); } exit: return ds; }