rpm  4.13.0
rpmdb.c
Go to the documentation of this file.
1 #include "system.h"
2 
3 #include <popt.h>
4 #include <rpm/rpmcli.h>
5 #include <rpm/rpmdb.h>
6 #include "cliutils.h"
7 #include "debug.h"
8 
9 #if !defined(__GLIBC__) && !defined(__APPLE__)
10 char ** environ = NULL;
11 #endif
12 
13 enum modes {
14  MODE_INITDB = (1 << 0),
15  MODE_REBUILDDB = (1 << 1),
16  MODE_VERIFYDB = (1 << 2),
17  MODE_EXPORTDB = (1 << 3),
18  MODE_IMPORTDB = (1 << 4),
19 };
20 
21 static int mode = 0;
22 
23 static struct poptOption dbOptsTable[] = {
24  { "initdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_INITDB,
25  N_("initialize database"), NULL},
26  { "rebuilddb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_REBUILDDB,
27  N_("rebuild database inverted lists from installed package headers"),
28  NULL},
29  { "verifydb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN),
30  &mode, MODE_VERIFYDB, N_("verify database files"), NULL},
31  { "exportdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTDB,
32  N_("export database to stdout header list"),
33  NULL},
34  { "importdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_IMPORTDB,
35  N_("import database from stdin header list"),
36  NULL},
37  POPT_TABLEEND
38 };
39 
40 static struct poptOption optionsTable[] = {
41  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, dbOptsTable, 0,
42  N_("Database options:"), NULL },
43  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
44  N_("Common options for all rpm modes and executables:"), NULL },
45 
46  POPT_AUTOALIAS
47  POPT_AUTOHELP
48  POPT_TABLEEND
49 };
50 
51 static int exportDB(rpmts ts)
52 {
53  FD_t fd = fdDup(STDOUT_FILENO);
54  rpmtxn txn = rpmtxnBegin(ts, RPMTXN_READ);
55  int rc = 0;
56 
57  if (txn && fd) {
58  Header h;
60  while ((h = rpmdbNextIterator(mi))) {
61  rc += headerWrite(fd, h, HEADER_MAGIC_YES);
62  }
64  } else {
65  rc = -1;
66  }
67  Fclose(fd);
68  rpmtxnEnd(txn);
69  return rc;
70 }
71 
72 /* XXX: only allow this on empty db? */
73 static int importDB(rpmts ts)
74 {
75  FD_t fd = fdDup(STDIN_FILENO);
76  rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);
77  int rc = 0;
78 
79  if (txn && fd) {
80  Header h;
81  while ((h = headerRead(fd, HEADER_MAGIC_YES))) {
82  rc += rpmtsImportHeader(txn, h, 0);
83  }
84  } else {
85  rc = -1;
86  }
87  rpmtxnEnd(txn);
88  Fclose(fd);
89  return rc;
90 }
91 
92 int main(int argc, char *argv[])
93 {
94  int ec = EXIT_FAILURE;
95  poptContext optCon = rpmcliInit(argc, argv, optionsTable);
96  rpmts ts = NULL;
97 
98  if (argc < 2 || poptPeekArg(optCon)) {
99  printUsage(optCon, stderr, 0);
100  goto exit;
101  }
102 
103  ts = rpmtsCreate();
105 
106  switch (mode) {
107  case MODE_INITDB:
108  ec = rpmtsInitDB(ts, 0644);
109  break;
110  case MODE_REBUILDDB:
111  { rpmVSFlags vsflags = rpmExpandNumeric("%{_vsflags_rebuilddb}");
112  rpmVSFlags ovsflags = rpmtsSetVSFlags(ts, vsflags);
113  ec = rpmtsRebuildDB(ts);
114  rpmtsSetVSFlags(ts, ovsflags);
115  } break;
116  case MODE_VERIFYDB:
117  ec = rpmtsVerifyDB(ts);
118  break;
119  case MODE_EXPORTDB:
120  ec = exportDB(ts);
121  break;
122  case MODE_IMPORTDB:
123  ec = importDB(ts);
124  break;
125  default:
126  argerror(_("only one major mode may be specified"));
127  }
128 
129 exit:
130  rpmtsFree(ts);
131  rpmcliFini(optCon);
132  return ec;
133 }
_
#define _(Text)
Definition: system.h:112
rpmtsImportHeader
rpmRC rpmtsImportHeader(rpmtxn txn, Header h, rpmFlags flags)
rpmtsInitDB
int rpmtsInitDB(rpmts ts, int dbmode)
environ
char ** environ
Definition: rpmdb.c:10
headerRead
Header headerRead(FD_t fd, int magicp)
rpmtsVerifyDB
int rpmtsVerifyDB(rpmts ts)
rpmtsCreate
rpmts rpmtsCreate(void)
main
int main(int argc, char *argv[])
Definition: rpmdb.c:92
MODE_IMPORTDB
@ MODE_IMPORTDB
Definition: rpmdb.c:18
rpmts
struct rpmts_s * rpmts
Definition: rpmtypes.h:63
rpmtxn
struct rpmtxn_s * rpmtxn
Definition: rpmtypes.h:72
rpmcliFini
poptContext rpmcliFini(poptContext optCon)
rpmtxnEnd
rpmtxn rpmtxnEnd(rpmtxn txn)
exportDB
static int exportDB(rpmts ts)
Definition: rpmdb.c:51
rpmcliRootDir
const char * rpmcliRootDir
importDB
static int importDB(rpmts ts)
Definition: rpmdb.c:73
mode
static int mode
Definition: rpmdb.c:21
printUsage
void printUsage(poptContext con, FILE *fp, int flags)
Definition: cliutils.c:36
MODE_EXPORTDB
@ MODE_EXPORTDB
Definition: rpmdb.c:17
argerror
void argerror(const char *desc)
Definition: cliutils.c:19
dbOptsTable
static struct poptOption dbOptsTable[]
Definition: rpmdb.c:23
fdDup
FD_t fdDup(int fdno)
headerWrite
int headerWrite(FD_t fd, Header h, int magicp)
MODE_INITDB
@ MODE_INITDB
Definition: rpmdb.c:14
rpmExpandNumeric
int rpmExpandNumeric(const char *arg)
modes
modes
Definition: rpmbuild.c:250
system.h
RPMTXN_READ
@ RPMTXN_READ
Definition: rpmts.h:160
rpmtxnBegin
rpmtxn rpmtxnBegin(rpmts ts, rpmtxnFlags flags)
RPMDBI_PACKAGES
@ RPMDBI_PACKAGES
Definition: rpmtag.h:371
Fclose
int Fclose(FD_t fd)
Header
struct headerToken_s * Header
Definition: rpmtypes.h:24
HEADER_MAGIC_YES
@ HEADER_MAGIC_YES
Definition: header.h:34
rpmtsSetVSFlags
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
optionsTable
static struct poptOption optionsTable[]
Definition: rpmdb.c:40
RPMTXN_WRITE
@ RPMTXN_WRITE
Definition: rpmts.h:161
rpmcliInit
poptContext rpmcliInit(int argc, char *const argv[], struct poptOption *optionsTable)
rpmVSFlags
rpmFlags rpmVSFlags
Definition: rpmts.h:110
MODE_VERIFYDB
@ MODE_VERIFYDB
Definition: rpmdb.c:16
rpmcliAllPoptTable
struct poptOption rpmcliAllPoptTable[]
rpmdbNextIterator
Header rpmdbNextIterator(rpmdbMatchIterator mi)
cliutils.h
rpmdbFreeIterator
rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi)
rpmtsSetRootDir
int rpmtsSetRootDir(rpmts ts, const char *rootDir)
MODE_REBUILDDB
@ MODE_REBUILDDB
Definition: rpmdb.c:15
N_
#define N_(Text)
Definition: system.h:115
rpmtsInitIterator
rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, const void *keyp, size_t keylen)
FD_t
struct _FD_s * FD_t
Definition: rpmtypes.h:98
rpmtsRebuildDB
int rpmtsRebuildDB(rpmts ts)
debug.h
rpmtsFree
rpmts rpmtsFree(rpmts ts)
rpmdbMatchIterator
struct rpmdbMatchIterator_s * rpmdbMatchIterator
Definition: rpmtypes.h:69