int main( int argc, char **argv ) { rpmmi mi; Header h; int_32 type, count; char *name; rpmdb db; rpmReadConfigFiles( NULL, NULL ); if( rpmdbOpen( "", &db, O_RDONLY, 0644 ) != 0 ) { fprintf( stderr, "cannot open database!\n" ); exit(EXIT_FAILURE); } mi = rpmmiInit(db, RPMDBI_PACKAGES, NULL, 0); while ((h = rpmmiNext(mi)) != NULL) { headerGetEntry( h, RPMTAG_NAME, &type, (void**)&name, &count ); if( strcmp(name,argv[1]) == 0 ) headerDump( h, stdout, HEADER_DUMP_INLINE, rpmTagTable ); /* * Note that the header reference is "owned" by the iterator, * so no headerFree() is necessary. */ } mi = rpmmiFree(mi); rpmdbClose( db ); return 0; }
int getPackageStr(rpmts ts, const char *NVRA, rpmTag tag, char **value) { int rc = -1; rpmmi mi = rpmmiInit(rpmtsGetRdb(ts), RPMTAG_NVRA, NVRA, 0); Header h; if ((h = rpmmiNext(mi)) != NULL) { HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he)); he->tag = tag; rc = (headerGet(h, he, 0) != 1); if(rc==0) *value = strdup((char *)he->p.ptr); } (void)rpmmiFree(mi); return rc; }
int lookupProvider(rpmts ts, const char *req, char **provider) { int rc = 0; rpmmi provmi = rpmmiInit(rpmtsGetRdb(ts), RPMTAG_PROVIDENAME, req, 0); if(provmi) { Header h; if ((h = rpmmiNext(provmi)) != NULL) { HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he)); he->tag = RPMTAG_NAME; rc = (headerGet(h, he, 0) != 1); if(rc==0) *provider = strdup((char *)he->p.ptr); } (void)rpmmiFree(provmi); } else { 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; }