aboutsummaryrefslogtreecommitdiffstats
path: root/grpmi/rpm/grpmi_rpm.xs
diff options
context:
space:
mode:
Diffstat (limited to 'grpmi/rpm/grpmi_rpm.xs')
-rw-r--r--grpmi/rpm/grpmi_rpm.xs405
1 files changed, 0 insertions, 405 deletions
diff --git a/grpmi/rpm/grpmi_rpm.xs b/grpmi/rpm/grpmi_rpm.xs
deleted file mode 100644
index 72b4de28..00000000
--- a/grpmi/rpm/grpmi_rpm.xs
+++ /dev/null
@@ -1,405 +0,0 @@
-/* -*- c -*-
- *
- * Copyright (c) 2002 Guillaume Cottenceau (gc at mandrakesoft dot com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- ******************************************************************************/
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <langinfo.h>
-#include <iconv.h>
-
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-#undef Fflush
-#undef Mkdir
-#undef Stat
-#include <rpm/rpmlib.h>
-#include <rpm/misc.h>
-
-#include <libintl.h>
-#undef _
-#define _(arg) dgettext("grpmi", arg)
-
-#define streq !strcmp
-
-char * my_asprintf(char *msg, ...)
-{
- char * out;
- va_list args;
- va_start(args, msg);
- if (vasprintf(&out, msg, args) == -1)
- out = "";
- va_end(args);
- return out;
-}
-
-
-char * init_rcstuff_(void)
-{
- char * rpmrc;
-
- rpmrc = getenv("RPMRC_FILE");
- if (rpmrc && !*rpmrc)
- rpmrc = NULL;
- if (rpmReadConfigFiles(rpmrc, NULL))
- return _("Couldn't read RPM config files");
-
- return "";
-}
-
-
-/* bad bad bad.. duplicated code from gi/perl-install/c/stuff.xs */
-char* std_to_utf8(char* s)
-{
- iconv_t cd = iconv_open("UTF-8", nl_langinfo(CODESET));
- char* retval = s;
- if (cd != (iconv_t) (-1)) {
- size_t s_len = strlen(retval);
- /* the maximum expansion when converting happens when converting
- tscii to utf-8; each tscii char can become up to 4 unicode chars
- and each one of those unicode chars can be 3 bytes long */
- char *buf = alloca(4 * 3 * s_len);
- {
- char *ptr = buf;
- size_t ptr_len = 4 * 3 * s_len;
- if ((iconv(cd, &s, &s_len, &ptr, &ptr_len)) != (size_t) (-1)) {
- *ptr = 0;
- retval = buf;
- }
- }
- iconv_close(cd);
- }
- return strdup(retval);
-}
-
-/* these are in rpmlib but not in rpmlib.h */
-int readLead(FD_t fd, struct rpmlead *lead);
-int rpmReadSignature(FD_t fd, Header *header, short sig_type);
-
-char * verify_sig_(char * file)
-{
- struct rpmlead lead;
- Header sig;
- HeaderIterator sigIter;
- const void *ptr;
- int_32 tag, type, count;
- char result[8*BUFSIZ];
- FD_t fd, ofd;
- int i;
- const char *tmpfile = NULL;
- unsigned char buffer[8192];
- int gpg_sig = 0;
-
- fd = fdOpen(file, O_RDONLY, 0);
- if (fdFileno(fd) < 0) {
- return _("Couldn't open file\n");
- }
- memset(&lead, 0, sizeof(lead));
- if (readLead(fd, &lead)) {
- return _("Could not read lead bytes\n");
- }
- if (lead.major == 1) {
- return _("RPM version of package doesn't support signatures\n");
- }
-
- i = rpmReadSignature(fd, &sig, lead.signature_type);
- if (i != RPMRC_OK && i != RPMRC_BADSIZE) {
- return _("Could not read signature block (`rpmReadSignature' failed)\n");
- }
- if (!sig) {
- return _("No signatures\n");
- }
-
- if (makeTempFile(NULL, &tmpfile, &ofd))
- return _("`makeTempFile' failed!\n");
-
- while ((i = fdRead(fd, buffer, sizeof(buffer))) != 0) {
- if (i == -1) {
- fdClose(ofd);
- fdClose(fd);
- unlink(tmpfile);
- return _("Error reading file\n");
- }
- if (fdWrite(ofd, buffer, i) < 0) {
- fdClose(ofd);
- fdClose(fd);
- unlink(tmpfile);
- return _("Error writing temp file\n");
- }
- }
- fdClose(fd);
- fdClose(ofd);
-
- for (sigIter = headerInitIterator(sig); headerNextIterator(sigIter, &tag, &type, &ptr, &count); ptr = headerFreeData(ptr, type)) {
- switch (tag) {
- case RPMSIGTAG_PGP5: case RPMSIGTAG_PGP: case RPMSIGTAG_GPG:
- gpg_sig = 1;
- case RPMSIGTAG_LEMD5_2: case RPMSIGTAG_LEMD5_1: case RPMSIGTAG_MD5:
- case RPMSIGTAG_SIZE:
- break;
- default:
- continue;
- }
-
- i = rpmVerifySignature(tmpfile, tag, ptr, count, result);
- if (i != RPMSIG_OK) {
- unlink(tmpfile);
- return std_to_utf8(result);
- }
- }
- unlink(tmpfile);
- if (!gpg_sig)
- return _("No GPG signature in package\n");
- else
- return "";
-}
-
-
-void rpmError_callback_empty(void) {}
-
-int rpmError_callback_data;
-void rpmError_callback(void) {
- if (rpmErrorCode() != RPMERR_UNLINK && rpmErrorCode() != RPMERR_RMDIR) {
- write(rpmError_callback_data, rpmErrorString(), strlen(rpmErrorString()));
- }
-}
-
-SV * install_packages_callback_data = NULL;
-int install_packages_callback(char * msg, ...) __attribute__ ((format (printf, 1, 2)));
-int install_packages_callback(char * msg, ...)
-{
- int i;
- char * out;
- dSP;
-
- va_list args;
- va_start(args, msg);
- if (vasprintf(&out, msg, args) == -1)
- out = "";
- va_end(args);
-
- if (!SvROK(install_packages_callback_data))
- return 0;
- ENTER;
- SAVETMPS;
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpv(out, 0)));
- PUTBACK;
- free(out);
- i = call_sv(install_packages_callback_data, G_SCALAR);
- SPAGAIN;
- if (i != 1)
- croak("Big trouble\n");
- else
- i = POPi;
- PUTBACK;
- FREETMPS;
- LEAVE;
- return i;
-}
-
-char * install_packages_(char ** packages)
-{
- void * rpmRunTransactions_callback(const void * h, const rpmCallbackType what, const unsigned long amount, const unsigned long total, const void * pkgKey, void * data) {
- static FD_t fd;
-
- switch (what) {
- case RPMCALLBACK_INST_OPEN_FILE:
- return fd = fdOpen(pkgKey, O_RDONLY, 0);
- case RPMCALLBACK_INST_CLOSE_FILE:
- fdClose(fd);
- break;
- case RPMCALLBACK_INST_START:
- install_packages_callback("inst-start %s", basename(pkgKey));
- break;
- case RPMCALLBACK_INST_PROGRESS:
- install_packages_callback("inst-progress %ld %ld", amount, total);
- break;
- default:
- break;
- }
- return NULL;
- }
- char * returnmsg;
- rpmdb db;
- rpmTransactionSet rpmdep;
- rpmDependencyConflict conflicts;
- int num_conflicts;
- rpmProblemSet probs = NULL;
- char ** pkg;
- int noupgrade = 0;
-
- if (rpmdbOpen("", &db, O_RDWR, 0644)) {
- if (rpmErrorCode() == RPMERR_DBOPEN)
- return _("Couldn't open RPM DB for writing (not superuser?)");
- else
- return _("Couldn't open RPM DB for writing");
- }
-
- if (!(rpmdep = rpmtransCreateSet(db, NULL))) {
- returnmsg = _("Couldn't start transaction");
- goto install_packages_cleanup;
- }
-
- for (pkg = packages; pkg && *pkg; pkg++) {
- if (streq(*pkg, "-noupgrade"))
- noupgrade = 1;
- else {
- Header h;
- int isSource, major;
- char *file = *pkg;
- char *LocalName = basename(file);
- FD_t fd;
-
- if (file[0] == '-')
- continue;
-
- fd = fdOpen(file, O_RDONLY, 0);
- if (fdFileno(fd) < 0) {
- returnmsg = my_asprintf(_("Can't open package `%s'\n"), LocalName);
- goto install_packages_cleanup;
- }
- switch (rpmReadPackageHeader(fd, &h, &isSource, &major, NULL)) {
- case 1:
- returnmsg = my_asprintf(_("Package `%s' is corrupted\n"), LocalName);
- goto install_packages_cleanup;
- default:
- returnmsg = my_asprintf(_("Package `%s' can't be installed\n"), LocalName);
- goto install_packages_cleanup;
- case 0:
- rpmtransAddPackage(rpmdep, h, NULL, file, !noupgrade, NULL);
- }
- fdClose(fd);
- noupgrade = 0;
- }
- }
-
- if (rpmdepCheck(rpmdep, &conflicts, &num_conflicts)) {
- returnmsg = _("Error while checking dependencies");
- goto install_packages_cleanup;
- }
- if (conflicts) {
- int i;
- char * conflict_msg = strdup("conflicts ");
- for (i=0; i<num_conflicts; i++) {
- char * msg1, * msg2;
- char sense = '\0';
- if (conflicts[i].needsFlags & RPMSENSE_SENSEMASK) {
- if (conflicts[i].needsFlags & RPMSENSE_LESS) sense = '<';
- if (conflicts[i].needsFlags & RPMSENSE_GREATER) sense = '>';
- if (conflicts[i].needsFlags & RPMSENSE_EQUAL) sense = '=';
- if (conflicts[i].needsFlags & RPMSENSE_SERIAL) sense = 'S';
- }
- if (sense != '\0')
- msg1 = my_asprintf("%s %c %s", conflicts[i].needsName, sense, conflicts[i].needsVersion);
- else
- msg1 = strdup(conflicts[i].needsName);
- msg2 = my_asprintf("%s %s %s-%s-%s",
- msg1,
- (conflicts[i].sense == RPMDEP_SENSE_REQUIRES) ? _("is needed by") : _("conflicts with"),
- conflicts[i].byName, conflicts[i].byVersion, conflicts[i].byRelease);
- free(msg1);
- msg1 = my_asprintf("%s|%s", conflict_msg, msg2);
- free(msg2);
- free(conflict_msg);
- conflict_msg = msg1;
- }
- if (install_packages_callback(conflict_msg)) {
- free(conflict_msg);
- returnmsg = "";
- goto install_packages_cleanup;
- }
- free(conflict_msg);
- rpmdepFreeConflicts(conflicts, num_conflicts);
- }
-
- if (rpmdepOrder(rpmdep)) {
- returnmsg = _("Error while checking dependencies 2");
- goto install_packages_cleanup;
- }
- if (rpmRunTransactions(rpmdep, rpmRunTransactions_callback, NULL, NULL, &probs, 0, 0)) {
- char * msg;
- int i;
- returnmsg = strdup(_("Problems occurred during installation:\n"));
- for (i = 0; i < probs->numProblems; i++) {
- const char * thispb = rpmProblemString(&(probs->probs[i]));
- msg = my_asprintf("%s%s\n", returnmsg, thispb);
- free(returnmsg);
- returnmsg = msg;
- }
- goto install_packages_cleanup;
- }
-
- rpmdbClose(db);
- return "";
-
- install_packages_cleanup:
- rpmdbClose(db);
- return returnmsg;
-}
-
-
-/************************** Gateway to Perl ****************************/
-
-MODULE = grpmi_rpm PACKAGE = grpmi_rpm
-PROTOTYPES : DISABLE
-
-char *
-init_rcstuff()
- CODE:
- RETVAL = init_rcstuff_();
- OUTPUT:
- RETVAL
-
-char *
-verify_sig(pkg)
-char * pkg
- CODE:
- RETVAL = verify_sig_(pkg);
- OUTPUT:
- RETVAL
-
-char *
-install_packages(callback, ...)
-SV * callback
- PREINIT:
- int i;
- char ** pkgs;
- CODE:
- install_packages_callback_data = callback;
- pkgs = malloc(sizeof(char *) * items);
- for (i=1; i<items; i++)
- pkgs[i-1] = SvPV_nolen(ST(i));
- pkgs[items-1] = NULL;
- RETVAL = install_packages_(pkgs);
- free(pkgs);
- callback = NULL;
- OUTPUT:
- RETVAL
-