RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Olivier Thauvin
Root: /v/rpm/cvs Email: nanardon@rpm5.org
Module: rpm Date: 28-Jul-2007 00:31:12
Branch: HEAD Handle: 2007072723311200
Added files:
rpm/perl RPM_Header.xs RPM_Ts.xs
Modified files:
rpm/perl Makefile.PL.in Makefile.am RPM.xs
Log:
- start to split code into several xs
Summary:
Revision Changes Path
1.4 +1 -1 rpm/perl/Makefile.PL.in
1.4 +1 -1 rpm/perl/Makefile.am
1.7 +11 -348 rpm/perl/RPM.xs
1.1 +129 -0 rpm/perl/RPM_Header.xs
1.1 +266 -0 rpm/perl/RPM_Ts.xs
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/perl/Makefile.PL.in
============================================================================
$ cvs diff -u -r1.3 -r1.4 Makefile.PL.in
--- rpm/perl/Makefile.PL.in 27 Jul 2007 21:18:16 -0000 1.3
+++ rpm/perl/Makefile.PL.in 27 Jul 2007 22:31:12 -0000 1.4
@@ -4,7 +4,7 @@
WriteMakefile(
'NAME' => 'RPM',
- 'OBJECT' => 'RPM.o',
+ 'OBJECT' => 'RPM.o RPM_Ts.o',
'VERSION_FROM' => 'RPM.pm', # finds $VERSION
'MAKEFILE'=> 'Makefile.perl',
'LIBS' => ['@LIBS@'], # e.g., '-lm'
@@ .
patch -p0 <<'@@ .'
Index: rpm/perl/Makefile.am
============================================================================
$ cvs diff -u -r1.3 -r1.4 Makefile.am
--- rpm/perl/Makefile.am 27 Jul 2007 21:18:16 -0000 1.3
+++ rpm/perl/Makefile.am 27 Jul 2007 22:31:12 -0000 1.4
@@ -6,7 +6,7 @@
noinst_DATA = .made_mod
-.made_mod: Makefile.perl
+.made_mod: Makefile.perl RPM.xs
$(MAKE) -fMakefile.perl
touch $@
@@ .
patch -p0 <<'@@ .'
Index: rpm/perl/RPM.xs
============================================================================
$ cvs diff -u -r1.6 -r1.7 RPM.xs
--- rpm/perl/RPM.xs 27 Jul 2007 21:30:46 -0000 1.6
+++ rpm/perl/RPM.xs 27 Jul 2007 22:31:12 -0000 1.7
@@ -1,8 +1,18 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#undef Fflush
+#undef Mkdir
+#undef Stat
+
+#if #DYING
#include <stdio.h>
#include <string.h>
#include <utime.h>
-#include <rpmio.h>
+#endif
#include "rpmlib.h"
+#include <rpmio.h>
#include "rpmcli.h"
#include "rpmts.h"
@@ -12,126 +22,6 @@
#include "rpmdb.h"
#include "misc.h"
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-/* Chip, this is somewhat stripped down from the default callback used by
- the rpmcli. It has to be here to insure that we open the pkg again.
- If we don't do this we get segfaults. I also, kept the updating of some
- of the rpmcli static vars, but I may not have needed to do this.
-
- Also, we probably want to give a nice interface such that we could allow
- users of RPM to do their own callback, but that will have to come later.
-*/
-void * _null_callback(
- const void * arg,
- const rpmCallbackType what,
- const unsigned long long amount,
- const unsigned long long total,
- fnpyKey key,
- rpmCallbackData data)
-{
- Header h = (Header) arg;
- char * s;
- int flags = (int) ((long)data);
- void * rc = NULL;
- const char * filename = (const char *)key;
- static FD_t fd = NULL;
- int xx;
-
- /* Code stolen from rpminstall.c and modified */
- switch(what) {
- case RPMCALLBACK_INST_OPEN_FILE:
- if (filename == NULL || filename[0] == '\0')
- return NULL;
- fd = Fopen(filename, "r.ufdio");
- /* FIX: still necessary? */
- if (fd == NULL || Ferror(fd)) {
- fprintf(stderr, "open of %s failed!\n", filename);
- if (fd != NULL) {
- xx = Fclose(fd);
- fd = NULL;
- }
- } else
- fd = fdLink(fd, "persist (showProgress)");
- return (void *)fd;
- break;
-
- case RPMCALLBACK_INST_CLOSE_FILE:
- /* FIX: still necessary? */
- fd = fdFree(fd, "persist (showProgress)");
- if (fd != NULL) {
- xx = Fclose(fd);
- fd = NULL;
- }
- break;
-
- case RPMCALLBACK_INST_START:
- rpmcliHashesCurrent = 0;
- if (h == NULL || !(flags & INSTALL_LABEL))
- break;
- break;
-
- case RPMCALLBACK_TRANS_PROGRESS:
- case RPMCALLBACK_INST_PROGRESS:
- break;
-
- case RPMCALLBACK_TRANS_START:
- rpmcliHashesCurrent = 0;
- rpmcliProgressTotal = 1;
- rpmcliProgressCurrent = 0;
- break;
-
- case RPMCALLBACK_TRANS_STOP:
- rpmcliProgressTotal = rpmcliPackagesTotal;
- rpmcliProgressCurrent = 0;
- break;
-
- case RPMCALLBACK_REPACKAGE_START:
- rpmcliHashesCurrent = 0;
- rpmcliProgressTotal = total;
- rpmcliProgressCurrent = 0;
- break;
-
- case RPMCALLBACK_REPACKAGE_PROGRESS:
- break;
-
- case RPMCALLBACK_REPACKAGE_STOP:
- rpmcliProgressTotal = total;
- rpmcliProgressCurrent = total;
- rpmcliProgressTotal = rpmcliPackagesTotal;
- rpmcliProgressCurrent = 0;
- break;
-
- case RPMCALLBACK_UNINST_PROGRESS:
- break;
- case RPMCALLBACK_UNINST_START:
- break;
- case RPMCALLBACK_UNINST_STOP:
- break;
- case RPMCALLBACK_UNPACK_ERROR:
- break;
- case RPMCALLBACK_CPIO_ERROR:
- break;
- case RPMCALLBACK_UNKNOWN:
- break;
- default:
- break;
- }
-
- return rc;
-}
-
-void
-_populate_header_tags(HV *href)
-{
- int i = 0;
-
- for (i = 0; i < rpmTagTableSize; i++) {
- hv_store(href, rpmTagTable[i].name, strlen(rpmTagTable[i].name), newSViv(rpmTagTable[i].val), 0);
- }
-}
void
_populate_constant(HV *href, char *name, int val)
@@ -369,230 +259,3 @@
rpmdbFreeIterator(i);
-MODULE = RPM PACKAGE = RPM::C::Header
-
-void
-DESTROY(h)
- Header h
- CODE:
- headerFree(h);
-
-void
-tag_by_id(h, tag)
- Header h
- int tag
- PREINIT:
- void *ret = NULL;
- int type;
- int n;
- int ok;
- PPCODE:
- ok = headerGetEntry(h, tag, &type, &ret, &n);
-
- if (!ok) {
- /* nop, empty stack */
- }
- else {
- switch(type)
- {
- case RPM_STRING_ARRAY_TYPE:
- {
- int i;
- char **s;
-
- EXTEND(SP, n);
- s = (char **)ret;
-
- for (i = 0; i < n; i++) {
- PUSHs(sv_2mortal(newSVpv(s[i], 0)));
- }
- }
- break;
- case RPM_STRING_TYPE:
- PUSHs(sv_2mortal(newSVpv((char *)ret, 0)));
- break;
- case RPM_CHAR_TYPE:
- case RPM_INT8_TYPE:
- case RPM_INT16_TYPE:
- case RPM_INT32_TYPE:
- {
- int i;
- int *r;
-
- EXTEND(SP, n);
- r = (int *)ret;
-
- for (i = 0; i < n; i++) {
- PUSHs(sv_2mortal(newSViv(r[i])));
- }
- }
- break;
- default:
- croak("unknown rpm tag type %d", type);
- }
- }
- headerFreeData(ret, type);
-
-int
-_header_compare(h1, h2)
- Header h1
- Header h2
- CODE:
- RETVAL = rpmVersionCompare(h1, h2);
- OUTPUT:
- RETVAL
-
-int
-_header_is_source(h)
- Header h
- CODE:
- RETVAL = headerIsEntry(h, RPMTAG_SOURCEPACKAGE);
- OUTPUT:
- RETVAL
-
-void
-_header_sprintf(h, format)
- Header h
- char * format
- PREINIT:
- char * s;
- PPCODE:
- s = headerSprintf(h, format, rpmTagTable, rpmHeaderFormats, NULL);
- PUSHs(sv_2mortal(newSVpv((char *)s, 0)));
- s = _free(s);
-
-
-MODULE = RPM PACKAGE = RPM::C::Transaction
-
-void
-DESTROY(t)
- rpmts t
- CODE:
- t = rpmtsFree(t);
-
-# XXX: Add relocations some day.
-int
-_add_install(t, h, fn, upgrade)
- rpmts t
- Header h
- char * fn
- int upgrade
- PREINIT:
- rpmRC rc = 0;
- CODE:
- rc = rpmtsAddInstallElement(t, h, (fnpyKey) fn, upgrade, NULL);
- RETVAL = (rc == RPMRC_OK) ? 1 : 0;
- OUTPUT:
- RETVAL
-
-int
-_add_delete(t, h, offset)
- rpmts t
- Header h
- unsigned int offset
- PREINIT:
- rpmRC rc = 0;
- CODE:
- rc = rpmtsAddEraseElement(t, h, offset);
- RETVAL = (rc == RPMRC_OK) ? 1 : 0;
- OUTPUT:
- RETVAL
-
-int
-_element_count(t)
- rpmts t
-PREINIT:
- int ret;
-CODE:
- ret = rpmtsNElements(t);
- RETVAL = ret;
-OUTPUT:
- RETVAL
-
-int
-_close_db(t)
- rpmts t
-PREINIT:
- int ret;
-CODE:
- ret = rpmtsCloseDB(t);
- RETVAL = (ret == 0) ? 1 : 0;
-OUTPUT:
- RETVAL
-
-int
-_check(t)
- rpmts t
-PREINIT:
- int ret;
-CODE:
- ret = rpmtsCheck(t);
- RETVAL = (ret == 0) ? 1 : 0;
-OUTPUT:
- RETVAL
-
-int
-_order(t)
- rpmts t
-PREINIT:
- int ret;
-CODE:
- ret = rpmtsOrder(t);
- /* XXX: May want to do something different here. It actually
- returns the number of non-ordered elements...maybe we
- want this?
- */
- RETVAL = (ret == 0) ? 1 : 0;
-OUTPUT:
- RETVAL
-
-void
-_elements(t, type)
- rpmts t;
- rpmElementType type;
-PREINIT:
- rpmtsi i;
- rpmte te;
- const char * NEVR;
-PPCODE:
- i = rpmtsiInit(t);
- if(i == NULL) {
- printf("Did not get a thing!\n");
- return;
- } else {
- while((te = rpmtsiNext(i, type)) != NULL) {
- NEVR = rpmteNEVR(te);
- XPUSHs(sv_2mortal(newSVpv(NEVR, 0)));
- }
- i = rpmtsiFree(i);
- }
-
-int
-_run(t, ok_probs, prob_filter)
- rpmts t
- rpmprobFilterFlags prob_filter
- PREINIT:
- int i;
- rpmProblem p;
- int ret;
- CODE:
- /* Make sure we could run this transactions */
- ret = rpmtsCheck(t);
- if (ret != 0) {
- RETVAL = 0;
- return;
- }
- ret = rpmtsOrder(t);
- if (ret != 0) {
- RETVAL = 0;
- return;
- }
-
- /* XXX: Should support callbacks eventually */
- (void) rpmtsSetNotifyCallback(t, _null_callback, (void *) ((long)0));
- ret = rpmtsRun(t, NULL, prob_filter);
- RETVAL = (ret == 0) ? 1 : 0;
- OUTPUT:
- RETVAL
-
-
@@ .
patch -p0 <<'@@ .'
Index: rpm/perl/RPM_Header.xs
============================================================================
$ cvs diff -u -r0 -r1.1 RPM_Header.xs
--- /dev/null 2007-07-28 00:31:01 +0200
+++ RPM_Header.xs 2007-07-28 00:31:12 +0200
@@ -0,0 +1,129 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#undef Fflush
+#undef Mkdir
+#undef Stat
+
+#if #DYING
+#include <stdio.h>
+#include <string.h>
+#include <utime.h>
+#endif
+#include "rpmlib.h"
+#include <rpmio.h>
+#include "rpmcli.h"
+
+#include "rpmts.h"
+#include "rpmte.h"
+
+#include "header.h"
+#include "rpmdb.h"
+#include "misc.h"
+
+
+void
+_populate_header_tags(HV *href)
+{
+ int i = 0;
+
+ for (i = 0; i < rpmTagTableSize; i++) {
+ hv_store(href, rpmTagTable[i].name, strlen(rpmTagTable[i].name), newSViv(rpmTagTable[i].val), 0);
+ }
+}
+
+MODULE = RPM_Header PACKAGE = RPM::Header
+
+PROTOTYPES: ENABLE
+
+void
+DESTROY(h)
+ Header h
+ CODE:
+ headerFree(h);
+
+void
+tag_by_id(h, tag)
+ Header h
+ int tag
+ PREINIT:
+ void *ret = NULL;
+ int type;
+ int n;
+ int ok;
+ PPCODE:
+ ok = headerGetEntry(h, tag, &type, &ret, &n);
+
+ if (!ok) {
+ /* nop, empty stack */
+ }
+ else {
+ switch(type)
+ {
+ case RPM_STRING_ARRAY_TYPE:
+ {
+ int i;
+ char **s;
+
+ EXTEND(SP, n);
+ s = (char **)ret;
+
+ for (i = 0; i < n; i++) {
+ PUSHs(sv_2mortal(newSVpv(s[i], 0)));
+ }
+ }
+ break;
+ case RPM_STRING_TYPE:
+ PUSHs(sv_2mortal(newSVpv((char *)ret, 0)));
+ break;
+ case RPM_CHAR_TYPE:
+ case RPM_INT8_TYPE:
+ case RPM_INT16_TYPE:
+ case RPM_INT32_TYPE:
+ {
+ int i;
+ int *r;
+
+ EXTEND(SP, n);
+ r = (int *)ret;
+
+ for (i = 0; i < n; i++) {
+ PUSHs(sv_2mortal(newSViv(r[i])));
+ }
+ }
+ break;
+ default:
+ croak("unknown rpm tag type %d", type);
+ }
+ }
+ headerFreeData(ret, type);
+
+int
+_header_compare(h1, h2)
+ Header h1
+ Header h2
+ CODE:
+ RETVAL = rpmVersionCompare(h1, h2);
+ OUTPUT:
+ RETVAL
+
+int
+_header_is_source(h)
+ Header h
+ CODE:
+ RETVAL = headerIsEntry(h, RPMTAG_SOURCEPACKAGE);
+ OUTPUT:
+ RETVAL
+
+void
+_header_sprintf(h, format)
+ Header h
+ char * format
+ PREINIT:
+ char * s;
+ PPCODE:
+ s = headerSprintf(h, format, rpmTagTable, rpmHeaderFormats, NULL);
+ PUSHs(sv_2mortal(newSVpv((char *)s, 0)));
+ s = _free(s);
+
@@ .
patch -p0 <<'@@ .'
Index: rpm/perl/RPM_Ts.xs
============================================================================
$ cvs diff -u -r0 -r1.1 RPM_Ts.xs
--- /dev/null 2007-07-28 00:31:01 +0200
+++ RPM_Ts.xs 2007-07-28 00:31:12 +0200
@@ -0,0 +1,266 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#undef Fflush
+#undef Mkdir
+#undef Stat
+
+#if #DYING
+#include <stdio.h>
+#include <string.h>
+#include <utime.h>
+#endif
+#include "rpmlib.h"
+#include <rpmio.h>
+#include "rpmcli.h"
+
+#include "rpmts.h"
+#include "rpmte.h"
+
+#include "header.h"
+#include "rpmdb.h"
+#include "misc.h"
+
+
+/* Chip, this is somewhat stripped down from the default callback used by
+ the rpmcli. It has to be here to insure that we open the pkg again.
+ If we don't do this we get segfaults. I also, kept the updating of some
+ of the rpmcli static vars, but I may not have needed to do this.
+
+ Also, we probably want to give a nice interface such that we could allow
+ users of RPM to do their own callback, but that will have to come later.
+*/
+void * _null_callback(
+ const void * arg,
+ const rpmCallbackType what,
+ const unsigned long long amount,
+ const unsigned long long total,
+ fnpyKey key,
+ rpmCallbackData data)
+{
+ Header h = (Header) arg;
+ char * s;
+ int flags = (int) ((long)data);
+ void * rc = NULL;
+ const char * filename = (const char *)key;
+ static FD_t fd = NULL;
+ int xx;
+
+ /* Code stolen from rpminstall.c and modified */
+ switch(what) {
+ case RPMCALLBACK_INST_OPEN_FILE:
+ if (filename == NULL || filename[0] == '\0')
+ return NULL;
+ fd = Fopen(filename, "r.ufdio");
+ /* FIX: still necessary? */
+ if (fd == NULL || Ferror(fd)) {
+ fprintf(stderr, "open of %s failed!\n", filename);
+ if (fd != NULL) {
+ xx = Fclose(fd);
+ fd = NULL;
+ }
+ } else
+ fd = fdLink(fd, "persist (showProgress)");
+ return (void *)fd;
+ break;
+
+ case RPMCALLBACK_INST_CLOSE_FILE:
+ /* FIX: still necessary? */
+ fd = fdFree(fd, "persist (showProgress)");
+ if (fd != NULL) {
+ xx = Fclose(fd);
+ fd = NULL;
+ }
+ break;
+
+ case RPMCALLBACK_INST_START:
+ rpmcliHashesCurrent = 0;
+ if (h == NULL || !(flags & INSTALL_LABEL))
+ break;
+ break;
+
+ case RPMCALLBACK_TRANS_PROGRESS:
+ case RPMCALLBACK_INST_PROGRESS:
+ break;
+
+ case RPMCALLBACK_TRANS_START:
+ rpmcliHashesCurrent = 0;
+ rpmcliProgressTotal = 1;
+ rpmcliProgressCurrent = 0;
+ break;
+
+ case RPMCALLBACK_TRANS_STOP:
+ rpmcliProgressTotal = rpmcliPackagesTotal;
+ rpmcliProgressCurrent = 0;
+ break;
+
+ case RPMCALLBACK_REPACKAGE_START:
+ rpmcliHashesCurrent = 0;
+ rpmcliProgressTotal = total;
+ rpmcliProgressCurrent = 0;
+ break;
+
+ case RPMCALLBACK_REPACKAGE_PROGRESS:
+ break;
+
+ case RPMCALLBACK_REPACKAGE_STOP:
+ rpmcliProgressTotal = total;
+ rpmcliProgressCurrent = total;
+ rpmcliProgressTotal = rpmcliPackagesTotal;
+ rpmcliProgressCurrent = 0;
+ break;
+
+ case RPMCALLBACK_UNINST_PROGRESS:
+ break;
+ case RPMCALLBACK_UNINST_START:
+ break;
+ case RPMCALLBACK_UNINST_STOP:
+ break;
+ case RPMCALLBACK_UNPACK_ERROR:
+ break;
+ case RPMCALLBACK_CPIO_ERROR:
+ break;
+ case RPMCALLBACK_UNKNOWN:
+ break;
+ default:
+ break;
+ }
+
+ return rc;
+}
+
+MODULE = RPM_Ts PACKAGE = RPM::Transaction
+
+void
+DESTROY(t)
+ rpmts t
+ CODE:
+ t = rpmtsFree(t);
+
+# XXX: Add relocations some day.
+int
+_add_install(t, h, fn, upgrade)
+ rpmts t
+ Header h
+ char * fn
+ int upgrade
+ PREINIT:
+ rpmRC rc = 0;
+ CODE:
+ rc = rpmtsAddInstallElement(t, h, (fnpyKey) fn, upgrade, NULL);
+ RETVAL = (rc == RPMRC_OK) ? 1 : 0;
+ OUTPUT:
+ RETVAL
+
+int
+_add_delete(t, h, offset)
+ rpmts t
+ Header h
+ unsigned int offset
+ PREINIT:
+ rpmRC rc = 0;
+ CODE:
+ rc = rpmtsAddEraseElement(t, h, offset);
+ RETVAL = (rc == RPMRC_OK) ? 1 : 0;
+ OUTPUT:
+ RETVAL
+
+int
+_element_count(t)
+ rpmts t
+PREINIT:
+ int ret;
+CODE:
+ ret = rpmtsNElements(t);
+ RETVAL = ret;
+OUTPUT:
+ RETVAL
+
+int
+_close_db(t)
+ rpmts t
+PREINIT:
+ int ret;
+CODE:
+ ret = rpmtsCloseDB(t);
+ RETVAL = (ret == 0) ? 1 : 0;
+OUTPUT:
+ RETVAL
+
+int
+_check(t)
+ rpmts t
+PREINIT:
+ int ret;
+CODE:
+ ret = rpmtsCheck(t);
+ RETVAL = (ret == 0) ? 1 : 0;
+OUTPUT:
+ RETVAL
+
+int
+_order(t)
+ rpmts t
+PREINIT:
+ int ret;
+CODE:
+ ret = rpmtsOrder(t);
+ /* XXX: May want to do something different here. It actually
+ returns the number of non-ordered elements...maybe we
+ want this?
+ */
+ RETVAL = (ret == 0) ? 1 : 0;
+OUTPUT:
+ RETVAL
+
+void
+_elements(t, type)
+ rpmts t;
+ rpmElementType type;
+PREINIT:
+ rpmtsi i;
+ rpmte te;
+ const char * NEVR;
+PPCODE:
+ i = rpmtsiInit(t);
+ if(i == NULL) {
+ printf("Did not get a thing!\n");
+ return;
+ } else {
+ while((te = rpmtsiNext(i, type)) != NULL) {
+ NEVR = rpmteNEVR(te);
+ XPUSHs(sv_2mortal(newSVpv(NEVR, 0)));
+ }
+ i = rpmtsiFree(i);
+ }
+
+int
+_run(t, ok_probs, prob_filter)
+ rpmts t
+ rpmprobFilterFlags prob_filter
+ PREINIT:
+ int i;
+ rpmProblem p;
+ int ret;
+ CODE:
+ /* Make sure we could run this transactions */
+ ret = rpmtsCheck(t);
+ if (ret != 0) {
+ RETVAL = 0;
+ return;
+ }
+ ret = rpmtsOrder(t);
+ if (ret != 0) {
+ RETVAL = 0;
+ return;
+ }
+
+ /* XXX: Should support callbacks eventually */
+ (void) rpmtsSetNotifyCallback(t, _null_callback, (void *) ((long)0));
+ ret = rpmtsRun(t, NULL, prob_filter);
+ RETVAL = (ret == 0) ? 1 : 0;
+ OUTPUT:
+ RETVAL
+
+
@@ .
Received on Sat Jul 28 00:31:12 2007