rpmds rpmdsFree(rpmds ds) { rpmTagVal tagEVR, tagF, tagTi; if (ds == NULL) return NULL; if (ds->nrefs > 1) return rpmdsUnlink(ds); if (dsType(ds->tagN, NULL, &tagEVR, &tagF, &tagTi)) return NULL; if (ds->Count > 0) { ds->N = _free(ds->N); ds->EVR = _free(ds->EVR); ds->Flags = _free(ds->Flags); ds->ti = _free(ds->ti); } ds->pool = rpmstrPoolFree(ds->pool); ds->DNEVR = _free(ds->DNEVR); ds->Color = _free(ds->Color); (void) rpmdsUnlink(ds); memset(ds, 0, sizeof(*ds)); /* XXX trash and burn */ ds = _free(ds); return NULL; }
fingerPrintCache fpCacheFree(fingerPrintCache cache) { if (cache) { cache->ht = rpmFpEntryHashFree(cache->ht); cache->fp = rpmFpHashFree(cache->fp); cache->pool = rpmstrPoolFree(cache->pool); free(cache); } return NULL; }
void rpmtsEmpty(rpmts ts) { tsMembers tsmem = rpmtsMembers(ts); if (ts == NULL) return; rpmtsClean(ts); for (int oc = 0; oc < tsmem->orderCount; oc++) { tsmem->order[oc] = rpmteFree(tsmem->order[oc]); } tsmem->orderCount = 0; /* The pool cannot be emptied, there might be references to its contents */ tsmem->pool = rpmstrPoolFree(tsmem->pool); removedHashEmpty(tsmem->removedPackages); return; }
rpmal rpmalFree(rpmal al) { availablePackage alp; int i; if (al == NULL) return NULL; if ((alp = al->list) != NULL) for (i = 0; i < al->size; i++, alp++) { alp->obsoletes = rpmdsFree(alp->obsoletes); alp->provides = rpmdsFree(alp->provides); alp->fi = rpmfilesFree(alp->fi); } al->pool = rpmstrPoolFree(al->pool); al->list = _free(al->list); al->alloced = 0; rpmalFreeIndex(al); al = _free(al); return NULL; }
int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet) { int rc = -1; /* assume failure */ tsMembers tsmem = rpmtsMembers(ts); rpmtxn txn = NULL; rpmps tsprobs = NULL; int TsmPreDone = 0; /* TsmPre hook hasn't been called */ /* Force default 022 umask during transaction for consistent results */ mode_t oldmask = umask(022); /* Empty transaction, nothing to do */ if (rpmtsNElements(ts) <= 0) { rc = 0; goto exit; } /* If we are in test mode, then there's no need for transaction lock. */ if (!(rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)) { if (!(txn = rpmtxnBegin(ts, RPMTXN_WRITE))) { goto exit; } } /* Setup flags and such, open the DB */ if (rpmtsSetup(ts, ignoreSet)) { goto exit; } /* Check package set for problems */ tsprobs = checkProblems(ts); /* Run pre transaction hook for all plugins */ TsmPreDone = 1; if (rpmpluginsCallTsmPre(rpmtsPlugins(ts), ts) == RPMRC_FAIL) { goto exit; } if (!rpmpsNumProblems(tsprobs)) { /* Run file triggers in this package other package(s) set off. */ runFileTriggers(ts, NULL, RPMSENSE_TRIGGERUN, RPMSCRIPT_TRANSFILETRIGGER, 0); /* Run file triggers in other package(s) this package sets off. */ runTransScripts(ts, PKG_TRANSFILETRIGGERUN); } /* Run pre-transaction scripts, but only if there are no known * problems up to this point and not disabled otherwise. */ if (!((rpmtsFlags(ts) & (RPMTRANS_FLAG_BUILD_PROBS|RPMTRANS_FLAG_NOPRETRANS)) || (rpmpsNumProblems(tsprobs)))) { rpmlog(RPMLOG_DEBUG, "running pre-transaction scripts\n"); runTransScripts(ts, PKG_PRETRANS); } tsprobs = rpmpsFree(tsprobs); /* Compute file disposition for each package in transaction set. */ if (rpmtsPrepare(ts)) { goto exit; } /* Check again for problems (now including file conflicts, duh */ tsprobs = rpmtsProblems(ts); /* If unfiltered problems exist, free memory and return. */ if ((rpmtsFlags(ts) & RPMTRANS_FLAG_BUILD_PROBS) || (rpmpsNumProblems(tsprobs))) { rc = tsmem->orderCount; goto exit; } /* Free up memory taken by problem sets */ tsprobs = rpmpsFree(tsprobs); rpmtsCleanProblems(ts); /* * Free up the global string pool unless we expect it to be needed * again. During the transaction, private pools will be used for * rpmfi's etc. */ if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_TEST|RPMTRANS_FLAG_BUILD_PROBS))) tsmem->pool = rpmstrPoolFree(tsmem->pool); /* Actually install and remove packages, get final exit code */ rc = rpmtsProcess(ts) ? -1 : 0; /* Run post-transaction scripts unless disabled */ if (!(rpmtsFlags(ts) & (RPMTRANS_FLAG_NOPOSTTRANS))) { rpmlog(RPMLOG_DEBUG, "running post-transaction scripts\n"); runTransScripts(ts, PKG_POSTTRANS); } /* Run file triggers in other package(s) this package sets off. */ runFileTriggers(ts, NULL, RPMSENSE_TRIGGERIN, RPMSCRIPT_TRANSFILETRIGGER, 0); runPostUnTransFileTrigs(ts); /* Run file triggers in this package other package(s) set off. */ runTransScripts(ts, PKG_TRANSFILETRIGGERIN); exit: /* Run post transaction hook for all plugins */ if (TsmPreDone) /* If TsmPre hook has been called, call the TsmPost hook */ rpmpluginsCallTsmPost(rpmtsPlugins(ts), ts, rc); /* Finish up... */ (void) umask(oldmask); (void) rpmtsFinish(ts); rpmpsFree(tsprobs); rpmtxnEnd(txn); return rc; }
rpmfi rpmfiFree(rpmfi fi) { if (fi == NULL) return NULL; if (fi->nrefs > 1) return rpmfiUnlink(fi); if (fi->fc > 0) { fi->bnid = _free(fi->bnid); fi->dnid = _free(fi->dnid); fi->dil = _free(fi->dil); fi->flinks = _free(fi->flinks); fi->flangs = _free(fi->flangs); fi->digests = _free(fi->digests); fi->fcaps = _free(fi->fcaps); fi->cdict = _free(fi->cdict); fi->fuser = _free(fi->fuser); fi->fgroup = _free(fi->fgroup); fi->fstates = _free(fi->fstates); fi->fps = _free(fi->fps); fi->pool = rpmstrPoolFree(fi->pool); /* these point to header memory if KEEPHEADER is used, dont free */ if (!(fi->fiflags & RPMFI_KEEPHEADER) && fi->h == NULL) { fi->fmtimes = _free(fi->fmtimes); fi->fmodes = _free(fi->fmodes); fi->fflags = _free(fi->fflags); fi->vflags = _free(fi->vflags); fi->fsizes = _free(fi->fsizes); fi->lfsizes = _free(fi->lfsizes); fi->frdevs = _free(fi->frdevs); fi->finodes = _free(fi->finodes); fi->fcolors = _free(fi->fcolors); fi->fcdictx = _free(fi->fcdictx); fi->ddict = _free(fi->ddict); fi->fddictx = _free(fi->fddictx); fi->fddictn = _free(fi->fddictn); } } fi->fn = _free(fi->fn); fi->apath = _free(fi->apath); fi->replacedSizes = _free(fi->replacedSizes); fi->replacedLSizes = _free(fi->replacedLSizes); fi->h = headerFree(fi->h); (void) rpmfiUnlink(fi); memset(fi, 0, sizeof(*fi)); /* XXX trash and burn */ fi = _free(fi); return NULL; }