25
27
#include <rpm/rpmds.h> /* XXX isInstallPreReq macro only */
26
28
#include <rpm/rpmlog.h>
27
29
#include <rpm/rpmdb.h>
30
#include <rpm/rpmts.h>
28
31
#include <rpm/argv.h>
33
#include "lib/rpmchroot.h"
30
34
#include "lib/rpmdb_internal.h"
31
35
#include "lib/fprint.h"
32
36
#include "lib/header_internal.h" /* XXX for headerSetInstance() */
37
static int _rebuildinprogress = 0;
40
#define _DBI_PERMS 0644
49
/* XXX should dbitags be per-db instead? */
50
static struct dbiTags_s dbiTags = { NULL, 0, 0 };
52
/* Bit mask macros. */
53
typedef unsigned int __pbm_bits;
54
#define __PBM_NBITS (8 * sizeof (__pbm_bits))
55
#define __PBM_IX(d) ((d) / __PBM_NBITS)
56
#define __PBM_MASK(d) ((__pbm_bits) 1 << (((unsigned)(d)) % __PBM_NBITS))
60
#define __PBM_BITS(set) ((set)->bits)
62
#define PBM_FREE(s) _free(s);
63
#define PBM_SET(d, s) (__PBM_BITS (s)[__PBM_IX (d)] |= __PBM_MASK (d))
64
#define PBM_CLR(d, s) (__PBM_BITS (s)[__PBM_IX (d)] &= ~__PBM_MASK (d))
65
#define PBM_ISSET(d, s) ((__PBM_BITS (s)[__PBM_IX (d)] & __PBM_MASK (d)) != 0)
67
#define PBM_ALLOC(d) xcalloc(__PBM_IX (d) + 1, sizeof(__pbm_bits))
70
* Reallocate a bit map.
71
* @retval sp address of bit map pointer
72
* @retval odp no. of bits in map
73
* @param nd desired no. of bits
75
static inline pbm_set * PBM_REALLOC(pbm_set ** sp, int * odp, int nd)
81
nb = __PBM_IX(nd) + 1;
82
*sp = xrealloc(*sp, nb * sizeof(__pbm_bits));
83
for (i = __PBM_IX(*odp) + 1; i < nb; i++)
84
__PBM_BITS(*sp)[i] = 0;
91
* Return dbi index used for rpm tag.
92
* @param rpmtag rpm header tag
93
* @return dbi index, -1 on error
95
static int dbiTagToDbix(rpmTag rpmtag)
99
if (dbiTags.tags != NULL)
100
for (dbix = 0; dbix < dbiTags.max; dbix++) {
101
if (rpmtag == dbiTags.tags[dbix])
108
* Initialize database (index, tag) tuple from configuration.
110
static void dbiTagsInit(void)
112
static const char * const _dbiTagStr_default =
113
"Packages:Name:Basenames:Group:Requirename:Providename:Conflictname:ObsoleteName:Triggername:Dirnames:Requireversion:Provideversion:Installtid:Sigmd5:Sha1header:Filedigests:Depends:Pubkeys";
114
char * dbiTagStr = NULL;
119
if (dbiTags.tags != NULL && dbiTags.max > 0) {
123
dbiTagStr = rpmExpand("%{?_dbi_tags}", NULL);
124
if (!(dbiTagStr && *dbiTagStr)) {
125
dbiTagStr = _free(dbiTagStr);
126
dbiTagStr = xstrdup(_dbiTagStr_default);
129
/* Discard previous values. */
130
dbiTags.tags = _free(dbiTags.tags);
133
/* Always allocate package index */
134
dbiTags.tags = xcalloc(1, sizeof(*dbiTags.tags));
135
dbiTags.tags[dbiTags.max++] = RPMDBI_PACKAGES;
137
for (o = dbiTagStr; o && *o; o = oe) {
138
while (*o && risspace(*o))
142
for (oe = o; oe && *oe; oe++) {
145
if (oe[0] == ':' && !(oe[1] == '/' && oe[2] == '/'))
150
rpmtag = rpmTagGetValue(o);
151
if (rpmtag == RPMTAG_NOT_FOUND) {
152
rpmlog(RPMLOG_WARNING,
153
_("dbiTagsInit: unrecognized tag name: \"%s\" ignored\n"), o);
156
if (dbiTagToDbix(rpmtag) >= 0)
159
dbiTags.tags = xrealloc(dbiTags.tags, (dbiTags.max + 1) * sizeof(*dbiTags.tags)); /* XXX memory leak */
160
dbiTags.tags[dbiTags.max++] = rpmtag;
163
dbiTagStr = _free(dbiTagStr);
166
static void dbiTagsFree(void)
168
if (--dbiTags.nlink > 0) {
171
dbiTags.tags = _free(dbiTags.tags);
179
extern struct _dbiVec db3vec;
180
#define DB3vec &db3vec
185
#ifdef HAVE_SQLITE3_H
186
extern struct _dbiVec sqlitevec;
187
#define SQLITEvec &sqlitevec
189
#define SQLITEvec NULL
192
static struct _dbiVec * const mydbvecs[] = {
193
DB1vec, DB1vec, DB2vec, DB3vec, SQLITEvec, NULL
196
dbiIndex dbiOpen(rpmdb db, rpmTag rpmtag, unsigned int flags)
39
static rpmDbiTag const dbiTags[] = {
55
#define dbiTagsMax (sizeof(dbiTags) / sizeof(rpmDbiTag))
57
/* A single item from an index database (i.e. the "data returned"). */
59
unsigned int hdrNum; /*!< header instance in db */
60
unsigned int tagNum; /*!< tag index in header */
63
/* Items retrieved from the index database.*/
64
typedef struct _dbiIndexSet {
65
struct dbiIndexItem * recs; /*!< array of records */
66
unsigned int count; /*!< number of records */
67
size_t alloced; /*!< alloced size */
70
static int addToIndex(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h);
71
static unsigned int pkgInstance(dbiIndex dbi, int alloc);
72
static rpmdb rpmdbUnlink(rpmdb db);
74
static int buildIndexes(rpmdb db)
78
rpmdbMatchIterator mi;
80
rc += rpmdbOpenAll(db);
82
/* If the main db was just created, this is expected - dont whine */
83
if (!(dbiFlags(db->_dbi[0]) & DBI_CREATED)) {
84
rpmlog(RPMLOG_WARNING,
85
_("Generating %d missing index(es), please wait...\n"),
89
/* Don't call us again */
90
db->db_buildindex = 0;
92
dbSetFSync(db->db_dbenv, 0);
94
mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, NULL, 0);
95
while ((h = rpmdbNextIterator(mi))) {
96
unsigned int hdrNum = headerGetInstance(h);
97
/* Build all secondary indexes which were created on open */
98
for (int dbix = 1; dbix < dbiTagsMax; dbix++) {
99
dbiIndex dbi = db->_dbi[dbix];
100
if (dbi && (dbiFlags(dbi) & DBI_CREATED)) {
101
rc += addToIndex(dbi, dbiTags[dbix], hdrNum, h);
105
rpmdbFreeIterator(mi);
106
dbSetFSync(db->db_dbenv, !db->cfg.db_no_fsync);
110
static int uintCmp(unsigned int a, unsigned int b)
115
static unsigned int uintId(unsigned int a)
121
* Return handle for an index database.
122
* @param db rpm database
123
* @param rpmtag rpm tag
125
* @return index database handle
127
static dbiIndex rpmdbOpenIndex(rpmdb db, rpmDbiTagVal rpmtag, int flags)
199
130
dbiIndex dbi = NULL;
200
int _dbapi, _dbapi_rebuild, _dbapi_wanted;
206
dbix = dbiTagToDbix(rpmtag);
207
if (dbix < 0 || dbix >= dbiTags.max)
136
for (dbix = 0; dbix < dbiTagsMax; dbix++) {
137
if (rpmtag == dbiTags[dbix])
140
if (dbix >= dbiTagsMax)
210
143
/* Is this index already open ? */
211
/* FIX: db->_dbi may be NULL */
212
144
if ((dbi = db->_dbi[dbix]) != NULL)
215
/* Try to ensure db home exists, error out if we cant even create */
216
if (!db->db_mkdirDone) {
217
const char *dbhome = rpmdbHome(db);
218
db->db_mkdirDone = (rpmioMkpath(dbhome, 0755, getuid(), getgid()) == 0);
219
if (!db->db_mkdirDone) return NULL;
222
_dbapi_rebuild = rpmExpandNumeric("%{_dbapi_rebuild}");
223
if (_dbapi_rebuild < 1 || _dbapi_rebuild > 4)
225
/* _dbapi_wanted = (_rebuildinprogress ? -1 : db->db_api); */
226
_dbapi_wanted = (_rebuildinprogress ? _dbapi_rebuild : db->db_api);
228
switch (_dbapi_wanted) {
230
_dbapi = _dbapi_wanted;
231
if (_dbapi < 0 || _dbapi >= 5 || mydbvecs[_dbapi] == NULL) {
232
rpmlog(RPMLOG_ERR, _("dbiOpen: dbapi %d not available\n"), _dbapi);
237
rc = (*mydbvecs[_dbapi]->open) (db, rpmtag, &dbi);
239
static int _printed[32];
240
if (!_printed[dbix & 0x1f]++)
242
_("cannot open %s index using db%d - %s (%d)\n"),
243
rpmTagGetName(rpmtag), _dbapi,
244
(rc > 0 ? strerror(rc) : ""), rc);
250
while (_dbapi-- > 1) {
251
if (mydbvecs[_dbapi] == NULL)
255
rc = (*mydbvecs[_dbapi]->open) (db, rpmtag, &dbi);
260
static int _printed[32];
261
if (!_printed[dbix & 0x1f]++)
262
rpmlog(RPMLOG_ERR, _("cannot open %s index\n"),
263
rpmTagGetName(rpmtag));
267
if (db->db_api == -1 && _dbapi > 0)
272
/* We don't ever _REQUIRE_ conversion... */
274
#ifdef SQLITE_HACK_XXX
275
/* Require conversion. */
276
if (rc && _dbapi_wanted >= 0 && _dbapi != _dbapi_wanted && _dbapi_wanted == _dbapi_rebuild) {
277
rc = (_rebuildinprogress ? 0 : 1);
281
/* Suggest possible configuration */
282
if (_dbapi_wanted >= 0 && _dbapi != _dbapi_wanted) {
287
/* Suggest possible configuration */
288
if (_dbapi_wanted < 0 && _dbapi != _dbapi_rebuild) {
289
rc = (_rebuildinprogress ? 0 : 1);
295
if (dbi != NULL && rc == 0) {
149
rc = dbiOpen(db, rpmtag, &dbi, flags);
152
static int _printed[32];
153
if (!_printed[dbix & 0x1f]++)
154
rpmlog(RPMLOG_ERR, _("cannot open %s index using db%d - %s (%d)\n"),
155
rpmTagGetName(rpmtag), db->db_ver,
156
(rc > 0 ? strerror(rc) : ""), rc);
296
158
db->_dbi[dbix] = dbi;
297
if (rpmtag == RPMDBI_PACKAGES && db->db_bits == NULL) {
299
if (!dbiStat(dbi, DB_FAST_STAT)) {
300
DB_HASH_STAT * hash = (DB_HASH_STAT *)dbi->dbi_stats;
302
db->db_nbits += hash->hash_nkeys;
304
db->db_bits = PBM_ALLOC(db->db_nbits);
159
int verifyonly = (flags & RPMDB_FLAG_VERIFYONLY);
160
int rebuild = (db->db_flags & RPMDB_FLAG_REBUILD);
161
if (dbiType(dbi) == DBI_PRIMARY) {
162
/* Allocate based on max header instance number + some reserve */
163
if (!verifyonly && (db->db_checked == NULL)) {
164
db->db_checked = intHashCreate(1024 + pkgInstance(dbi, 0) / 4,
165
uintId, uintCmp, NULL);
167
/* If primary got created, we can safely run without fsync */
168
if ((dbiFlags(dbi) & DBI_CREATED) || db->cfg.db_no_fsync) {
169
rpmlog(RPMLOG_DEBUG, "disabling fsync on database\n");
170
db->cfg.db_no_fsync = 1;
171
dbSetFSync(db->db_dbenv, 0);
173
} else { /* secondary index */
174
if (!rebuild && !verifyonly && (dbiFlags(dbi) & DBI_CREATED)) {
175
rpmlog(RPMLOG_DEBUG, "index %s needs creating\n", dbiName(dbi));
177
if (db->db_buildindex == 1) {
312
/* FIX: db->_dbi may be NULL */
316
/* Retrieve (key,data) pair from index database. */
317
int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
321
assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
322
(void) rpmswEnter(&dbi->dbi_rpmdb->db_getops, 0);
323
rc = (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
324
(void) rpmswExit(&dbi->dbi_rpmdb->db_getops, data->size);
328
/* Store (key,data) pair in index database. */
329
int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
333
assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
334
(void) rpmswEnter(&dbi->dbi_rpmdb->db_putops, (ssize_t) 0);
335
rc = (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
336
(void) rpmswExit(&dbi->dbi_rpmdb->db_putops, (ssize_t) data->size);
341
* Create and initialize item for index database set.
342
* @param hdrNum header instance in db
343
* @param tagNum tag index in header
346
static dbiIndexItem dbiIndexNewItem(unsigned int hdrNum, unsigned int tagNum)
348
dbiIndexItem rec = xcalloc(1, sizeof(*rec));
349
rec->hdrNum = hdrNum;
350
rec->tagNum = tagNum;
356
189
unsigned char uc[4];
773
585
const char *dbdir = NULL;
775
dbdir = db->db_chrootDone ? db->db_home : db->db_fullpath;
587
dbdir = rpmChrootDone() ? db->db_home : db->db_fullpath;
780
int rpmdbSetChrootDone(rpmdb db, int chrootDone)
784
ochrootDone = db->db_chrootDone;
785
db->db_chrootDone = chrootDone;
790
592
int rpmdbOpenAll(rpmdb db)
795
596
if (db == NULL) return -2;
797
if (dbiTags.tags != NULL)
798
for (dbix = 0; dbix < dbiTags.max; dbix++) {
799
if (db->_dbi[dbix] != NULL)
801
/* Filter out temporary databases */
802
if (isTemporaryDB(dbiTags.tags[dbix]))
804
(void) dbiOpen(db, dbiTags.tags[dbix], db->db_flags);
598
for (int dbix = 0; dbix < dbiTagsMax; dbix++) {
599
dbiIndex dbi = db->_dbi[dbix];
601
rc += (rpmdbOpenIndex(db, dbiTags[dbix], db->db_flags) == NULL);
809
int rpmdbCloseDBI(rpmdb db, rpmTag rpmtag)
607
static int dbiForeach(dbiIndex *dbis,
608
int (*func) (dbiIndex, unsigned int), int del)
814
if (db == NULL || db->_dbi == NULL || dbiTags.tags == NULL)
817
for (dbix = 0; dbix < dbiTags.max; dbix++) {
818
if (dbiTags.tags[dbix] != rpmtag)
611
for (int dbix = dbiTagsMax; --dbix >= 0; ) {
612
if (dbis[dbix] == NULL)
820
if (db->_dbi[dbix] != NULL) {
822
/* FIX: double indirection. */
823
xx = dbiClose(db->_dbi[dbix], 0);
824
if (xx && rc == 0) rc = xx;
825
db->_dbi[dbix] = NULL;
614
xx = func(dbis[dbix], 0);
615
if (xx && rc == 0) rc = xx;
832
/* XXX query.c, rpminstall.c, verify.c */
833
622
int rpmdbClose(rpmdb db)
835
624
rpmdb * prev, next;
842
(void) rpmdbUnlink(db, RPMDBG_M("rpmdbClose"));
630
(void) rpmdbUnlink(db);
844
632
if (db->nrefs > 0)
848
for (dbix = db->db_ndbi; --dbix >= 0; ) {
850
if (db->_dbi[dbix] == NULL)
852
xx = dbiClose(db->_dbi[dbix], 0);
853
if (xx && rc == 0) rc = xx;
854
db->_dbi[dbix] = NULL;
856
db->db_errpfx = _free(db->db_errpfx);
635
/* Always re-enable fsync on close of rw-database */
636
if ((db->db_mode & O_ACCMODE) != O_RDONLY)
637
dbSetFSync(db->db_dbenv, 1);
639
rc = dbiForeach(db->_dbi, dbiClose, 1);
857
641
db->db_root = _free(db->db_root);
858
642
db->db_home = _free(db->db_home);
859
643
db->db_fullpath = _free(db->db_fullpath);
860
db->db_bits = PBM_FREE(db->db_bits);
644
db->db_checked = intHashFree(db->db_checked);
861
645
db->_dbi = _free(db->_dbi);
863
647
prev = &rpmdbRock;
884
666
int rpmdbSync(rpmdb db)
889
668
if (db == NULL) return 0;
890
for (dbix = 0; dbix < db->db_ndbi; dbix++) {
892
if (db->_dbi[dbix] == NULL)
894
if (db->_dbi[dbix]->dbi_no_dbsync)
896
xx = dbiSync(db->_dbi[dbix], 0);
897
if (xx && rc == 0) rc = xx;
670
return dbiForeach(db->_dbi, dbiSync, 0);
902
/* FIX: dbTemplate structure assignment */
904
rpmdb newRpmdb(const char * root,
906
int mode, int perms, int flags)
673
static rpmdb newRpmdb(const char * root, const char * home,
674
int mode, int perms, int flags)
908
rpmdb db = xcalloc(sizeof(*db), 1);
909
const char * epfx = _DB_ERRPFX;
910
static int _initialized = 0;
677
char * db_home = rpmGetPath((home && *home) ? home : "%{_dbpath}", NULL);
679
if (!(db_home && db_home[0] != '%')) {
680
rpmlog(RPMLOG_ERR, _("no dbpath has been set\n"));
916
*db = dbTemplate; /* structure assignment */
685
db = xcalloc(sizeof(*db), 1);
920
687
if (!(perms & 0600)) perms = 0644; /* XXX sanity */
922
if (mode >= 0) db->db_mode = mode;
923
if (perms >= 0) db->db_perms = perms;
924
if (flags >= 0) db->db_flags = flags;
689
db->db_mode = (mode >= 0) ? mode : 0;
690
db->db_perms = (perms >= 0) ? perms : 0644;
691
db->db_flags = (flags >= 0) ? flags : 0;
926
db->db_home = rpmGetPath( (home && *home ? home : _DB_HOME), NULL);
927
if (!(db->db_home && db->db_home[0] != '%')) {
928
rpmlog(RPMLOG_ERR, _("no dbpath has been set\n"));
929
db->db_home = _free(db->db_home);
933
db->db_root = rpmGetPath((root && *root) ? root : _DB_ROOT, NULL);
693
db->db_home = db_home;
694
db->db_root = rpmGetPath((root && *root) ? root : "/", NULL);
934
695
db->db_fullpath = rpmGenPath(db->db_root, db->db_home, NULL);
935
db->db_errpfx = rpmExpand( (epfx && *epfx ? epfx : _DB_ERRPFX), NULL);
936
696
/* XXX remove environment after chrooted operations, for now... */
937
697
db->db_remove_env = (!rstreq(db->db_root, "/") ? 1 : 0);
938
db->db_ndbi = dbiTags.max;
939
db->db_malloc = rmalloc;
940
db->db_realloc = rrealloc;
941
db->db_free = NULL; /* XXX rfree() prototype differs from free() */
942
db->_dbi = xcalloc(db->db_ndbi, sizeof(*db->_dbi));
698
db->_dbi = xcalloc(dbiTagsMax, sizeof(*db->_dbi));
699
db->db_ver = DB_VERSION_MAJOR; /* XXX just to put something in messages */
944
return rpmdbLink(db, RPMDBG_M("rpmdbCreate"));
701
return rpmdbLink(db);
947
704
static int openDatabase(const char * prefix,
949
int _dbapi, rpmdb *dbp,
705
const char * dbpath, rpmdb *dbp,
950
706
int mode, int perms, int flags)
954
710
int justCheck = flags & RPMDB_FLAG_JUSTCHECK;
955
int minimal = flags & RPMDB_FLAG_MINIMAL;
959
/* Insure that _dbapi has one of -1, 1, 2, or 3 */
960
if (_dbapi < -1 || _dbapi > 4)
2265
1986
/* XXX HACK to remove rpmdbFindByLabel/findMatches from the API */
2266
1987
if (rpmtag == RPMDBI_LABEL) {
2267
rpmtag = RPMTAG_NAME;
1988
rpmtag = RPMDBI_NAME;
2271
dbi = dbiOpen(db, rpmtag, 0);
1992
dbi = rpmdbOpenIndex(db, rpmtag, 0);
2272
1993
if (dbi == NULL)
2275
/* Chain cursors for teardown on abnormal exit. */
2276
mi = xcalloc(1, sizeof(*mi));
2277
mi->mi_next = rpmmiRock;
2281
data = &mi->mi_data;
2284
1997
* Handle label and file name special cases.
2285
1998
* Otherwise, retrieve join keys for secondary lookup.
2287
if (rpmtag != RPMDBI_PACKAGES && keyp) {
2000
if (rpmtag != RPMDBI_PACKAGES) {
2288
2002
DBC * dbcursor = NULL;
2293
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, 0);
2294
rc = dbiFindByLabel(dbi, dbcursor, key, data, keyp, &set);
2295
xx = dbiCclose(dbi, dbcursor, 0);
2297
} else if (rpmtag == RPMTAG_BASENAMES) {
2298
rc = rpmdbFindByFile(db, keyp, key, data, &set);
2006
memset(&key, 0, sizeof(key));
2007
memset(&data, 0, sizeof(data));
2012
xx = dbiCopen(dbi, &dbcursor, 0);
2013
rc = dbiFindByLabel(db, dbi, dbcursor, &key, &data, keyp, &set);
2014
xx = dbiCclose(dbi, dbcursor, 0);
2016
} else if (rpmtag == RPMDBI_BASENAMES) {
2017
rc = rpmdbFindByFile(db, keyp, &key, &data, &set);
2019
xx = dbiCopen(dbi, &dbcursor, 0);
2021
key.data = (void *) keyp;
2023
if (key.data && key.size == 0)
2024
key.size = strlen((char *)key.data);
2025
if (key.data && key.size == 0)
2026
key.size++; /* XXX "/" fixup. */
2028
rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET);
2031
_("error(%d) getting \"%s\" records from %s index\n"),
2032
rc, (key.data ? (char *)key.data : "???"),
2036
/* Join keys need to be native endian internally. */
2038
(void) dbt2set(dbi, &data, &set);
2040
xx = dbiCclose(dbi, dbcursor, 0);
2043
if (rc) { /* error/not found */
2044
set = dbiFreeIndexSet(set);
2300
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, 0);
2302
key->data = (void *) keyp;
2304
if (key->data && key->size == 0)
2305
key->size = strlen((char *)key->data);
2306
if (key->data && key->size == 0)
2307
key->size++; /* XXX "/" fixup. */
2309
rc = dbiGet(dbi, dbcursor, key, data, DB_SET);
2312
_("error(%d) getting \"%s\" records from %s index\n"),
2313
rc, (key->data ? (char *)key->data : "???"),
2314
rpmTagGetName(dbi->dbi_rpmtag));
2317
/* Join keys need to be native endian internally. */
2319
(void) dbt2set(dbi, data, &set);
2321
xx = dbiCclose(dbi, dbcursor, 0);
2324
if (rc) { /* error/not found */
2325
set = dbiFreeIndexSet(set);
2326
rpmmiRock = mi->mi_next;
2048
/* get all entries from index */
2049
xx = dbiCopen(dbi, &dbcursor, 0);
2051
while ((rc = dbiGet(dbi, dbcursor, &key, &data, DB_NEXT)) == 0) {
2052
dbiIndexSet newset = NULL;
2054
(void) dbt2set(dbi, &data, &newset);
2058
dbiAppendSet(set, newset->recs, newset->count, sizeof(*(set->recs)), 0);
2059
dbiFreeIndexSet(newset);
2063
if (rc != DB_NOTFOUND) {
2065
_("error(%d) getting \"%s\" records from %s index\n"),
2066
rc, (key.data ? (char *)key.data : "???"), dbiName(dbi));
2069
xx = dbiCclose(dbi, dbcursor, 0);
2072
if (rc != DB_NOTFOUND) { /* error */
2073
set = dbiFreeIndexSet(set);
2333
2079
/* Copy the retrieval key, byte swapping header instance if necessary. */
2485
static void logAddRemove(int removing, rpmtd tagdata)
2169
* rpmdbIndexIterator
2172
rpmdbIndexIterator rpmdbIndexIteratorInit(rpmdb db, rpmDbiTag rpmtag)
2174
rpmdbIndexIterator ii;
2175
dbiIndex dbi = NULL;
2180
(void) rpmdbCheckSignals();
2182
dbi = rpmdbOpenIndex(db, rpmtag, 0);
2186
/* Chain cursors for teardown on abnormal exit. */
2187
ii = xcalloc(1, sizeof(*ii));
2188
ii->ii_next = rpmiiRock;
2191
ii->ii_db = rpmdbLink(db);
2192
ii->ii_rpmtag = rpmtag;
2199
int rpmdbIndexIteratorNext(rpmdbIndexIterator ii, const void ** key, size_t * keylen)
2207
if (ii->ii_dbc == NULL)
2208
xx = dbiCopen(ii->ii_dbi, &ii->ii_dbc, 0);
2211
ii->ii_set = dbiFreeIndexSet(ii->ii_set);
2213
memset(&data, 0, sizeof(data));
2214
rc = dbiGet(ii->ii_dbi, ii->ii_dbc, &ii->ii_key, &data, DB_NEXT);
2220
if (rc != DB_NOTFOUND) {
2222
_("error(%d:%s) getting next key from %s index\n"),
2223
rc, db_strerror(rc), rpmTagGetName(ii->ii_rpmtag));
2228
(void) dbt2set(ii->ii_dbi, &data, &ii->ii_set);
2229
*key = ii->ii_key.data;
2230
*keylen = ii->ii_key.size;
2235
unsigned int rpmdbIndexIteratorNumPkgs(rpmdbIndexIterator ii)
2237
return (ii && ii->ii_set) ? dbiIndexSetCount(ii->ii_set) : 0;
2240
unsigned int rpmdbIndexIteratorPkgOffset(rpmdbIndexIterator ii, unsigned int nr)
2242
if (!ii || !ii->ii_set)
2244
if (dbiIndexSetCount(ii->ii_set) <= nr)
2246
return dbiIndexRecordOffset(ii->ii_set, nr);
2249
unsigned int rpmdbIndexIteratorTagNum(rpmdbIndexIterator ii, unsigned int nr)
2251
if (!ii || !ii->ii_set)
2253
if (dbiIndexSetCount(ii->ii_set) <= nr)
2255
return dbiIndexRecordFileNumber(ii->ii_set, nr);
2258
rpmdbIndexIterator rpmdbIndexIteratorFree(rpmdbIndexIterator ii)
2260
rpmdbIndexIterator * prev, next;
2267
while ((next = *prev) != NULL && next != ii)
2268
prev = &next->ii_next;
2270
*prev = next->ii_next;
2271
next->ii_next = NULL;
2275
xx = dbiCclose(ii->ii_dbi, ii->ii_dbc, 0);
2278
ii->ii_db = rpmdbUnlink(ii->ii_db);
2279
ii->ii_set = dbiFreeIndexSet(ii->ii_set);
2288
static void logAddRemove(const char *dbiname, int removing, rpmtd tagdata)
2487
2290
rpm_count_t c = rpmtdCount(tagdata);
2488
2291
if (c == 1 && rpmtdType(tagdata) == RPM_STRING_TYPE) {
2489
2292
rpmlog(RPMLOG_DEBUG, "%s \"%s\" %s %s index.\n",
2490
2293
removing ? "removing" : "adding", rpmtdGetString(tagdata),
2491
removing ? "from" : "to",
2492
rpmTagGetName(rpmtdTag(tagdata)));
2294
removing ? "from" : "to", dbiname);
2493
2295
} else if (c > 0) {
2494
2296
rpmlog(RPMLOG_DEBUG, "%s %d entries %s %s index.\n",
2495
2297
removing ? "removing" : "adding", c,
2496
removing ? "from" : "to",
2497
rpmTagGetName(rpmtdTag(tagdata)));
2298
removing ? "from" : "to", dbiname);
2502
int rpmdbRemove(rpmdb db, int rid, unsigned int hdrNum,
2504
rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg))
2302
/* Update primary Packages index. NULL hdr means remove */
2303
static int updatePackages(dbiIndex dbi, unsigned int hdrNum, DBT *hdr)
2305
union _dbswap mi_offset;
2506
2308
DBC * dbcursor = NULL;
2509
union _dbswap mi_offset;
2311
if (dbi == NULL || hdrNum == 0)
2314
memset(&key, 0, sizeof(key));
2316
xx = dbiCopen(dbi, &dbcursor, DB_WRITECURSOR);
2318
mi_offset.ui = hdrNum;
2319
if (dbiByteSwapped(dbi) == 1)
2321
key.data = (void *) &mi_offset;
2322
key.size = sizeof(mi_offset.ui);
2325
rc = dbiPut(dbi, dbcursor, &key, hdr, DB_KEYLAST);
2328
_("error(%d) adding header #%d record\n"), rc, hdrNum);
2333
memset(&data, 0, sizeof(data));
2334
rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET);
2337
_("error(%d) removing header #%d record\n"), rc, hdrNum);
2339
rc = dbiDel(dbi, dbcursor, &key, &data, 0);
2342
xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
2343
xx = dbiSync(dbi, 0);
2348
int rpmdbRemove(rpmdb db, unsigned int hdrNum)
2511
2352
sigset_t signalMask;
2515
2355
if (db == NULL)
2518
memset(&key, 0, sizeof(key));
2519
memset(&data, 0, sizeof(data));
2521
{ rpmdbMatchIterator mi;
2522
mi = rpmdbInitIterator(db, RPMDBI_PACKAGES, &hdrNum, sizeof(hdrNum));
2523
h = rpmdbNextIterator(mi);
2526
mi = rpmdbFreeIterator(mi);
2358
h = rpmdbGetHeaderAt(db, hdrNum);
2529
2360
if (h == NULL) {
2530
2361
rpmlog(RPMLOG_ERR, _("%s: cannot read header at 0x%x\n"),
2531
2362
"rpmdbRemove", hdrNum);
2536
2365
char *nevra = headerGetAsString(h, RPMTAG_NEVRA);
2537
2366
rpmlog(RPMLOG_DEBUG, " --- h#%8u %s\n", hdrNum, nevra);
2541
2370
(void) blockSignals(&signalMask);
2543
/* FIX: rpmvals heartburn */
2545
dbiIndexItem rec = dbiIndexNewItem(hdrNum, 0);
2547
if (dbiTags.tags != NULL)
2548
for (dbix = 0; dbix < dbiTags.max; dbix++) {
2372
dbi = rpmdbOpenIndex(db, RPMDBI_PACKAGES, 0);
2373
/* Remove header from primary index */
2374
ret = updatePackages(dbi, hdrNum, NULL);
2376
/* Remove associated data from secondary indexes */
2378
struct dbiIndexItem rec = { .hdrNum = hdrNum, .tagNum = 0 };
2380
DBC * dbcursor = NULL;
2383
memset(&key, 0, sizeof(key));
2384
memset(&data, 0, sizeof(data));
2386
for (int dbix = 1; dbix < dbiTagsMax; dbix++) {
2387
rpmDbiTag rpmtag = dbiTags[dbix];
2552
2389
struct rpmtd_s tagdata;
2555
rpmtag = dbiTags.tags[dbix];
2557
/* Filter out temporary databases */
2558
if (isTemporaryDB(rpmtag))
2561
if (rpmtag == RPMDBI_PACKAGES) {
2562
dbi = dbiOpen(db, rpmtag, 0);
2563
if (dbi == NULL) /* XXX shouldn't happen */
2566
mi_offset.ui = hdrNum;
2567
if (dbiByteSwapped(dbi) == 1)
2569
key.data = &mi_offset;
2570
key.size = sizeof(mi_offset.ui);
2572
rc = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
2573
rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET);
2576
_("error(%d) setting header #%d record for %s removal\n"),
2577
rc, hdrNum, rpmTagGetName(dbi->dbi_rpmtag));
2579
rc = dbiDel(dbi, dbcursor, &key, &data, 0);
2580
xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
2582
if (!dbi->dbi_no_dbsync)
2583
xx = dbiSync(dbi, 0);
2391
if (!(dbi = rpmdbOpenIndex(db, rpmtag, 0)))
2587
2394
if (!headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM))
2590
if (!(dbi = dbiOpen(db, rpmtag, 0))) {
2591
rpmtdFreeData(&tagdata);
2594
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
2397
xx = dbiCopen(dbi, &dbcursor, DB_WRITECURSOR);
2596
logAddRemove(1, &tagdata);
2399
logAddRemove(dbiName(dbi), 1, &tagdata);
2597
2400
while (rpmtdNext(&tagdata) >= 0) {
2598
2401
dbiIndexSet set;
2599
2402
int freedata = 0;
2687
int rpmdbAdd(rpmdb db, int iid, Header h,
2689
rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg))
2486
/* Get current header instance number or try to allocate a new one */
2487
static unsigned int pkgInstance(dbiIndex dbi, int alloc)
2691
DBC * dbcursor = NULL;
2694
sigset_t signalMask;
2697
union _dbswap mi_offset;
2698
2489
unsigned int hdrNum = 0;
2706
memset(&key, 0, sizeof(key));
2707
memset(&data, 0, sizeof(data));
2709
#ifdef NOTYET /* XXX headerDel() broken on dribbles. */
2710
xx = headerDel(h, RPMTAG_REMOVETID);
2712
if (iid != 0 && iid != -1) {
2713
rpm_tid_t tid = iid;
2714
if (!headerIsEntry(h, RPMTAG_INSTALLTID))
2715
headerPutUint32(h, RPMTAG_INSTALLTID, &tid, 1);
2718
(void) blockSignals(&signalMask);
2491
if (dbi != NULL && dbiType(dbi) == DBI_PRIMARY) {
2492
DBC * dbcursor = NULL;
2721
2494
unsigned int firstkey = 0;
2722
void * keyp = &firstkey;
2723
size_t keylen = sizeof(firstkey);
2724
void * datap = NULL;
2727
dbi = dbiOpen(db, RPMDBI_PACKAGES, 0);
2730
/* XXX db0: hack to pass sizeof header to fadAlloc */
2732
datalen = headerSizeof(h, HEADER_MAGIC_NO);
2734
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
2736
/* Retrieve join key for next header instance. */
2741
data.size = datalen;
2495
union _dbswap mi_offset;
2498
memset(&key, 0, sizeof(key));
2499
memset(&data, 0, sizeof(data));
2501
ret = dbiCopen(dbi, &dbcursor, alloc ? DB_WRITECURSOR : 0);
2503
/* Key 0 holds the current largest instance, fetch it */
2504
key.data = &firstkey;
2505
key.size = sizeof(firstkey);
2742
2506
ret = dbiGet(dbi, dbcursor, &key, &data, DB_SET);
2746
datalen = data.size;
2749
if (ret == 0 && datap) {
2750
memcpy(&mi_offset, datap, sizeof(mi_offset.ui));
2508
if (ret == 0 && data.data) {
2509
memcpy(&mi_offset, data.data, sizeof(mi_offset.ui));
2751
2510
if (dbiByteSwapped(dbi) == 1)
2752
2511
_DBSWAP(mi_offset);
2753
2512
hdrNum = mi_offset.ui;
2756
mi_offset.ui = hdrNum;
2757
if (dbiByteSwapped(dbi) == 1)
2759
if (ret == 0 && datap) {
2760
memcpy(datap, &mi_offset, sizeof(mi_offset.ui));
2763
datalen = sizeof(mi_offset.ui);
2769
data.size = datalen;
2771
ret = dbiPut(dbi, dbcursor, &key, &data, DB_KEYLAST);
2772
xx = dbiSync(dbi, 0);
2774
xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
2782
_("error(%d) allocating new package instance\n"), ret);
2516
/* Rather complicated "increment by one", bswapping as needed */
2518
mi_offset.ui = hdrNum;
2519
if (dbiByteSwapped(dbi) == 1)
2521
if (ret == 0 && data.data) {
2522
memcpy(data.data, &mi_offset, sizeof(mi_offset.ui));
2524
data.data = &mi_offset;
2525
data.size = sizeof(mi_offset.ui);
2528
/* Unless we manage to insert the new instance number, we failed */
2529
ret = dbiPut(dbi, dbcursor, &key, &data, DB_KEYLAST);
2533
_("error(%d) allocating new package instance\n"), ret);
2536
ret = dbiSync(dbi, 0);
2538
ret = dbiCclose(dbi, dbcursor, 0);
2544
/* Add data to secondary index */
2545
static int addToIndex(dbiIndex dbi, rpmTagVal rpmtag, unsigned int hdrNum, Header h)
2548
struct rpmtd_s tagdata, reqflags;
2549
DBC * dbcursor = NULL;
2552
case RPMTAG_REQUIRENAME:
2553
headerGet(h, RPMTAG_REQUIREFLAGS, &reqflags, HEADERGET_MINMEM);
2556
headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM);
2560
if (rpmtdCount(&tagdata) == 0) {
2561
if (rpmtag != RPMTAG_GROUP)
2564
/* XXX preserve legacy behavior */
2565
tagdata.type = RPM_STRING_TYPE;
2566
tagdata.data = (const char **) "Unknown";
2570
xx = dbiCopen(dbi, &dbcursor, DB_WRITECURSOR);
2572
logAddRemove(dbiName(dbi), 0, &tagdata);
2573
while ((i = rpmtdNext(&tagdata)) >= 0) {
2575
int freedata = 0, j;
2577
/* Include the tagNum in all indices (only files use though) */
2578
struct dbiIndexItem rec = { .hdrNum = hdrNum, .tagNum = i };
2581
case RPMTAG_REQUIRENAME: {
2582
/* Filter out install prerequisites. */
2583
rpm_flag_t *rflag = rpmtdNextUint32(&reqflags);
2584
if (rflag && isInstallPreReq(*rflag) &&
2585
!isErasePreReq(*rflag))
2589
case RPMTAG_TRIGGERNAME:
2590
if (i > 0) { /* don't add duplicates */
2591
const char **tnames = tagdata.data;
2592
const char *str = rpmtdGetString(&tagdata);
2593
for (j = 0; j < i; j++) {
2594
if (rstreq(str, tnames[j]))
2605
memset(&key, 0, sizeof(key));
2606
memset(&data, 0, sizeof(data));
2608
if (!td2key(&tagdata, &key, &freedata)) {
2613
* XXX with duplicates, an accurate data value and
2614
* DB_GET_BOTH is needed.
2619
rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET);
2620
if (rc == 0) { /* success */
2621
/* With duplicates, cursor is positioned, discard the record. */
2622
if (!dbi->dbi_permit_dups)
2623
(void) dbt2set(dbi, &data, &set);
2624
} else if (rc != DB_NOTFOUND) { /* error */
2626
_("error(%d) getting \"%s\" records from %s index\n"),
2627
rc, (char*)key.data, dbiName(dbi));
2632
if (set == NULL) /* not found or duplicate */
2633
set = xcalloc(1, sizeof(*set));
2635
(void) dbiAppendSet(set, &rec, 1, sizeof(rec), 0);
2637
(void) set2dbt(dbi, &data, set);
2638
rc = dbiPut(dbi, dbcursor, &key, &data, DB_KEYLAST);
2642
_("error(%d) storing record %s into %s\n"),
2643
rc, (char*)key.data, dbiName(dbi));
2646
data.data = _free(data.data);
2648
set = dbiFreeIndexSet(set);
2655
xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
2658
xx = dbiSync(dbi, 0);
2661
rpmtdFreeData(&tagdata);
2665
int rpmdbAdd(rpmdb db, Header h)
2668
sigset_t signalMask;
2670
unsigned int hdrNum = 0;
2677
memset(&hdr, 0, sizeof(hdr));
2679
hdr.size = headerSizeof(h, HEADER_MAGIC_NO);
2680
hdr.data = headerUnload(h);
2681
hdrOk = (hdr.data != NULL && hdr.size > 0);
2786
/* Now update the indexes */
2790
dbiIndexItem rec = dbiIndexNewItem(hdrNum, 0);
2792
if (dbiTags.tags != NULL)
2793
for (dbix = 0; dbix < dbiTags.max; dbix++) {
2797
struct rpmtd_s tagdata, reqflags;
2799
rpmrc = RPMRC_NOTFOUND;
2801
rpmtag = dbiTags.tags[dbix];
2803
/* Filter out temporary databases */
2804
if (isTemporaryDB(rpmtag))
2808
case RPMDBI_PACKAGES:
2809
dbi = dbiOpen(db, rpmtag, 0);
2810
if (dbi == NULL) /* XXX shouldn't happen */
2812
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
2814
mi_offset.ui = hdrNum;
2815
if (dbiByteSwapped(dbi) == 1)
2817
key.data = (void *) &mi_offset;
2818
key.size = sizeof(mi_offset.ui);
2819
data.data = headerUnload(h);
2820
data.size = headerSizeof(h, HEADER_MAGIC_NO);
2822
/* Check header digest/signature on blob export. */
2827
rpmrc = (*hdrchk) (ts, data.data, data.size, &msg);
2828
lvl = (rpmrc == RPMRC_FAIL ? RPMLOG_ERR : RPMLOG_DEBUG);
2829
rpmlog(lvl, "%s h#%8u %s",
2830
(rpmrc == RPMRC_FAIL ? _("rpmdbAdd: skipping") : " +++"),
2831
hdrNum, (msg ? msg : "\n"));
2835
if (data.data != NULL && rpmrc != RPMRC_FAIL) {
2836
xx = dbiPut(dbi, dbcursor, &key, &data, DB_KEYLAST);
2837
xx = dbiSync(dbi, 0);
2839
data.data = _free(data.data);
2841
xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
2843
if (!dbi->dbi_no_dbsync)
2844
xx = dbiSync(dbi, 0);
2847
case RPMTAG_REQUIRENAME:
2848
headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM);
2849
headerGet(h, RPMTAG_REQUIREFLAGS, &reqflags, HEADERGET_MINMEM);
2852
headerGet(h, rpmtag, &tagdata, HEADERGET_MINMEM);
2856
if (rpmtdCount(&tagdata) == 0) {
2857
if (rpmtag != RPMTAG_GROUP)
2860
/* XXX preserve legacy behavior */
2861
tagdata.type = RPM_STRING_TYPE;
2862
tagdata.data = (const char **) "Unknown";
2866
if (!(dbi = dbiOpen(db, rpmtag, 0))) {
2867
rpmtdFreeData(&tagdata);
2870
xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
2872
logAddRemove(0, &tagdata);
2873
while (rpmtdNext(&tagdata) >= 0) {
2875
int i, freedata = 0;
2878
* Include the tagNum in all indices. rpm-3.0.4 and earlier
2879
* included the tagNum only for files.
2881
i = rec->tagNum = rpmtdGetIndex(&tagdata);
2883
case RPMTAG_REQUIRENAME: {
2884
/* Filter out install prerequisites. */
2885
rpm_flag_t *rflag = rpmtdNextUint32(&reqflags);
2886
if (rflag && isInstallPreReq(*rflag) &&
2887
!isErasePreReq(*rflag))
2891
case RPMTAG_TRIGGERNAME:
2892
if (i > 0) { /* don't add duplicates */
2893
const char **tnames = tagdata.data;
2894
const char *str = rpmtdGetString(&tagdata);
2895
for (j = 0; j < i; j++) {
2896
if (rstreq(str, tnames[j]))
2907
if (!td2key(&tagdata, &key, &freedata)) {
2912
* XXX with duplicates, an accurate data value and
2913
* DB_GET_BOTH is needed.
2918
rc = dbiGet(dbi, dbcursor, &key, &data, DB_SET);
2919
if (rc == 0) { /* success */
2920
/* With duplicates, cursor is positioned, discard the record. */
2921
if (!dbi->dbi_permit_dups)
2922
(void) dbt2set(dbi, &data, &set);
2923
} else if (rc != DB_NOTFOUND) { /* error */
2925
_("error(%d) getting \"%s\" records from %s index\n"),
2926
rc, (char*)key.data, rpmTagGetName(dbi->dbi_rpmtag));
2931
if (set == NULL) /* not found or duplicate */
2932
set = xcalloc(1, sizeof(*set));
2934
(void) dbiAppendSet(set, rec, 1, sizeof(*rec), 0);
2936
(void) set2dbt(dbi, &data, set);
2937
rc = dbiPut(dbi, dbcursor, &key, &data, DB_KEYLAST);
2941
_("error(%d) storing record %s into %s\n"),
2942
rc, (char*)key.data, rpmTagGetName(dbi->dbi_rpmtag));
2945
data.data = _free(data.data);
2947
set = dbiFreeIndexSet(set);
2954
xx = dbiCclose(dbi, dbcursor, DB_WRITECURSOR);
2957
if (!dbi->dbi_no_dbsync)
2958
xx = dbiSync(dbi, 0);
2960
rpmtdFreeData(&tagdata);
2964
/* If everthing ok, mark header as installed now */
2966
headerSetInstance(h, hdrNum);
2688
(void) blockSignals(&signalMask);
2690
dbi = rpmdbOpenIndex(db, RPMDBI_PACKAGES, 0);
2691
hdrNum = pkgInstance(dbi, 1);
2693
/* Add header to primary index */
2694
ret = updatePackages(dbi, hdrNum, &hdr);
2696
/* Add associated data to secondary indexes */
2698
for (int dbix = 1; dbix < dbiTagsMax; dbix++) {
2699
rpmDbiTag rpmtag = dbiTags[dbix];
2701
if (!(dbi = rpmdbOpenIndex(db, rpmtag, 0)))
2704
ret += addToIndex(dbi, rpmtag, hdrNum, h);
2708
/* If everthing ok, mark header as installed now */
2710
headerSetInstance(h, hdrNum);
2971
2715
(void) unblockSignals(&signalMask);
3043
2772
int selinux = is_selinux_enabled() && (matchpathcon_init(NULL) != -1);
3044
2773
sigset_t sigMask;
3047
2775
blockSignals(&sigMask);
3048
switch (_olddbapi) {
3052
if (dbiTags.tags != NULL)
3053
for (i = 0; i < dbiTags.max; i++) {
3058
/* Filter out temporary databases */
3059
if (isTemporaryDB((rpmtag = dbiTags.tags[i])))
3062
base = rpmTagGetName(rpmtag);
3063
src = rpmGetPath(prefix, "/", olddbpath, "/", base, NULL);
3064
dest = rpmGetPath(prefix, "/", newdbpath, "/", base, NULL);
3066
if (access(src, F_OK) != 0)
3070
* Restore uid/gid/mode/mtime/security context if possible.
3072
if (stat(dest, &st) < 0)
3073
if (stat(src, &st) < 0)
3076
if ((xx = rename(src, dest)) != 0) {
3080
xx = chown(dest, st.st_uid, st.st_gid);
3081
xx = chmod(dest, (st.st_mode & 07777));
3082
{ struct utimbuf stamp;
3083
stamp.actime = st.st_atime;
3084
stamp.modtime = st.st_mtime;
3085
xx = utime(dest, &stamp);
3089
security_context_t scon = NULL;
3090
if (matchpathcon(dest, st.st_mode, &scon) != -1) {
3091
(void) setfilecon(dest, scon);
2776
for (i = 0; i < dbiTagsMax; i++) {
2777
rpmDbiTag rpmtag = dbiTags[i];
2778
const char *base = rpmTagGetName(rpmtag);
2779
char *src = rpmGetPath(prefix, "/", olddbpath, "/", base, NULL);
2780
char *dest = rpmGetPath(prefix, "/", newdbpath, "/", base, NULL);
2782
if (access(src, F_OK) != 0)
2786
* Restore uid/gid/mode/security context if possible.
2788
if (stat(dest, &st) < 0)
2789
if (stat(src, &st) < 0)
2792
if ((xx = rename(src, dest)) != 0) {
2796
xx = chown(dest, st.st_uid, st.st_gid);
2797
xx = chmod(dest, (st.st_mode & 07777));
2800
security_context_t scon = NULL;
2801
if (matchpathcon(dest, st.st_mode, &scon) != -1) {
2802
(void) setfilecon(dest, scon);
3101
cleanDbenv(prefix, olddbpath);
3102
cleanDbenv(prefix, newdbpath);
2812
cleanDbenv(prefix, olddbpath);
2813
cleanDbenv(prefix, newdbpath);
3109
2815
unblockSignals(&sigMask);
3111
#ifdef SQLITE_HACK_XXX
3112
if (rc || _olddbapi == _newdbapi)
3115
rc = rpmdbRemoveDatabase(prefix, newdbpath, _newdbapi);
3119
2818
(void) matchpathcon_fini();