src/import-rpmdb.c
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Jun 07 18:36:20 2018 +0100 (2018-06-07)
changeset 499 c89e5edb8eae
parent 475 008c75a5e08d
permissions -rw-r--r--
Improve error on failure to lock database
rhughes@241
     1
/*
rhughes@241
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
rhughes@241
     3
 * Copyright (C) 2008  Red Hat, Inc
ali@369
     4
 * Copyright (C) 2009  J. Ali Harlow <ali@juiblex.co.uk>
rhughes@241
     5
 *
rhughes@241
     6
 * This program is free software; you can redistribute it and/or modify
rhughes@241
     7
 * it under the terms of the GNU General Public License as published by
rhughes@241
     8
 * the Free Software Foundation; either version 2 of the License, or
rhughes@241
     9
 * (at your option) any later version.
rhughes@241
    10
 *
rhughes@241
    11
 * This program is distributed in the hope that it will be useful,
rhughes@241
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rhughes@241
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
rhughes@241
    14
 * GNU General Public License for more details.
rhughes@241
    15
 *
rhughes@241
    16
 * You should have received a copy of the GNU General Public License along
rhughes@241
    17
 * with this program; if not, write to the Free Software Foundation, Inc.,
rhughes@241
    18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
rhughes@241
    19
 */
rhughes@241
    20
ali@438
    21
#include "config.h"
rhughes@241
    22
#include <stdio.h>
rhughes@241
    23
#include <stddef.h>
rhughes@241
    24
#include <string.h>
rhughes@241
    25
#include <fcntl.h>
ali@325
    26
#include <limits.h>
ali@475
    27
/*
ali@475
    28
 * Enable rpm 4.4 compatibility mode, see http://rpm.org/wiki/Releases/4.6.0
ali@475
    29
 */
ali@475
    30
#define _RPM_4_4_COMPAT
rhughes@241
    31
#include <rpm/rpmlib.h>
rhughes@241
    32
#include <rpm/rpmdb.h>
rhughes@241
    33
rhughes@241
    34
#include "razor.h"
ali@476
    35
#include "import.h"
rhughes@241
    36
rhughes@241
    37
union rpm_entry {
rhughes@241
    38
	void *p;
rhughes@241
    39
	char *string;
rhughes@241
    40
	char **list;
ali@356
    41
	uint32_t *flags;
ali@356
    42
	uint32_t integer;
rhughes@241
    43
};
rhughes@241
    44
krh@247
    45
static uint32_t
krh@247
    46
rpm_to_razor_flags(uint32_t flags)
rhughes@241
    47
{
krh@247
    48
	uint32_t razor_flags;
rhughes@241
    49
krh@247
    50
	razor_flags = 0;
krh@247
    51
	if (flags & RPMSENSE_LESS)
krh@247
    52
		razor_flags |= RAZOR_PROPERTY_LESS;
krh@247
    53
	if (flags & RPMSENSE_EQUAL)
krh@247
    54
		razor_flags |= RAZOR_PROPERTY_EQUAL;
krh@247
    55
	if (flags & RPMSENSE_GREATER)
krh@247
    56
		razor_flags |= RAZOR_PROPERTY_GREATER;
krh@247
    57
krh@247
    58
	if (flags & RPMSENSE_SCRIPT_PRE)
krh@247
    59
		razor_flags |= RAZOR_PROPERTY_PRE;
krh@247
    60
	if (flags & RPMSENSE_SCRIPT_POST)
krh@247
    61
		razor_flags |= RAZOR_PROPERTY_POST;
krh@247
    62
	if (flags & RPMSENSE_SCRIPT_PREUN)
krh@247
    63
		razor_flags |= RAZOR_PROPERTY_PREUN;
krh@247
    64
	if (flags & RPMSENSE_SCRIPT_POSTUN)
krh@247
    65
		razor_flags |= RAZOR_PROPERTY_POSTUN;
krh@247
    66
krh@247
    67
	return razor_flags;
rhughes@241
    68
}
rhughes@241
    69
rhughes@241
    70
static void
rhughes@241
    71
add_properties(struct razor_importer *importer,
ali@356
    72
	       uint32_t type_flags, Header h,
ali@356
    73
	       int32_t name_tag, int32_t version_tag, int32_t flags_tag)
