src/import-rpmdb.c
author Richard Hughes <rhughes@redhat.com>
Mon Jun 16 17:54:29 2008 -0400 (2008-06-16)
changeset 242 f2218527ad4a
child 247 63444a10fb8e
permissions -rw-r--r--
Add spec file.

committer: Kristian H?gsberg <krh@redhat.com>
rhughes@241
     1
/*
rhughes@241
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
rhughes@241
     3
 * Copyright (C) 2008  Red Hat, Inc
rhughes@241
     4
 *
rhughes@241
     5
 * This program is free software; you can redistribute it and/or modify
rhughes@241
     6
 * it under the terms of the GNU General Public License as published by
rhughes@241
     7
 * the Free Software Foundation; either version 2 of the License, or
rhughes@241
     8
 * (at your option) any later version.
rhughes@241
     9
 *
rhughes@241
    10
 * This program is distributed in the hope that it will be useful,
rhughes@241
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rhughes@241
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
rhughes@241
    13
 * GNU General Public License for more details.
rhughes@241
    14
 *
rhughes@241
    15
 * You should have received a copy of the GNU General Public License along
rhughes@241
    16
 * with this program; if not, write to the Free Software Foundation, Inc.,
rhughes@241
    17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
rhughes@241
    18
 */
rhughes@241
    19
rhughes@241
    20
#include <stdio.h>
rhughes@241
    21
#include <stddef.h>
rhughes@241
    22
#include <string.h>
rhughes@241
    23
#include <fcntl.h>
rhughes@241
    24
#include <rpm/rpmlib.h>
rhughes@241
    25
#include <rpm/rpmdb.h>
rhughes@241
    26
rhughes@241
    27
#include "razor.h"
rhughes@241
    28
rhughes@241
    29
union rpm_entry {
rhughes@241
    30
	void *p;
rhughes@241
    31
	char *string;
rhughes@241
    32
	char **list;
rhughes@241
    33
	uint_32 *flags;
rhughes@241
    34
	uint_32 integer;
rhughes@241
    35
};
rhughes@241
    36
rhughes@241
    37
static enum razor_version_relation
rhughes@241
    38
rpm_to_razor_flags (uint_32 flags)
rhughes@241
    39
{
rhughes@241
    40
	switch (flags & (RPMSENSE_LESS | RPMSENSE_EQUAL | RPMSENSE_GREATER)) {
rhughes@241
    41
	case RPMSENSE_LESS:
rhughes@241
    42
		return RAZOR_VERSION_LESS;
rhughes@241
    43
	case RPMSENSE_LESS|RPMSENSE_EQUAL:
rhughes@241
    44
		return RAZOR_VERSION_LESS_OR_EQUAL;
rhughes@241
    45
	case RPMSENSE_EQUAL:
rhughes@241
    46
		return RAZOR_VERSION_EQUAL;
rhughes@241
    47
	case RPMSENSE_GREATER|RPMSENSE_EQUAL:
rhughes@241
    48
		return RAZOR_VERSION_GREATER_OR_EQUAL;
rhughes@241
    49
	case RPMSENSE_GREATER:
rhughes@241
    50
		return RAZOR_VERSION_GREATER;
rhughes@241
    51
	}
rhughes@241
    52
rhughes@241
    53
	/* FIXME? */
rhughes@241
    54
	return RAZOR_VERSION_EQUAL;
rhughes@241
    55
}
rhughes@241
    56
rhughes@241
    57
static void
rhughes@241
    58
add_properties(struct razor_importer *importer,
rhughes@241
    59
	       enum razor_property_type property_type,
rhughes@241
    60
	       Header h, int_32 name_tag, int_32 version_tag, int_32 flags_tag)
rhughes@241
    61
{
rhughes@241
    62
	union rpm_entry names, versions, flags;
rhughes@241
    63
	int_32 i, type, count;
rhughes@241
    64
rhughes@241
    65
	headerGetEntry(h, name_tag, &type, &names.p, &count);
rhughes@241
    66
	headerGetEntry(h, version_tag, &type, &versions.p, &count);
rhughes@241
    67
	headerGetEntry(h, flags_tag, &type, &flags.p, &count);
rhughes@241
    68
rhughes@241
    69
	for (i = 0; i < count; i++)
rhughes@241
    70
		razor_importer_add_property(importer,
rhughes@241
    71
					    names.list[i],
rhughes@241
    72
					    rpm_to_razor_flags (flags.flags[i]),
rhughes@241
    73
					    versions.list[i],
rhughes@241
    74
					    property_type);
rhughes@241
    75
}
rhughes@241
    76
rhughes@241
    77
struct razor_set *
rhughes@241
    78
