poldek: poldek/Cellar/minirpm.c (NEW) - found via google code
mis
mis at pld-linux.org
Mon Jul 9 21:56:09 CEST 2007
Author: mis Date: Mon Jul 9 19:56:09 2007 GMT
Module: poldek Tag: HEAD
---- Log message:
- found via google code
---- Files affected:
poldek/poldek/Cellar:
minirpm.c (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: poldek/poldek/Cellar/minirpm.c
diff -u /dev/null poldek/poldek/Cellar/minirpm.c:1.1
--- /dev/null Mon Jul 9 21:56:09 2007
+++ poldek/poldek/Cellar/minirpm.c Mon Jul 9 21:56:04 2007
@@ -0,0 +1,150 @@
+/* Taken from http://laiskiainen.org/rpm/examples/minirpm.c */
+
+/*
+ * "Trivial rpm" for an example of using rpmlib for installing, upgrading
+ * and erasing packages by pmatilai at laiskiainen.org
+ *
+ * Usage: rpm [-i pkg] [-U pkg] -e [pkg] ...
+ * Compile with "gcc -o minirpm minirpm.c -lrpm"
+ */
+
+#include <fcntl.h>
+#include <rpm/rpmlib.h>
+#include <rpm/rpmts.h>
+#include <rpm/rpmcli.h>
+#include <rpm/rpmdb.h>
+
+int add_for_install(rpmts ts, char *file, int upgrade)
+{
+ FD_t fd;
+ Header hdr;
+ int rc = 0;
+
+ /* Read package header */
+ fd = Fopen(file, "r.ufdio");
+ if (fd == NULL) {
+ printf("Unable to open file %s\n", file);
+ return 1;
+ }
+ rc = rpmReadPackageFile(ts, fd, file, &hdr);
+ if (rc != RPMRC_OK) {
+ printf("Unable to read package %s\n", file);
+ return rc;
+ }
+ /* Add it to the transaction set */
+ rc = rpmtsAddInstallElement(ts, hdr, file, upgrade, 0);
+ if (rc) {
+ printf("Error adding %s to transaction\n", file);
+ goto out;
+ }
+out:
+ headerFree(hdr);
+ Fclose(fd);
+ return rc;
+}
+
+int add_for_erase(rpmts ts, char *name)
+{
+ Header hdr;
+ rpmdbMatchIterator mi;
+ int rc = 0;
+
+ /* Locate the package and add for erasure */
+ mi = rpmtsInitIterator(ts, (rpmTag)RPMDBI_LABEL, name, 0);
+ while ((hdr = rpmdbNextIterator(mi)) != NULL) {
+ int recOffset = rpmdbGetIteratorOffset(mi);
+ if (recOffset) {
+ rc = rpmtsAddEraseElement(ts, hdr, recOffset);
+ if (rc)
+ printf("Error adding %s to transaction", name);
+
+ }
+ }
+ mi = rpmdbFreeIterator(mi);
+ return rc;
+}
+
+int main(int argc, char **argv)
+{
+ rpmts ts;
+ rpmps probs;
+ int probFilter = 0;
+ int notifyFlags = 0;
+ int tsFlags = 0;
+ int rc = 0;
+
+ /* Read configuration, initialize transaction */
+ rpmReadConfigFiles(NULL, NULL);
+ ts = rpmtsCreate();
+
+ /* Set verification flags if needed, for example --nomd5 */
+ /* rpmtsSetVSFlags(ts, rpmtsVSFlags(ts) | RPMVSF_NOMD5); */
+
+ /* Open rpmdb */
+ //rpmtsSetRootDir(ts, NULL);
+ rc = rpmtsOpenDB(ts, O_RDWR);
+ if (rc) {
+ printf("Error opening rpmdb\n");
+ goto exit;
+ }
+
+ /* Add packages for install/upgrade/erase */
+ while (optind < argc) {
+ int upgrade = 0;
+ switch (getopt(argc, argv, "i:U:e:")) {
+ case 'U':
+ upgrade = 1;
+ case 'i':
+ add_for_install(ts, optarg, upgrade);
+ break;
+ case 'e':
+ add_for_erase(ts, optarg);
+ break;
+ default:
+ printf("usage ...\n");
+ goto exit;
+ }
+ }
+
+ /* Set problem filters if needed, for example --oldpackage */
+ /* rpmbFilter |= RPMPROB_FILTER_OLDPACKAGE /*
+
+ /* Set transaction flags if needed, for example --excludedocs */
+ /* tsFlags |= RPMTRANS_FLAG_NODOCS */
+
+ /* Check transaction sanity */
+ rc = rpmtsCheck(ts);
+ probs = rpmtsProblems(ts);
+ if (rc || rpmpsNumProblems(probs)) {
+ rpmpsPrint(NULL, probs);
+ rpmpsFree(probs);
+ goto exit;
+ }
+
+ /* Create ordering for the transaction */
+ rc = rpmtsOrder(ts);
+ if (rc > 0) {
+ printf("Ordering failed\n");
+ goto exit;
+ }
+ rpmtsClean(ts);
+
+ /* Set callback routine & flags, for example -vh */
+ notifyFlags |= INSTALL_LABEL | INSTALL_HASH;
+ rpmtsSetNotifyCallback(ts, rpmShowProgress, (void *)notifyFlags);
+
+ /* Set transaction flags and run the actual transaction */
+ rpmtsSetFlags(ts, (rpmtransFlags)(rpmtsFlags(ts) | tsFlags));
+ rc = rpmtsRun(ts, NULL, (rpmprobFilterFlags)probFilter);
+ /* Check for results .. */
+ if (rc || rpmpsNumProblems(probs) > 0)
+ rpmpsPrint(stderr, probs);
+ rpmpsFree(probs);
+
+exit:
+ /* ..and clean up */
+ rpmtsFree(ts);
+ exit(rc);
+}
+
+
================================================================
More information about the pld-cvs-commit
mailing list