2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009 J. Ali Harlow <ali@juiblex.co.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 * Enable rpm 4.4 compatibility mode, see http://rpm.org/wiki/Releases/4.6.0
30 #define _RPM_4_4_COMPAT
31 #include <rpm/rpmlib.h>
32 #include <rpm/rpmdb.h>
46 rpm_to_razor_flags(uint32_t flags)
51 if (flags & RPMSENSE_LESS)
52 razor_flags |= RAZOR_PROPERTY_LESS;
53 if (flags & RPMSENSE_EQUAL)
54 razor_flags |= RAZOR_PROPERTY_EQUAL;
55 if (flags & RPMSENSE_GREATER)
56 razor_flags |= RAZOR_PROPERTY_GREATER;
58 if (flags & RPMSENSE_SCRIPT_PRE)
59 razor_flags |= RAZOR_PROPERTY_PRE;
60 if (flags & RPMSENSE_SCRIPT_POST)
61 razor_flags |= RAZOR_PROPERTY_POST;
62 if (flags & RPMSENSE_SCRIPT_PREUN)
63 razor_flags |= RAZOR_PROPERTY_PREUN;
64 if (flags & RPMSENSE_SCRIPT_POSTUN)
65 razor_flags |= RAZOR_PROPERTY_POSTUN;
71 add_properties(struct razor_importer *importer,
72 uint32_t type_flags, Header h,
73 int32_t name_tag, int32_t version_tag, int32_t flags_tag)
75 union rpm_entry names, versions, flags;
76 int32_t i, type, count;
78 headerGetEntry(h, name_tag, &type, &names.p, &count);
79 headerGetEntry(h, version_tag, &type, &versions.p, &count);
80 headerGetEntry(h, flags_tag, &type, &flags.p, &count);
82 for (i = 0; i < count; i++)
83 razor_importer_add_property(importer,
85 rpm_to_razor_flags (flags.flags[i]) | type_flags,
90 add_script(struct razor_importer *importer,
91 uint32_t type_flags, Header h,
92 int32_t program_tag, int32_t body_tag)
94 union rpm_entry program, body;
97 headerGetEntry(h, program_tag, &type, &program.p, &count);
98 headerGetEntry(h, body_tag, &type, &body.p, &count);
100 razor_importer_add_script(importer, type_flags,
101 program.string, body.string);
105 razor_set_create_from_rpmdb(void)
107 struct razor_importer *importer;
108 rpmdbMatchIterator iter;
110 int32_t type, count, i;
111 union rpm_entry name, epoch, version, release, arch;
112 union rpm_entry summary, description, url, license;
113 union rpm_entry basenames, dirnames, dirindexes;
114 union rpm_entry install_prefixes;
115 char filename[PATH_MAX], evr[128], buf[16];
117 int imported_count = 0;
119 rpmReadConfigFiles(NULL, NULL);
121 if (rpmdbOpen("", &db, O_RDONLY, 0644) != 0) {
122 fprintf(stderr, "cannot open rpm database\n");
126 importer = razor_importer_create();
128 iter = rpmdbInitIterator(db, 0, NULL, 0);
129 while (h = rpmdbNextIterator(iter), h != NULL) {
130 headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count);
131 headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count);
132 headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
133 headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
134 headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count);
135 headerGetEntry(h, RPMTAG_SUMMARY, &type, &summary.p, &count);
136 headerGetEntry(h, RPMTAG_DESCRIPTION, &type, &description.p,
138 headerGetEntry(h, RPMTAG_URL, &type, &url.p, &count);
139 headerGetEntry(h, RPMTAG_LICENSE, &type, &license.p, &count);
141 if (epoch.flags != NULL) {
142 snprintf(buf, sizeof buf, "%u", *epoch.flags);
143 razor_build_evr(evr, sizeof evr,
144 buf, version.string, release.string);
146 razor_build_evr(evr, sizeof evr,
147 NULL, version.string, release.string);
150 razor_importer_begin_package(importer,
151 name.string, evr, arch.string);
152 razor_importer_add_details(importer, summary.string,
153 description.string, url.string,
156 add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
158 RPMTAG_REQUIREVERSION,
159 RPMTAG_REQUIREFLAGS);
161 add_properties(importer, RAZOR_PROPERTY_PROVIDES, h,
163 RPMTAG_PROVIDEVERSION,
164 RPMTAG_PROVIDEFLAGS);
166 add_properties(importer, RAZOR_PROPERTY_OBSOLETES, h,
168 RPMTAG_OBSOLETEVERSION,
169 RPMTAG_OBSOLETEFLAGS);
171 add_properties(importer, RAZOR_PROPERTY_CONFLICTS, h,
173 RPMTAG_CONFLICTVERSION,
174 RPMTAG_CONFLICTFLAGS);
176 headerGetEntry(h, RPMTAG_BASENAMES, &type,
177 &basenames.p, &count);
178 headerGetEntry(h, RPMTAG_DIRNAMES, &type,
179 &dirnames.p, &count);
180 headerGetEntry(h, RPMTAG_DIRINDEXES, &type,
181 &dirindexes.p, &count);
182 for (i = 0; i < count; i++) {
183 snprintf(filename, sizeof filename, "%s%s",
184 dirnames.list[dirindexes.flags[i]],
186 razor_importer_add_file(importer, filename);
189 add_script(importer, RAZOR_PROPERTY_PREUN, h,
190 RPMTAG_PREUNPROG, RPMTAG_PREUN);
192 add_script(importer, RAZOR_PROPERTY_POSTUN, h,
193 RPMTAG_POSTUNPROG, RPMTAG_POSTUN);
195 headerGetEntry(h, RPMTAG_INSTPREFIXES, &type,
196 &install_prefixes.p, &count);
197 for (i = 0; i < count; i++)
198 razor_importer_add_install_prefix(importer,
199 install_prefixes.list[i]);
201 razor_importer_finish_package(importer);
203 printf("\rimporting %d", ++imported_count);
209 printf("\nsaving\n");
210 return razor_importer_finish(importer);