rhughes@241
    74
{
rhughes@241
    75
	union rpm_entry names, versions, flags;
ali@356
    76
	int32_t i, type, count;
rhughes@241
    77
rhughes@241
    78
	headerGetEntry(h, name_tag, &type, &names.p, &count);
rhughes@241
    79
	headerGetEntry(h, version_tag, &type, &versions.p, &count);
rhughes@241
    80
	headerGetEntry(h, flags_tag, &type, &flags.p, &count);
rhughes@241
    81
rhughes@241
    82
	for (i = 0; i < count; i++)
rhughes@241
    83
		razor_importer_add_property(importer,
rhughes@241
    84
					    names.list[i],
krh@247
    85
					    rpm_to_razor_flags (flags.flags[i]) | type_flags,
krh@247
    86
					    versions.list[i]);
rhughes@241
    87
}
rhughes@241
    88
ali@369
    89
static void
ali@369
    90
add_script(struct razor_importer *importer,
ali@369
    91
	   uint32_t type_flags, Header h,
ali@369
    92
	   int32_t program_tag, int32_t body_tag)
ali@369
    93
{
ali@369
    94
	union rpm_entry program, body;
ali@369
    95
	int32_t type, count;
ali@369
    96
ali@369
    97
	headerGetEntry(h, program_tag, &type, &program.p, &count);
ali@369
    98
	headerGetEntry(h, body_tag, &type, &body.p, &count);
ali@369
    99
ali@369
   100
	razor_importer_add_script(importer, type_flags,
ali@369
   101
				  program.string, body.string);
ali@369
   102
}
ali@369
   103
rhughes@241
   104
struct razor_set *
rhughes@241
   105
