Bug 24570 - misc/rpm - unusable librpm, getmntent unresolved
Summary: misc/rpm - unusable librpm, getmntent unresolved
Status: Closed FIXED
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: Any Any
: Normal Affects Only Me
Assignee: Yukihiro Nakai
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2001-01-23 12:50 UTC by Roman Shterenzon
Modified: 2001-03-20 13:36 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Roman Shterenzon 2001-01-23 12:50:01 UTC
The librpm library created by misc/rpm port isn't usable -
when linking, the getmntent symbol is not resolved (it's absent in FreeBSD)

Fix: 

I've used a workaround - created a file with:
#include <stdio.h>
void *getmntent(FILE *filep)
{
  return NULL;
}

and linked it with the app. For some apps it does the trick.
How-To-Repeat: 
Try to build some librpm application, example is attached below.

#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <glob.h>
#include <dirent.h>
#include <rpmlib.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#define FILENAME_TAG 1000000
#define FILESIZE_TAG 1000001

int tags[] =  { RPMTAG_NAME, RPMTAG_VERSION, RPMTAG_RELEASE, RPMTAG_SERIAL,
		RPMTAG_DIRNAMES, RPMTAG_BASENAMES, RPMTAG_DIRINDEXES,
		RPMTAG_FILESIZES, RPMTAG_GROUP, RPMTAG_REQUIREFLAGS, 
		RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, RPMTAG_DESCRIPTION, 
		RPMTAG_SUMMARY, RPMTAG_PROVIDES, RPMTAG_SIZE, 
		RPMTAG_OBSOLETES };
int numTags = sizeof(tags) / sizeof(int);

int main(int argc, char ** argv) {
    char buf[300];
    DIR * dir;
    FD_t outfd, fd;
    struct dirent * ent;
    int rc, isSource;
    Header h;
    struct stat sb;
    int_32 size;

    if (argc < 2 || argc > 3) {
	fprintf(stderr, "usage: genhdlist <dir>\n");
	exit(1);
    }

    if (*argv[1] != '/') {
        getcwd(buf, 300);
        strcat(buf, "/");
        strcat(buf, argv[1]);
    } else 
        strcpy(buf, argv[1]);

    strcat(buf, "/RedHat/RPMS");

    dir = opendir(buf);
    if (!dir) {
	fprintf(stderr,"error opening directory %s: %s\n", buf,
		strerror(errno));
	return 1;
    }
    chdir(buf);

    strcat(buf, "/../base/hdlist");
    if (argv[2] && *argv[2])
	strcpy(buf, argv[2]);

    unlink(buf);
    
    outfd = Fopen(buf, "w");
    if (!outfd) {
	fprintf(stderr,"error creating file %s: %s\n", buf, strerror(errno));
	return 1;
    }

    errno = 0;
    ent = readdir(dir);
    if (errno) {
	perror("readdir");
	return 1;
    }

    while (ent) {
       int i = strlen (ent->d_name);
       if (i > 4 && strcasecmp (&ent->d_name [i - 4], ".rpm") == 0) {
	    fd = Fopen(ent->d_name, "r");

	    if (!fd) {
		perror("open");
		exit(1);
	    }

	    if (stat(ent->d_name, &sb)) {
		perror("stat");
		exit(1);
	    }
	    size = sb.st_size;

	    rc = rpmReadPackageHeader(fd, &h, &isSource, NULL, NULL);

	    if (!rc) {
  	        headerRemoveEntry(h, RPMTAG_POSTIN);
		headerRemoveEntry(h, RPMTAG_POSTUN);
		headerRemoveEntry(h, RPMTAG_PREIN);
		headerRemoveEntry(h, RPMTAG_PREUN);
		headerRemoveEntry(h, RPMTAG_FILEUSERNAME);
		headerRemoveEntry(h, RPMTAG_FILEGROUPNAME);
		headerRemoveEntry(h, RPMTAG_FILEVERIFYFLAGS);
		headerRemoveEntry(h, RPMTAG_FILERDEVS);
		headerRemoveEntry(h, RPMTAG_FILEMTIMES);
		headerRemoveEntry(h, RPMTAG_FILEDEVICES);
		headerRemoveEntry(h, RPMTAG_FILEINODES);
		headerRemoveEntry(h, RPMTAG_TRIGGERSCRIPTS);
		headerRemoveEntry(h, RPMTAG_TRIGGERVERSION);
		headerRemoveEntry(h, RPMTAG_TRIGGERFLAGS);
		headerRemoveEntry(h, RPMTAG_TRIGGERNAME);
		headerRemoveEntry(h, RPMTAG_CHANGELOGTIME);
		headerRemoveEntry(h, RPMTAG_CHANGELOGNAME);
		headerRemoveEntry(h, RPMTAG_CHANGELOGTEXT);
		headerRemoveEntry(h, RPMTAG_ICON);
		headerRemoveEntry(h, RPMTAG_GIF);
		headerRemoveEntry(h, RPMTAG_VENDOR);
		headerRemoveEntry(h, RPMTAG_EXCLUDE);
		headerRemoveEntry(h, RPMTAG_EXCLUSIVE);
		headerRemoveEntry(h, RPMTAG_DISTRIBUTION);
		headerRemoveEntry(h, RPMTAG_VERIFYSCRIPT);
		headerAddEntry(h, FILENAME_TAG, RPM_STRING_TYPE, ent->d_name, 1);
		headerAddEntry(h, FILESIZE_TAG, RPM_INT32_TYPE, 
				&size, 1);
		headerWrite(outfd, h, HEADER_MAGIC_YES);
		headerFree(h);
	    }
	    fdio->close(fd);
	}

	errno = 0;
	ent = readdir(dir);
	if (errno) {
	    perror("readdir");
	    return 1;
	}
    } 

    closedir(dir);
    fdio->close(outfd);

    return 0;
}
Comment 1 Yukihiro Nakai freebsd_committer freebsd_triage 2001-02-14 21:18:49 UTC
Responsible Changed
From-To: freebsd-ports->nakai

I'll take this.
Comment 2 Yukihiro Nakai freebsd_committer freebsd_triage 2001-03-20 13:36:05 UTC
State Changed
From-To: open->closed

Change commited, thanks!