[Rpm-maint] how to free memory after querying installed pkgs....

Pazzo Da Legare pazzodalegare at gmail.com
Wed Dec 19 11:58:10 UTC 2007


Dear all,

I want to make simple query on pkgs in rpmdb. I wrote this simple
function...but I don't understand how to free resources. I tried this
function on every package querying for pkg description and pkg
summary...but I have a memory leakage. Could you help me? If I use the
headerFree() function after rpmdbFreeIterator() I got a segmentation
fault...

Tnx,

pazzodalegare


char *queryPackage(char *pkgName, const char *query,  char **perrMsg){
	Header h;
	rpmts ts;
	int rc;
	char *sResult=NULL, *errMsg=NULL;

	//necessario per impostare il dbpath
	rpmReadConfigFiles( NULL, NULL );
	ts = rpmtsCreate();
	rc = rpmtsOpenDB(ts, O_RDONLY);

	if( rc != 0 ) {
		fprintf( stderr, "cannot open RPM database.\n" );
		*perrMsg = (char *)rpmErrorString();
		return ( NULL );
	}

	rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMTAG_NAME, pkgName, 0);

	while( (h=rpmdbNextIterator(mi) )!=NULL ) {
		sResult = headerSprintf(h, query, rpmTagTable, rpmHeaderFormats,
(errmsg_t *)&errMsg);
		if(!errMsg){
			if(sResult)
				break; //only one pkg with pkgName		
	}
	rpmdbFreeIterator(mi);	
	//headerFree(h)       //<- this give me a segmentation fault
	rpmtsCloseDB(ts);
	ts = rpmtsFree(ts);
	*perrMsg = errMsg;
	return sResult;
}



More information about the Rpm-maint mailing list