Add config.sub update to %configure macro
[platform/upstream/rpm.git] / rpmdb.c
diff --git a/rpmdb.c b/rpmdb.c
index 7223fdf..25c088d 100644 (file)
--- a/rpmdb.c
+++ b/rpmdb.c
@@ -2,17 +2,16 @@
 
 #include <popt.h>
 #include <rpm/rpmcli.h>
+#include <rpm/rpmdb.h>
 #include "cliutils.h"
 #include "debug.h"
 
-#if !defined(__GLIBC__) && !defined(__APPLE__)
-char ** environ = NULL;
-#endif
-
 enum modes {
     MODE_INITDB                = (1 << 0),
     MODE_REBUILDDB     = (1 << 1),
     MODE_VERIFYDB      = (1 << 2),
+    MODE_EXPORTDB      = (1 << 3),
+    MODE_IMPORTDB      = (1 << 4),
 };
 
 static int mode = 0;
@@ -25,6 +24,12 @@ static struct poptOption dbOptsTable[] = {
        NULL},
     { "verifydb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR|POPT_ARGFLAG_DOC_HIDDEN),
        &mode, MODE_VERIFYDB, N_("verify database files"), NULL},
+    { "exportdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_EXPORTDB,
+       N_("export database to stdout header list"),
+       NULL},
+    { "importdb", '\0', (POPT_ARG_VAL|POPT_ARGFLAG_OR), &mode, MODE_IMPORTDB,
+       N_("import database from stdin header list"),
+       NULL},
     POPT_TABLEEND
 };
 
@@ -39,12 +44,57 @@ static struct poptOption optionsTable[] = {
     POPT_TABLEEND
 };
 
+static int exportDB(rpmts ts)
+{
+    FD_t fd = fdDup(STDOUT_FILENO);
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_READ);
+    int rc = 0;
+
+    if (txn && fd) {
+       Header h;
+       rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
+       while ((h = rpmdbNextIterator(mi))) {
+           rc += headerWrite(fd, h, HEADER_MAGIC_YES);
+       }
+       rpmdbFreeIterator(mi);
+    } else {
+       rc = -1;
+    }
+    Fclose(fd);
+    rpmtxnEnd(txn);
+    return rc;
+}
+
+/* XXX: only allow this on empty db? */
+static int importDB(rpmts ts)
+{
+    FD_t fd = fdDup(STDIN_FILENO);
+    rpmtxn txn = rpmtxnBegin(ts, RPMTXN_WRITE);
+    int rc = 0;
+
+    if (txn && fd) {
+       Header h;
+       while ((h = headerRead(fd, HEADER_MAGIC_YES))) {
+           rc += rpmtsImportHeader(txn, h, 0);
+       }
+    } else {
+       rc = -1;
+    }
+    rpmtxnEnd(txn);
+    Fclose(fd);
+    return rc;
+}
+
 int main(int argc, char *argv[])
 {
     int ec = EXIT_FAILURE;
-    poptContext optCon = rpmcliInit(argc, argv, optionsTable);
+    poptContext optCon = NULL;
     rpmts ts = NULL;
-    
+
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
+
+    optCon = rpmcliInit(argc, argv, optionsTable);
+
     if (argc < 2 || poptPeekArg(optCon)) {
        printUsage(optCon, stderr, 0);
        goto exit;
@@ -66,6 +116,12 @@ int main(int argc, char *argv[])
     case MODE_VERIFYDB:
        ec = rpmtsVerifyDB(ts);
        break;
+    case MODE_EXPORTDB:
+       ec = exportDB(ts);
+       break;
+    case MODE_IMPORTDB:
+       ec = importDB(ts);
+       break;
     default:
        argerror(_("only one major mode may be specified"));
     }