Handle config.guess and config.sub with DOS EOLs
[platform/upstream/rpm.git] / rpmdb.c
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 enum modes {
10     MODE_INITDB         = (1 << 0),
11     MODE_REBUILDDB      = (1 << 1),
12     MODE_VERIFYDB       = (1 << 2),
13     MODE_EXPORTDB       = (1 << 3),
14     MODE_IMPORTDB       = (1 << 4),
15 };
16
17 static int mode = 0;
18
19 static struct poptOption dbOptsTable[] = {
20     { "initdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_INITDB,
21         N_("initialize database"), NULL},
22     { "rebuilddb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_REBUILDDB,
23         N_("rebuild database inverted lists from installed package headers"),
24         NULL},
25     { "verifydb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN),
26         &mode, MODE_VERIFYDB, N_("verify database files"), NULL},
27     { "exportdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTDB,
28         N_("export database to stdout header list"),
29         NULL},
30     { "importdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_IMPORTDB,
31         N_("import database from stdin header list"),
32         NULL},
33     POPT_TABLEEND
34 };
35
36 static struct poptOption optionsTable[] = {
37     { NULL, '\0', POPT_ARG_INCLUDE_TABLE, dbOptsTable, 0,
38         N_("Database options:"), NULL },
39     { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
40         N_("Common options for all rpm modes and executables:"), NULL },
41
42     POPT_AUTOALIAS
43     POPT_AUTOHELP
44     POPT_TABLEEND
45 };
46
47 static int exportDB(rpmts ts)
48 {
49     FD_t fd = fdDup(STDOUT_FILENO);
50     rpmtxn txn = rpmtxnBegin(ts, RPMTXN_READ);
51     int rc = 0;
52
53     if (txn && fd) {
54         Header h;
55         rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
56         while ((h = rpmdbNextIterator(mi))) {
57             rc += headerWrite(fd, h, HEADER_MAGIC_YES);
58         }
59         rpmdbFreeIterator(mi);
60     } else {
61         rc = -1;
62     }
63     Fclose(fd);
64     rpmtxnEnd(txn);
65     return rc;
66 }
67
68 /* XXX: only allow this on empty db? */
69 static int importDB(rpmts ts)
70 {
71     FD_t fd = fdDup(STDIN_FILENO);
72     rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);
73     int rc = 0;
74
75     if (txn && fd) {
76         Header h;
77         while ((h = headerRead(fd, HEADER_MAGIC_YES))) {
78             rc += rpmtsImportHeader(txn, h, 0);
79         }
80     } else {
81         rc = -1;
82     }
83     rpmtxnEnd(txn);
84     Fclose(fd);
85     return rc;
86 }
87
88 int main(int argc, char *argv[])
89 {
90     int ec = EXIT_FAILURE;
91     poptContext optCon = NULL;
92     rpmts ts = NULL;
93
94     xsetprogname(argv[0]); /* Portability call -- see system.h */
95
96     optCon = rpmcliInit(argc, argv, optionsTable);
97
98     if (argc < 2 || poptPeekArg(optCon)) {
99         printUsage(optCon, stderr, 0);
100         goto exit;
101     }
102
103     ts = rpmtsCreate();
104     rpmtsSetRootDir(ts, rpmcliRootDir);
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 }