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 [EMAIL PROTECTED]
+ *
+ * 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);
+}      
+               
+               
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to