rpm.c
changeset 128 18350b26395b
parent 91 6884cefd1b8c
child 143 59a9513fac54
     1.1 --- a/rpm.c	Thu Jan 03 09:32:31 2008 -0500
     1.2 +++ b/rpm.c	Wed Feb 20 16:54:03 2008 -0500
     1.3 @@ -9,6 +9,7 @@
     1.4  #include <unistd.h>
     1.5  #include <arpa/inet.h>
     1.6  #include <rpm/rpmlib.h>
     1.7 +#include <rpm/rpmdb.h>
     1.8  #include <zlib.h>
     1.9  
    1.10  #include "razor.h"
    1.11 @@ -73,22 +74,47 @@
    1.12  	return NULL;
    1.13  }
    1.14  
    1.15 +static enum razor_version_relation
    1.16 +rpm_to_razor_flags (uint_32 flags)
    1.17 +{
    1.18 +	switch (flags & (RPMSENSE_LESS | RPMSENSE_EQUAL | RPMSENSE_GREATER)) {
    1.19 +	case RPMSENSE_LESS:
    1.20 +		return RAZOR_VERSION_LESS;
    1.21 +	case RPMSENSE_LESS|RPMSENSE_EQUAL:
    1.22 +		return RAZOR_VERSION_LESS_OR_EQUAL;
    1.23 +	case RPMSENSE_EQUAL:
    1.24 +		return RAZOR_VERSION_EQUAL;
    1.25 +	case RPMSENSE_GREATER|RPMSENSE_EQUAL:
    1.26 +		return RAZOR_VERSION_GREATER_OR_EQUAL;
    1.27 +	case RPMSENSE_GREATER:
    1.28 +		return RAZOR_VERSION_GREATER;
    1.29 +	}
    1.30 +
    1.31 +	/* FIXME? */
    1.32 +	return RAZOR_VERSION_EQUAL;
    1.33 +}
    1.34 +
    1.35  static void
    1.36  import_properties(struct razor_importer *importer, unsigned long type,
    1.37  		  struct razor_rpm *rpm,
    1.38  		  int name_tag, int version_tag, int flags_tag)
    1.39  {
    1.40  	const char *name, *version;
    1.41 +	uint_32 flags;
    1.42  	unsigned int i, count;
    1.43  
    1.44  	name = razor_rpm_get_indirect(rpm, name_tag, &count);
    1.45  	if (name == NULL)
    1.46  		return;
    1.47  
    1.48 +	flags = *(uint_32 *)razor_rpm_get_indirect(rpm, flags_tag, &count);
    1.49 +
    1.50  	/* FIXME: Concat version and release. */
    1.51  	version = razor_rpm_get_indirect(rpm, version_tag, &count);
    1.52  	for (i = 0; i < count; i++) {
    1.53 -		razor_importer_add_property(importer, name, version, type);
    1.54 +		razor_importer_add_property(importer, name,
    1.55 +					    rpm_to_razor_flags (flags),
    1.56 +					    version, type);
    1.57  		name += strlen(name) + 1;
    1.58  		version += strlen(version) + 1;
    1.59  	}
    1.60 @@ -534,3 +560,101 @@
    1.61  
    1.62  	return 0;
    1.63  }
    1.64 +
    1.65 +union rpm_entry {
    1.66 +	void *p;
    1.67 +	char *string;
    1.68 +	char **list;
    1.69 +	uint_32 *flags;
    1.70 +};
    1.71 +
    1.72 +static void
    1.73 +add_properties(struct razor_importer *importer,
    1.74 +	       enum razor_property_type property_type,
    1.75 +	       Header h, int_32 name_tag, int_32 version_tag, int_32 flags_tag)
    1.76 +{
    1.77 +	union rpm_entry names, versions, flags;
    1.78 +	int_32 i, type, count;
    1.79 +
    1.80 +	headerGetEntry(h, name_tag, &type, &names.p, &count);
    1.81 +	headerGetEntry(h, version_tag, &type, &versions.p, &count);
    1.82 +	headerGetEntry(h, flags_tag, &type, &flags.p, &count);
    1.83 +
    1.84 +	for (i = 0; i < count; i++)
    1.85 +		razor_importer_add_property(importer,
    1.86 +					    names.list[i],
    1.87 +					    rpm_to_razor_flags (flags.flags[i]),
    1.88 +					    versions.list[i],
    1.89 +					    property_type);
    1.90 +}
    1.91 +
    1.92 +struct razor_set *
    1.93 +razor_set_create_from_rpmdb(void)
    1.94 +{
    1.95 +	struct razor_importer *importer;
    1.96 +	rpmdbMatchIterator iter;
    1.97 +	Header h;
    1.98 +	int_32 type, count, i;
    1.99 +	union rpm_entry name, version, release;
   1.100 +	union rpm_entry basenames, dirnames, dirindexes;
   1.101 +	char filename[PATH_MAX];
   1.102 +	rpmdb db;
   1.103 +
   1.104 +	rpmReadConfigFiles(NULL, NULL);
   1.105 +
   1.106 +	if (rpmdbOpen("", &db, O_RDONLY, 0644) != 0) {
   1.107 +		fprintf(stderr, "cannot open rpm database\n");
   1.108 +		exit(1);
   1.109 +	}
   1.110 +
   1.111 +	importer = razor_importer_new();
   1.112 +
   1.113 +	iter = rpmdbInitIterator(db, 0, NULL, 0);
   1.114 +	while (h = rpmdbNextIterator(iter), h != NULL) {
   1.115 +		headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count);
   1.116 +		headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
   1.117 +		headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
   1.118 +		snprintf(filename, sizeof filename, "%s-%s",
   1.119 +			 version.string, release.string);
   1.120 +		razor_importer_begin_package(importer, name.string, filename);
   1.121 +
   1.122 +		add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
   1.123 +			       RPMTAG_REQUIRENAME,
   1.124 +			       RPMTAG_REQUIREVERSION,
   1.125 +			       RPMTAG_REQUIREFLAGS);
   1.126 +
   1.127 +		add_properties(importer, RAZOR_PROPERTY_PROVIDES, h,
   1.128 +			       RPMTAG_PROVIDENAME,
   1.129 +			       RPMTAG_PROVIDEVERSION,
   1.130 +			       RPMTAG_PROVIDEFLAGS);
   1.131 +
   1.132 +		add_properties(importer, RAZOR_PROPERTY_OBSOLETES, h,
   1.133 +			       RPMTAG_OBSOLETENAME,
   1.134 +			       RPMTAG_OBSOLETEVERSION,
   1.135 +			       RPMTAG_OBSOLETEFLAGS);
   1.136 +
   1.137 +		add_properties(importer, RAZOR_PROPERTY_CONFLICTS, h,
   1.138 +			       RPMTAG_CONFLICTNAME,
   1.139 +			       RPMTAG_CONFLICTVERSION,
   1.140 +			       RPMTAG_CONFLICTFLAGS);
   1.141 +
   1.142 +		headerGetEntry(h, RPMTAG_BASENAMES, &type,
   1.143 +			       &basenames.p, &count);
   1.144 +		headerGetEntry(h, RPMTAG_DIRNAMES, &type,
   1.145 +			       &dirnames.p, &count);
   1.146 +		headerGetEntry(h, RPMTAG_DIRINDEXES, &type,
   1.147 +			       &dirindexes.p, &count);
   1.148 +		for (i = 0; i < count; i++) {
   1.149 +			snprintf(filename, sizeof filename, "%s%s",
   1.150 +				 dirnames.list[dirindexes.flags[i]],
   1.151 +				 basenames.list[i]);
   1.152 +			razor_importer_add_file(importer, filename);
   1.153 +		}
   1.154 +
   1.155 +		razor_importer_finish_package(importer);
   1.156 +	}
   1.157 +
   1.158 +	rpmdbClose(db);
   1.159 +
   1.160 +	return razor_importer_finish(importer);
   1.161 +}