razor_set_create_from_rpmdb(void)
rhughes@241
    79
{
rhughes@241
    80
	struct razor_importer *importer;
rhughes@241
    81
	rpmdbMatchIterator iter;
rhughes@241
    82
	Header h;
rhughes@241
    83
	int_32 type, count, i;
rhughes@241
    84
	union rpm_entry name, epoch, version, release, arch;
rhughes@241
    85
	union rpm_entry basenames, dirnames, dirindexes;
rhughes@241
    86
	char filename[PATH_MAX], evr[128], buf[16];
rhughes@241
    87
	rpmdb db;
rhughes@241
    88
rhughes@241
    89
	rpmReadConfigFiles(NULL, NULL);
rhughes@241
    90
rhughes@241
    91
	if (rpmdbOpen("", &db, O_RDONLY, 0644) != 0) {
rhughes@241
    92
		fprintf(stderr, "cannot open rpm database\n");
rhughes@241
    93
		exit(1);
rhughes@241
    94
	}
rhughes@241
    95
rhughes@241
    96
	importer = razor_importer_new();
rhughes@241
    97
rhughes@241
    98
	iter = rpmdbInitIterator(db, 0, NULL, 0);
rhughes@241
    99
	while (h = rpmdbNextIterator(iter), h != NULL) {
rhughes@241
   100
		headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count);
rhughes@241
   101
		headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count);
rhughes@241
   102
		headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
rhughes@241
   103
		headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
rhughes@241
   104
		headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count);
rhughes@241
   105
rhughes@241
   106
		if (epoch.flags != NULL) {
rhughes@241
   107
			snprintf(buf, sizeof buf, "%u", *epoch.flags);
rhughes@241
   108
			razor_build_evr(evr, sizeof evr,
rhughes@241
   109
					buf, version.string, release.string);
rhughes@241
   110
		} else {
rhughes@241
   111
			razor_build_evr(evr, sizeof evr,
rhughes@241
   112
					NULL, version.string, release.string);
rhughes@241
   113
		}
rhughes@241
   114
rhughes@241
   115
		razor_importer_begin_package(importer,
rhughes@241
   116
					     name.string, evr, arch.string);
rhughes@241
   117
rhughes@241
   118
		add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
rhughes@241
   119
			       RPMTAG_REQUIRENAME,
rhughes@241
   120
			       RPMTAG_REQUIREVERSION,
rhughes@241
   121
			       RPMTAG_REQUIREFLAGS);
rhughes@241
   122
rhughes@241
   123
		add_properties(importer, RAZOR_PROPERTY_PROVIDES, h,
rhughes@241
   124
			       RPMTAG_PROVIDENAME,
rhughes@241
   125
			       RPMTAG_PROVIDEVERSION,
rhughes@241
   126
			       RPMTAG_PROVIDEFLAGS);
rhughes@241
   127
rhughes@241
   128
		add_properties(importer, RAZOR_PROPERTY_OBSOLETES, h,
rhughes@241
   129
			       RPMTAG_OBSOLETENAME,
rhughes@241
   130
			       RPMTAG_OBSOLETEVERSION,
rhughes@241
   131
			       RPMTAG_OBSOLETEFLAGS);
rhughes@241
   132
rhughes@241
   133
		add_properties(importer, RAZOR_PROPERTY_CONFLICTS, h,
rhughes@241
   134
			       RPMTAG_CONFLICTNAME,
rhughes@241
   135
			       RPMTAG_CONFLICTVERSION,
rhughes@241
   136
			       RPMTAG_CONFLICTFLAGS);
rhughes@241
   137
rhughes@241
   138
		headerGetEntry(h, RPMTAG_BASENAMES, &type,
rhughes@241
   139
			       &basenames.p, &count);
rhughes@241
   140
		headerGetEntry(h, RPMTAG_DIRNAMES, &type,
rhughes@241
   141
			       &dirnames.p, &count);
rhughes@241
   142
		headerGetEntry(h, RPMTAG_DIRINDEXES, &type,
rhughes@241
   143
			       &dirindexes.p, &count);
rhughes@241
   144
		for (i = 0; i < count; i++) {
rhughes@241
   145
			snprintf(filename, sizeof filename, "%s%s",
rhughes@241
   146
				 dirnames.list[dirindexes.flags[i]],
rhughes@241
   147
				 basenames.list[i]);
rhughes@241
   148
			razor_importer_add_file(importer, filename);
rhughes@241
   149
		}
rhughes@241
   150
rhughes@241
   151
		razor_importer_finish_package(importer);
rhughes@241
   152
	}
rhughes@241
   153
rhughes@241
   154
	rpmdbClose(db);
rhughes@241
   155
rhughes@241
   156
	return razor_importer_finish(importer);
rhughes@241
   157
}