razor_set_create_from_rpmdb(void)
rhughes@241
   106
{
rhughes@241
   107
	struct razor_importer *importer;
rhughes@241
   108
	rpmdbMatchIterator iter;
rhughes@241
   109
	Header h;
ali@356
   110
	int32_t type, count, i;
rhughes@241
   111
	union rpm_entry name, epoch, version, release, arch;
jbowes@258
   112
	union rpm_entry summary, description, url, license;
rhughes@241
   113
	union rpm_entry basenames, dirnames, dirindexes;
ali@372
   114
	union rpm_entry install_prefixes;
rhughes@241
   115
	char filename[PATH_MAX], evr[128], buf[16];
rhughes@241
   116
	rpmdb db;
jbowes@263
   117
	int imported_count = 0;
rhughes@241
   118
rhughes@241
   119
	rpmReadConfigFiles(NULL, NULL);
rhughes@241
   120
rhughes@241
   121
	if (rpmdbOpen("", &db, O_RDONLY, 0644) != 0) {
rhughes@241
   122
		fprintf(stderr, "cannot open rpm database\n");
rhughes@241
   123
		exit(1);
rhughes@241
   124
	}
rhughes@241
   125
krh@249
   126
	importer = razor_importer_create();
rhughes@241
   127
rhughes@241
   128
	iter = rpmdbInitIterator(db, 0, NULL, 0);
rhughes@241
   129
	while (h = rpmdbNextIterator(iter), h != NULL) {
rhughes@241
   130
		headerGetEntry(h, RPMTAG_NAME, &type, &name.p, &count);
rhughes@241
   131
		headerGetEntry(h, RPMTAG_EPOCH, &type, &epoch.p, &count);
rhughes@241
   132
		headerGetEntry(h, RPMTAG_VERSION, &type, &version.p, &count);
rhughes@241
   133
		headerGetEntry(h, RPMTAG_RELEASE, &type, &release.p, &count);
rhughes@241
   134
		headerGetEntry(h, RPMTAG_ARCH, &type, &arch.p, &count);
jbowes@258
   135
		headerGetEntry(h, RPMTAG_SUMMARY, &type, &summary.p, &count);
jbowes@258
   136
		headerGetEntry(h, RPMTAG_DESCRIPTION, &type, &description.p,
jbowes@258
   137
			       &count);
jbowes@258
   138
		headerGetEntry(h, RPMTAG_URL, &type, &url.p, &count);
jbowes@258
   139
		headerGetEntry(h, RPMTAG_LICENSE, &type, &license.p, &count);
rhughes@241
   140
rhughes@241
   141
		if (epoch.flags != NULL) {
rhughes@241
   142
			snprintf(buf, sizeof buf, "%u", *epoch.flags);
rhughes@241
   143
			razor_build_evr(evr, sizeof evr,
rhughes@241
   144
					buf, version.string, release.string);
rhughes@241
   145
		} else {
rhughes@241
   146
			razor_build_evr(evr, sizeof evr,
rhughes@241
   147
					NULL, version.string, release.string);
rhughes@241
   148
		}
rhughes@241
   149
rhughes@241
   150
		razor_importer_begin_package(importer,
rhughes@241
   151
					     name.string, evr, arch.string);
jbowes@258
   152
		razor_importer_add_details(importer, summary.string,
jbowes@258
   153
					   description.string, url.string,
jbowes@258
   154
					   license.string);
rhughes@241
   155
rhughes@241
   156
		add_properties(importer, RAZOR_PROPERTY_REQUIRES, h,
rhughes@241
   157
			       RPMTAG_REQUIRENAME,
rhughes@241
   158
			       RPMTAG_REQUIREVERSION,
rhughes@241
   159
			       RPMTAG_REQUIREFLAGS);
rhughes@241
   160
rhughes@241
   161
		add_properties(importer, RAZOR_PROPERTY_PROVIDES, h,
rhughes@241
   162
			       RPMTAG_PROVIDENAME,
rhughes@241
   163
			       RPMTAG_PROVIDEVERSION,
rhughes@241
   164
			       RPMTAG_PROVIDEFLAGS);
rhughes@241
   165
rhughes@241
   166
		add_properties(importer, RAZOR_PROPERTY_OBSOLETES, h,
rhughes@241
   167
			       RPMTAG_OBSOLETENAME,
rhughes@241
   168
			       RPMTAG_OBSOLETEVERSION,
rhughes@241
   169
			       RPMTAG_OBSOLETEFLAGS);
rhughes@241
   170
rhughes@241
   171
		add_properties(importer, RAZOR_PROPERTY_CONFLICTS, h,
rhughes@241
   172
			       RPMTAG_CONFLICTNAME,
rhughes@241
   173
			       RPMTAG_CONFLICTVERSION,
rhughes@241
   174
			       RPMTAG_CONFLICTFLAGS);
rhughes@241
   175
rhughes@241
   176
		headerGetEntry(h, RPMTAG_BASENAMES, &type,
rhughes@241
   177
			       &basenames.p, &count);
rhughes@241
   178
		headerGetEntry(h, RPMTAG_DIRNAMES, &type,
rhughes@241
   179
			       &dirnames.p, &count);
rhughes@241
   180
		headerGetEntry(h, RPMTAG_DIRINDEXES, &type,
rhughes@241
   181
			       &dirindexes.p, &count);
rhughes@241
   182
		for (i = 0; i < count; i++) {
rhughes@241
   183
			snprintf(filename, sizeof filename, "%s%s",
rhughes@241
   184
				 dirnames.list[dirindexes.flags[i]],
rhughes@241
   185
				 basenames.list[i]);
rhughes@241
   186
			razor_importer_add_file(importer, filename);
rhughes@241
   187
		}
rhughes@241
   188
ali@369
   189
		add_script(importer, RAZOR_PROPERTY_PREUN, h,
ali@369
   190
			   RPMTAG_PREUNPROG, RPMTAG_PREUN);
ali@369
   191
ali@369
   192
		add_script(importer, RAZOR_PROPERTY_POSTUN, h,
ali@369
   193
			   RPMTAG_POSTUNPROG, RPMTAG_POSTUN);
ali@369
   194
ali@372
   195
		headerGetEntry(h, RPMTAG_INSTPREFIXES, &type,
ali@372
   196
			       &install_prefixes.p, &count);
ali@372
   197
		for (i = 0; i < count; i++)
ali@372
   198
			razor_importer_add_install_prefix(importer,
ali@372
   199
							  install_prefixes.list[i]);
ali@372
   200
rhughes@241
   201
		razor_importer_finish_package(importer);
jbowes@263
   202
jbowes@263
   203
		printf("\rimporting %d", ++imported_count);
jbowes@263
   204
		fflush(stdout);
rhughes@241
   205
	}
rhughes@241
   206
rhughes@241
   207
	rpmdbClose(db);
rhughes@241
   208
jbowes@263
   209
	printf("\nsaving\n");
rhughes@241
   210
	return razor_importer_finish(importer);
rhughes@241
   211
}