1.1 --- a/rpm.c Thu Jan 03 09:32:31 2008 -0500
1.2 +++ b/rpm.c Fri Feb 29 11:51:58 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 +}