RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: jbj@rpm5.org
Module: rpm Date: 21-Nov-2007 19:21:48
Branch: HEAD Handle: 2007112118214601
Modified files:
rpm CHANGES
rpm/lib rpmchecksig.c
rpm/rpmdb pkgio.c rpmwf.c rpmwf.h
rpm/rpmio librpmio.vers rpmxar.c rpmxar.h
Log:
- switch to using rpmxar instead of rpmwf most everywhere.
Summary:
Revision Changes Path
1.1864 +1 -0 rpm/CHANGES
1.190 +3 -5 rpm/lib/rpmchecksig.c
1.50 +14 -10 rpm/rpmdb/pkgio.c
1.13 +18 -147 rpm/rpmdb/rpmwf.c
1.7 +2 -18 rpm/rpmdb/rpmwf.h
2.18 +4 -2 rpm/rpmio/librpmio.vers
2.2 +62 -33 rpm/rpmio/rpmxar.c
2.2 +42 -4 rpm/rpmio/rpmxar.h
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1863 -r1.1864 CHANGES
--- rpm/CHANGES 21 Nov 2007 15:28:02 -0000 1.1863
+++ rpm/CHANGES 21 Nov 2007 18:21:46 -0000 1.1864
@@ -1,4 +1,5 @@
5.0a2 -> 5.0a3:
+ - jbj: switch to using rpmxar instead of rpmwf most everywhere.
- jbj: stub in rpmio/rpmxar.c xar payload extraction.
- jbj: create rpmWriteHeader with error msg returns.
- jbj: use rpmReadHeader with error msg returns.
@@ .
patch -p0 <<'@@ .'
Index: rpm/lib/rpmchecksig.c
============================================================================
$ cvs diff -u -r1.189 -r1.190 rpmchecksig.c
--- rpm/lib/rpmchecksig.c 20 Nov 2007 21:45:22 -0000 1.189
+++ rpm/lib/rpmchecksig.c 21 Nov 2007 18:21:47 -0000 1.190
@@ -15,9 +15,7 @@
#include "rpmdb.h"
#include "rpmgi.h"
-#ifdef WITH_XAR
-#include "xar.h"
-#endif
+#include <rpmxar.h>
#define _RPMWF_INTERNAL
#include <rpmwf.h>
#include <pkgio.h>
@@ -800,7 +798,7 @@
{ Header h = NULL;
const char item[] = "Header";
const char * msg = NULL;
- rc = rpmpkgRead(item, fd, &h, msg);
+ rc = rpmpkgRead(item, fd, &h, &msg);
if (rc != RPMRC_OK) {
rpmlog(RPMLOG_ERR, "%s: %s: %s\n", fn, item, msg);
msg = _free(msg);
@@ -874,7 +872,7 @@
if (wf != NULL) {
if (dig->md5ctx)
(void) rpmDigestUpdate(dig->md5ctx, wf->h, wf->nh);
- if ((rc = rpmwfNextXAR(wf)) != RPMRC_OK) return rc;
+ if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
if ((rc = rpmwfPullXAR(wf, "Payload")) != RPMRC_OK) return rc;
if (dig->md5ctx)
(void) rpmDigestUpdate(dig->md5ctx, wf->p, wf->np);
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/pkgio.c
============================================================================
$ cvs diff -u -r1.49 -r1.50 pkgio.c
--- rpm/rpmdb/pkgio.c 21 Nov 2007 14:24:35 -0000 1.49
+++ rpm/rpmdb/pkgio.c 21 Nov 2007 18:21:47 -0000 1.50
@@ -26,9 +26,7 @@
#define _RPMTS_INTERNAL
#include "rpmts.h"
-#ifdef WITH_XAR
-#include "xar.h"
-#endif
+#include <rpmxar.h>
#define _RPMWF_INTERNAL
#include <rpmwf.h>
@@ -475,7 +473,7 @@
if (leadp != NULL) *leadp = NULL;
if (wf != NULL) {
- if ((rc = rpmwfNextXAR(wf)) != RPMRC_OK) return rc;
+ if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
if ((rc = rpmwfPullXAR(wf, "Lead")) != RPMRC_OK) return rc;
assert(wf->nl == sizeof(*l));
memcpy(l, wf->l, sizeof(*l));
@@ -652,7 +650,7 @@
memset(block, 0, sizeof(block));
if (wf != NULL) {
- if ((rc = rpmwfNextXAR(wf)) != RPMRC_OK) return rc;
+ if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
if ((rc = rpmwfPullXAR(wf, "Signature")) != RPMRC_OK) return rc;
assert(wf->ns > sizeof(block));
memcpy(block, wf->s, sizeof(block));
@@ -1226,7 +1224,7 @@
memset(block, 0, sizeof(block));
if (wf != NULL) {
- if ((rc = rpmwfNextXAR(wf)) != RPMRC_OK) return rc;
+ if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
if ((rc = rpmwfPullXAR(wf, "Header")) != RPMRC_OK) return rc;
assert(wf->nh > sizeof(block));
memcpy(block, wf->h, sizeof(block));
@@ -1327,14 +1325,18 @@
Header * hdrp = ptr;
Header h = NULL;
rpmRC rc = RPMRC_OK;
+ int xx;
if (msg)
*msg = NULL;
if (wf != NULL) {
- if ((rc = rpmwfNextXAR(wf)) != RPMRC_OK) return rc;
+uint32_t * ei;
+ if ((xx = rpmxarNext(wf->xar)) != 0) return RPMRC_FAIL;
if ((rc = rpmwfPullXAR(wf, "Header")) != RPMRC_OK) return rc;
- h = headerLoad(wf->h);
+ei = (uint32_t *)wf->h;
+fprintf(stderr, "==> Header %p[%u] 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", wf->h, (unsigned) wf->nh, ei[0], ei[1], ei[2], ei[3], ei[4], ei[5]);
+ h = headerLoad(&ei[2]);
if (h == NULL) {
if (msg)
*msg = xstrdup(_("headerLoad failed"));
@@ -1402,10 +1404,12 @@
if (_use_xar) {
rpmwf wf = fdGetWF(fd);
+const char * fn = fdGetOPath(fd);
if (wf == NULL) {
- wf = rpmwfNew(fdGetOPath(fd));
+ wf = rpmwfNew(fn);
fdSetWF(fd, wf);
-if ((rc = rpmwfInitXAR(wf, NULL, "r")) != RPMRC_OK) return rc;
+ wf->xar = rpmxarNew(fn, "r");
+ assert(wf->xar != NULL);
}
assert(wf != NULL);
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/rpmwf.c
============================================================================
$ cvs diff -u -r1.12 -r1.13 rpmwf.c
--- rpm/rpmdb/rpmwf.c 20 Nov 2007 18:44:24 -0000 1.12
+++ rpm/rpmdb/rpmwf.c 21 Nov 2007 18:21:47 -0000 1.13
@@ -1,12 +1,10 @@
-#define RPM2XAR
#include "system.h"
-#ifdef WITH_XAR
-#include "xar.h"
-#endif
+
#include <rpmio.h>
#include <rpmlib.h>
+#include <rpmxar.h>
#define _RPMWF_INTERNAL
#include <rpmwf.h>
@@ -17,84 +15,11 @@
/*@unchecked@*/
int _rpmwf_debug = 0;
-rpmRC rpmwfFiniXAR(rpmwf wf)
-{
-#ifdef WITH_XAR
- int xx;
-#endif
-
-if (_rpmwf_debug)
-fprintf(stderr, "*** rpmwfFiniXAR(%p)\n", wf);
-#ifdef WITH_XAR
-/*@-moduncon@*/
- if (wf->i) {
-/*@-noeffectuncon@*/
- xar_iter_free(wf->i);
-/*@=noeffectuncon@*/
- wf->i = NULL;
- }
- if (wf->x) {
- xx = xar_close(wf->x);
- wf->x = NULL;
- }
- return RPMRC_OK;
-/*@=moduncon@*/
-#else
- return RPMRC_FAIL;
-#endif
-}
-
-rpmRC rpmwfInitXAR(rpmwf wf, const char * fn, const char * fmode)
-{
-#ifdef WITH_XAR
- int flags = ((fmode && *fmode == 'w') ? WRITE : READ);
-#endif
-
-if (_rpmwf_debug)
-fprintf(stderr, "*** rpmwfInitXAR(%p, %s, %s)\n", wf, fn, fmode);
- if (fn == NULL)
- fn = wf->fn;
-assert(fn != NULL);
-
-#ifdef WITH_XAR
-/*@-moduncon@*/
- wf->x = xar_open(fn, flags);
- if (flags == READ) {
- wf->i = xar_iter_new();
- wf->first = 1;
- }
- return RPMRC_OK;
-/*@=moduncon@*/
-#else
- return RPMRC_FAIL;
-#endif
-}
-
-rpmRC rpmwfNextXAR(rpmwf wf)
-{
-if (_rpmwf_debug)
-fprintf(stderr, "*** rpmwfNextXAR(%p) first %d\n", wf, wf->first);
-#ifdef WITH_XAR
-/*@-moduncon@*/
- if (wf->first) {
- wf->f = xar_file_first(wf->x, wf->i);
- wf->first = 0;
- } else
- wf->f = xar_file_next(wf->i);
-/*@=moduncon@*/
-
- if (wf->f == NULL)
- return RPMRC_NOTFOUND;
- return RPMRC_OK;
-#else
- return RPMRC_FAIL;
-#endif
-}
-
rpmRC rpmwfPushXAR(rpmwf wf, const char * fn)
{
char * b = NULL;
size_t nb = 0;
+ int xx;
if (!strcmp(fn, "Lead")) {
b = wf->l;
@@ -113,74 +38,21 @@
nb = wf->np;
}
-#ifdef WITH_XAR
- if (wf->x && b && nb > 0) {
-/*@-moduncon@*/
- wf->f = xar_add_frombuffer(wf->x, NULL, fn, b, nb);
-/*@=moduncon@*/
- if (wf->f == NULL)
- return RPMRC_FAIL;
- }
- return RPMRC_OK;
-#else
- return RPMRC_FAIL;
-#endif
+ xx = rpmxarPush(wf->xar, fn, b, nb);
+ return (xx == 0 ? RPMRC_OK : RPMRC_FAIL);
}
rpmRC rpmwfPullXAR(rpmwf wf, const char * fn)
{
rpmRC rc = RPMRC_OK;
-#ifdef WITH_XAR
-/*@-moduncon@*/
- const char * path = xar_get_path(wf->f);
-/*@=moduncon@*/
-#else
- const char * path = "*** WITHOUT_XAR ***";
-#endif
char * b = NULL;
size_t nb = 0;
- int xx = 1; /* assume failure */
-
-#ifdef NOTYET
- const char * name = NULL;
- const char * type = NULL;
-
-/*@-moduncon@*/
- xx = xar_prop_get(wf->f, "name", &name);
-/*@=moduncon@*/
-if (_rpmwf_debug)
-fprintf(stderr, "*** xx %d name %s\n", xx, name);
- if (xx || name == NULL)
- return RPMRC_NOTFOUND;
-
-/*@-moduncon@*/
- xx = xar_prop_get(wf->f, "type", &type);
-/*@=moduncon@*/
-if (_rpmwf_debug)
-fprintf(stderr, "*** xx %d type %s\n", xx, type);
- if (xx || type == NULL || strcmp(type, "file"))
- return RPMRC_NOTFOUND;
-#endif
+ int xx;
- if (fn == NULL)
- fn = path;
- else
- assert(!strcmp(fn, path));
-
-#ifdef WITH_XAR
-/*@-moduncon@*/
- xx = (int) xar_extract_tobuffersz(wf->x, wf->f, &b, &nb);
-/*@=moduncon@*/
-#endif
-if (_rpmwf_debug)
-fprintf(stderr, "*** xx %d %p[%lu]\n", xx, b, (unsigned long)nb);
- if (xx || b == NULL || nb == 0) {
- path = _free(path);
+ xx = rpmxarPull(wf->xar, fn, &b, &nb);
+ if (xx == 1)
return RPMRC_NOTFOUND;
- }
-if (_rpmwf_debug)
-fprintf(stderr, "*** %s %p[%lu]\n", path, b, (unsigned long)nb);
if (!strcmp(fn, "Lead")) {
wf->l = b;
wf->nl = nb;
@@ -199,7 +71,6 @@
} else
rc = RPMRC_NOTFOUND;
- path = _free(path);
return rc;
}
@@ -341,7 +212,7 @@
/*@=dependenttrans@*/
}
- (void) rpmwfFiniXAR(wf);
+ wf->xar = rpmxarFree(wf->xar);
(void) rpmwfFiniRPM(wf);
wf->fn = _free(wf->fn);
@@ -403,18 +274,18 @@
if ((wf = rpmwfNew(xarfn)) == NULL)
return wf;
- if ((rc = rpmwfInitXAR(wf, NULL, "r")) != RPMRC_OK) {
+ wf->xar = rpmxarNew(wf->fn, "r");
+ if (wf->xar == NULL) {
wf = rpmwfFree(wf);
return NULL;
}
if (_rpmwf_debug)
-fprintf(stderr, "*** rdXAR(%s) wf %p\n", xarfn, wf);
+fprintf(stderr, "*** rdXAR(%s) wf %p xar %p\n", xarfn, wf, wf->xar);
- while ((rc = rpmwfNextXAR(wf)) == RPMRC_OK) {
+ while (rpmxarNext(wf->xar) == 0)
rc = rpmwfPullXAR(wf, NULL);
- }
- (void) rpmwfFiniXAR(wf);
+ wf->xar = rpmxarFree(wf->xar);
return wf;
}
@@ -422,10 +293,11 @@
{
rpmRC rc;
- if ((rc = rpmwfInitXAR(wf, xarfn, "w")) != RPMRC_OK)
- goto exit;
if (_rpmwf_debug)
fprintf(stderr, "*** wrXAR(%s, %p)\n", xarfn, wf);
+ wf->xar = rpmxarNew(xarfn, "w");
+ if (wf->xar == NULL)
+ return RPMRC_FAIL;
if ((rc = rpmwfPushXAR(wf, "Lead")) != RPMRC_OK)
goto exit;
@@ -437,8 +309,7 @@
goto exit;
exit:
- (void) rpmwfFiniXAR(wf);
-
+ wf->xar = rpmxarFree(wf->xar);
return rc;
}
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/rpmwf.h
============================================================================
$ cvs diff -u -r1.6 -r1.7 rpmwf.h
--- rpm/rpmdb/rpmwf.h 20 Nov 2007 18:44:24 -0000 1.6
+++ rpm/rpmdb/rpmwf.h 21 Nov 2007 18:21:47 -0000 1.7
@@ -27,12 +27,8 @@
/*@relnull@*/ /*@dependent@*/
char * p;
size_t np;
-#ifdef WITH_XAR
- xar_t x;
- xar_file_t f;
- xar_iter_t i;
-#endif
- int first;
+/*@relnull@*/
+ void * xar;
/*@refs@*/
int nrefs; /*!< Reference count. */
};
@@ -43,18 +39,6 @@
extern "C" {
#endif
-rpmRC rpmwfFiniXAR(rpmwf wf)
- /*@globals fileSystem @*/
- /*@modifies wf, fileSystem @*/;
-
-rpmRC rpmwfInitXAR(rpmwf wf, const char * fn, const char * fmode)
- /*@globals fileSystem @*/
- /*@modifies wf, fileSystem @*/;
-
-rpmRC rpmwfNextXAR(rpmwf wf)
- /*@globals fileSystem @*/
- /*@modifies wf, fileSystem @*/;
-
rpmRC rpmwfPushXAR(rpmwf wf, const char * fn)
/*@modifies wf @*/;
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/librpmio.vers
============================================================================
$ cvs diff -u -r2.17 -r2.18 librpmio.vers
--- rpm/rpmio/librpmio.vers 21 Nov 2007 15:28:03 -0000 2.17
+++ rpm/rpmio/librpmio.vers 21 Nov 2007 18:21:47 -0000 2.18
@@ -299,11 +299,13 @@
rpmswInit;
rpmswNow;
rpmswSub;
- rpmxarFini;
- rpmxarInit;
+ rpmxarFree;
+ XrpmxarLink;
+ rpmxarNew;
rpmxarNext;
rpmxarPush;
rpmxarPull;
+ XrpmxarUnlink;
Stat;
_Stat;
Symlink;
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmxar.c
============================================================================
$ cvs diff -u -r2.1 -r2.2 rpmxar.c
--- rpm/rpmio/rpmxar.c 21 Nov 2007 15:28:03 -0000 2.1
+++ rpm/rpmio/rpmxar.c 21 Nov 2007 18:21:47 -0000 2.2
@@ -14,43 +14,77 @@
int _xar_debug = 0;
#if defined(WITH_XAR)
-int rpmxarFini(rpmxar xar)
+
+rpmxar XrpmxarUnlink(rpmxar xar, const char * msg, const char * fn, unsigned ln)
{
- int xx;
+ if (xar == NULL) return NULL;
+/*@-modfilesys@*/
+if (_xar_debug && msg != NULL)
+fprintf(stderr, "--> xar %p -- %d %s at %s:%u\n", xar, xar->nrefs, msg, fn, ln);
+/*@=modfilesys@*/
+ xar->nrefs--;
+ return NULL;
+}
-if (_xar_debug)
-fprintf(stderr, "*** rpmxarFini(%p)\n", xar);
-/*@-moduncon@*/
- if (xar->i) {
+rpmxar XrpmxarLink(rpmxar xar, const char * msg, const char * fn, unsigned ln)
+{
+ if (xar == NULL) return NULL;
+ xar->nrefs++;
+
+/*@-modfilesys@*/
+if (_xar_debug && msg != NULL)
+fprintf(stderr, "--> xar %p ++ %d %s at %s:%u\n", xar, xar->nrefs, msg, fn, ln);
+/*@=modfilesys@*/
+
+ /*@-refcounttrans@*/ return xar; /*@=refcounttrans@*/
+}
+
+rpmxar rpmxarFree(rpmxar xar)
+{
+ if (xar) {
+ int xx;
+
+/*@-onlytrans@*/
+ if (xar->nrefs > 1)
+ return rpmxarUnlink(xar, "rpmxarFree");
+
+ if (xar->i) {
/*@-noeffectuncon@*/
- xar_iter_free(xar->i);
+ xar_iter_free(xar->i);
/*@=noeffectuncon@*/
- xar->i = NULL;
- }
- if (xar->x) {
- xx = xar_close(xar->x);
- xar->x = NULL;
+ xar->i = NULL;
+ }
+ if (xar->x) {
+/*@-noeffectuncon@*/
+ xx = xar_close(xar->x);
+/*@=noeffectuncon@*/
+ xar->x = NULL;
+ }
+
+ (void) rpmxarUnlink(xar, "rpmxarFree");
+/*@=onlytrans@*/
+ /*@-refcounttrans -usereleased@*/
+ memset(xar, 0, sizeof(*xar)); /* XXX trash and burn */
+ xar = _free(xar);
+ /*@=refcounttrans =usereleased@*/
}
- return 0;
-/*@=moduncon@*/
+ return NULL;
}
-int rpmxarInit(rpmxar xar, const char * fn, const char * fmode)
+rpmxar rpmxarNew(const char * fn, const char * fmode)
{
+ rpmxar xar = xcalloc(1, sizeof(*xar));
int flags = ((fmode && *fmode == 'w') ? WRITE : READ);
-if (_xar_debug)
-fprintf(stderr, "*** rpmxarInit(%p, %s, %s)\n", xar, fn, fmode);
assert(fn != NULL);
-
/*@-moduncon@*/
xar->x = xar_open(fn, flags);
if (flags == READ) {
xar->i = xar_iter_new();
xar->first = 1;
}
- return 0;
/*@=moduncon@*/
+ return rpmxarLink(xar, "rpmxarNew");
}
int rpmxarNext(rpmxar xar)
@@ -87,32 +121,27 @@
/*@=moduncon@*/
char * b = NULL;
size_t nb = 0;
- int xx;
-
- if (fn == NULL)
- fn = path;
- else
- assert(!strcmp(fn, path));
+ int rc;
-/*@-moduncon@*/
- xx = (int) xar_extract_tobuffersz(xar->x, xar->f, &b, &nb);
-/*@=moduncon@*/
-if (_xar_debug)
-fprintf(stderr, "*** xx %d %p[%lu]\n", xx, b, (unsigned long)nb);
- if (xx || b == NULL || nb == 0) {
+ if (fn != NULL && strcmp(fn, path)) {
path = _free(path);
return 1;
}
+/*@-moduncon@*/
+ rc = (int) xar_extract_tobuffersz(xar->x, xar->f, &b, &nb);
+/*@=moduncon@*/
if (_xar_debug)
-fprintf(stderr, "*** %s %p[%lu]\n", path, b, (unsigned long)nb);
+fprintf(stderr, "*** %s %p[%lu] rc %d\n", path, b, (unsigned long)nb, rc);
+ path = _free(path);
+ if (rc || b == NULL || nb == 0)
+ return 1;
if (bp)
*((char **)bp) = b;
if (nbp)
*nbp = nb;
- path = _free(path);
return 0;
}
#endif
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmxar.h
============================================================================
$ cvs diff -u -r2.1 -r2.2 rpmxar.h
--- rpm/rpmio/rpmxar.h 21 Nov 2007 15:28:03 -0000 2.1
+++ rpm/rpmio/rpmxar.h 21 Nov 2007 18:21:47 -0000 2.2
@@ -21,11 +21,49 @@
extern "C" {
#endif
-int rpmxarFini(rpmxar xar)
- /*@globals fileSystem @*/
- /*@modifies xar, fileSystem @*/;
+/**
+ * Unreference a xar archive instance.
+ * @param xar xar archive
+ * @param msg
+ * @return NULL always
+ */
+/*@unused@*/ /*@null@*/
+rpmxar rpmxarUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmxar xar,
+ /*@null@*/ const char * msg)
+ /*@modifies xar @*/;
+
+/** @todo Remove debugging entry from the ABI. */
+/*@-exportlocal@*/
+/*@null@*/
+rpmxar XrpmxarUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmxar xar,
+ /*@null@*/ const char * msg, const char * fn, unsigned ln)
+ /*@modifies xar @*/;
+/*@=exportlocal@*/
+#define rpmxarUnlink(_xar, _msg) XrpmxarUnlink(_xar, _msg, __FILE__, __LINE__)
+
+/**
+ * Reference a xar archive instance.
+ * @param xar xar archive
+ * @param msg
+ * @return new xar archive reference
+ */
+/*@unused@*/ /*@newref@*/ /*@null@*/
+rpmxar rpmxarLink (/*@null@*/ rpmxar xar, /*@null@*/ const char * msg)
+ /*@modifies xar @*/;
+
+/** @todo Remove debugging entry from the ABI. */
+/*@newref@*/ /*@null@*/
+rpmxar XrpmxarLink (/*@null@*/ rpmxar xar, /*@null@*/ const char * msg,
+ const char * fn, unsigned ln)
+ /*@modifies xar @*/;
+#define rpmxarLink(_xar, _msg) XrpmxarLink(_xar, _msg, __FILE__, __LINE__)
+
+/*@null@*/
+rpmxar rpmxarFree(/*@only@*/ rpmxar xar)
+ /*@modifies xar @*/;
-int rpmxarInit(rpmxar xar, const char * fn, const char * fmode)
+/*@relnull@*/
+rpmxar rpmxarNew(const char * fn, const char * fmode)
/*@globals fileSystem @*/
/*@modifies xar, fileSystem @*/;
@@ .
Received on Wed Nov 21 19:21:48 2007