rhughes@241: /* rhughes@241: * Copyright (C) 2008 Kristian Høgsberg rhughes@241: * Copyright (C) 2008 Red Hat, Inc ali@369: * Copyright (C) 2009 J. Ali Harlow rhughes@241: * rhughes@241: * This program is free software; you can redistribute it and/or modify rhughes@241: * it under the terms of the GNU General Public License as published by rhughes@241: * the Free Software Foundation; either version 2 of the License, or rhughes@241: * (at your option) any later version. rhughes@241: * rhughes@241: * This program is distributed in the hope that it will be useful, rhughes@241: * but WITHOUT ANY WARRANTY; without even the implied warranty of rhughes@241: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the rhughes@241: * GNU General Public License for more details. rhughes@241: * rhughes@241: * You should have received a copy of the GNU General Public License along rhughes@241: * with this program; if not, write to the Free Software Foundation, Inc., rhughes@241: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. rhughes@241: */ rhughes@241: ali@438: #include "config.h" rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include ali@325: #include ali@475: /* ali@475: * Enable rpm 4.4 compatibility mode, see http://rpm.org/wiki/Releases/4.6.0 ali@475: */ ali@475: #define _RPM_4_4_COMPAT rhughes@241: #include rhughes@241: #include rhughes@241: rhughes@241: #include "razor.h" ali@476: #include "import.h" rhughes@241: rhughes@241: union rpm_entry { rhughes@241: void *p; rhughes@241: char *string; rhughes@241: char **list; ali@356: uint32_t *flags; ali@356: uint32_t integer; rhughes@241: }; rhughes@241: krh@247: static uint32_t krh@247: rpm_to_razor_flags(uint32_t flags) rhughes@241: { krh@247: uint32_t razor_flags; rhughes@241: krh@247: razor_flags = 0; krh@247: if (flags & RPMSENSE_LESS) krh@247: razor_flags |= RAZOR_PROPERTY_LESS; krh@247: if (flags & RPMSENSE_EQUAL) krh@247: razor_flags |= RAZOR_PROPERTY_EQUAL; krh@247: if (flags & RPMSENSE_GREATER) krh@247: razor_flags |= RAZOR_PROPERTY_GREATER; krh@247: krh@247: if (flags & RPMSENSE_SCRIPT_PRE) krh@247: razor_flags |= RAZOR_PROPERTY_PRE; krh@247: if (flags & RPMSENSE_SCRIPT_POST) krh@247: razor_flags |= RAZOR_PROPERTY_POST; krh@247: if (flags & RPMSENSE_SCRIPT_PREUN) krh@247: razor_flags |= RAZOR_PROPERTY_PREUN; krh@247: if (flags & RPMSENSE_SCRIPT_POSTUN) krh@247: razor_flags |= RAZOR_PROPERTY_POSTUN; krh@247: krh@247: return razor_flags; rhughes@241: } rhughes@241: rhughes@241: static void rhughes@241: add_properties(struct razor_importer *importer, ali@356: uint32_t type_flags, Header h, ali@356: int32_t name_tag, int32_t version_tag, int32_t flags_tag) rhughes@241: { rhughes@241: union rpm_entry names, versions, flags; ali@356: int32_t i, type, count; rhughes@241: rhughes@241: headerGetEntry(h, name_tag, &type, &names.p, &count); rhughes@241: headerGetEntry(h, version_tag, &type, &versions.p, &count); rhughes@241: headerGetEntry(h, flags_tag, &type, &flags.p, &count); rhughes@241: rhughes@241: for (i = 0; i < count; i++) rhughes@241: razor_importer_add_property(importer, rhughes@241: names.list[i], krh@247: rpm_to_razor_flags (flags.flags[i]) | type_flags, krh@247: versions.list[i]); rhughes@241: } rhughes@241: ali@369: static void ali@369: add_script(struct razor_importer *importer, ali@369: uint32_t type_flags, Header h, ali@369: int32_t program_tag, int32_t body_tag) ali@369: { ali@369: union rpm_entry program, body; ali@369: int32_t type, count; ali@369: ali@369: headerGetEntry(h, program_tag, &type, &program.p, &count); ali@369: headerGetEntry(h, body_tag, &type, &body.p, &count); ali@369: ali@369: razor_importer_add_script(importer, type_flags, ali@369: program.string, body.string); ali@369: } ali@369: rhughes@241: struct razor_set * rhughes@241: razor_set_create_from_rpmdb(void) rhughes@241: { rhughes@241: struct razor_importer *importer; rhughes@241: rpmdbMatchIterator iter; rhughes@241: Header h; ali@356: int32_t type, count, i; rhughes@241: union rpm_entry name, epoch, version, release, arch; jbowes@258: union rpm_entry summary, description, url, license; rhughes@241: union rpm_entry basenames, dirnames, dirindexes; ali@372: union rpm_entry install_prefixes; rhughes@241: char filename[PATH_MAX], evr[128], buf[16]; rhughes@241: rpmdb db; jbowes@263: int imported_count = 0; rhughes@241: rhughes@241: rpmReadConfigFiles(NULL, NULL); rhughes@241: rhughes@241: if (rpmdbOpen("", &db, O_RDONLY, 0644) != 0) { rhughes@241: fprintf(stderr, "cannot open rpm database\n"); rhughes@241: exit(1); rhughes@241: } rhughes@241: krh@249: importer = razor_importer_create(); rhughes@241: rhughes@241: iter = rpmdbInitIterator(db, 0, NULL, 0); rhughes@241: while (h = rpmdbNextIterator(iter), h != NULL) { rhughes@241: headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count); rhughes@241: headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count); rhughes@241: headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count); rhughes@241: headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count); rhughes@241: headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count); jbowes@258: headerGetEntry(h, RPMTAG_SUMMARY, &type, &summary.p, &count); jbowes@258: headerGetEntry(h, RPMTAG_DESCRIPTION, &type, &description.p, jbowes@258: &count); jbowes@258: headerGetEntry(h, RPMTAG_URL, &type, &url.p, &count); jbowes@258: headerGetEntry(h, RPMTAG_LICENSE, &type, &license.p, &count); rhughes@241: rhughes@241: if (epoch.flags != NULL) { rhughes@241: snprintf(buf, sizeof buf, "%u", *epoch.flags); rhughes@241: razor_build_evr(evr, sizeof evr, rhughes@241: buf, version.string, release.string); rhughes@241: } else { rhughes@241: razor_build_evr(evr, sizeof evr, rhughes@241: NULL, version.string, release.string); rhughes@241: } rhughes@241: rhughes@241: razor_importer_begin_package(importer, rhughes@241: name.string, evr, arch.string); jbowes@258: razor_importer_add_details(importer, summary.string, jbowes@258: description.string, url.string, jbowes@258: license.string); rhughes@241: rhughes@241: add_properties(importer, RAZOR_PROPERTY_REQUIRES, h, rhughes@241: RPMTAG_REQUIRENAME, rhughes@241: RPMTAG_REQUIREVERSION, rhughes@241: RPMTAG_REQUIREFLAGS); rhughes@241: rhughes@241: add_properties(importer, RAZOR_PROPERTY_PROVIDES, h, rhughes@241: RPMTAG_PROVIDENAME, rhughes@241: RPMTAG_PROVIDEVERSION, rhughes@241: RPMTAG_PROVIDEFLAGS); rhughes@241: rhughes@241: add_properties(importer, RAZOR_PROPERTY_OBSOLETES, h, rhughes@241: RPMTAG_OBSOLETENAME, rhughes@241: RPMTAG_OBSOLETEVERSION, rhughes@241: RPMTAG_OBSOLETEFLAGS); rhughes@241: rhughes@241: add_properties(importer, RAZOR_PROPERTY_CONFLICTS, h, rhughes@241: RPMTAG_CONFLICTNAME, rhughes@241: RPMTAG_CONFLICTVERSION, rhughes@241: RPMTAG_CONFLICTFLAGS); rhughes@241: rhughes@241: headerGetEntry(h, RPMTAG_BASENAMES, &type, rhughes@241: &basenames.p, &count); rhughes@241: headerGetEntry(h, RPMTAG_DIRNAMES, &type, rhughes@241: &dirnames.p, &count); rhughes@241: headerGetEntry(h, RPMTAG_DIRINDEXES, &type, rhughes@241: &dirindexes.p, &count); rhughes@241: for (i = 0; i < count; i++) { rhughes@241: snprintf(filename, sizeof filename, "%s%s", rhughes@241: dirnames.list[dirindexes.flags[i]], rhughes@241: basenames.list[i]); rhughes@241: razor_importer_add_file(importer, filename); rhughes@241: } rhughes@241: ali@369: add_script(importer, RAZOR_PROPERTY_PREUN, h, ali@369: RPMTAG_PREUNPROG, RPMTAG_PREUN); ali@369: ali@369: add_script(importer, RAZOR_PROPERTY_POSTUN, h, ali@369: RPMTAG_POSTUNPROG, RPMTAG_POSTUN); ali@369: ali@372: headerGetEntry(h, RPMTAG_INSTPREFIXES, &type, ali@372: &install_prefixes.p, &count); ali@372: for (i = 0; i < count; i++) ali@372: razor_importer_add_install_prefix(importer, ali@372: install_prefixes.list[i]); ali@372: rhughes@241: razor_importer_finish_package(importer); jbowes@263: jbowes@263: printf("\rimporting %d", ++imported_count); jbowes@263: fflush(stdout); rhughes@241: } rhughes@241: rhughes@241: rpmdbClose(db); rhughes@241: jbowes@263: printf("\nsaving\n"); rhughes@241: return razor_importer_finish(importer); rhughes@241: }