RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/lib/ librpm.vers package.c rpm/rpmdb/ Make...

From: Jeff Johnson <jbj@rpm5.org>
Date: Sat 10 Nov 2007 - 20:36:00 CET
Message-Id: <20071110193600.27D3534845A@rpm5.org>
  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:   10-Nov-2007 20:36:00
  Branch: HEAD                             Handle: 2007111019355900

  Added files:
    rpm/rpmdb               rpmwf.c rpmwf.h
  Modified files:
    rpm                     CHANGES
    rpm/lib                 librpm.vers package.c
    rpm/rpmdb               Makefile.am librpmdb.vers pkgio.c

  Log:
    - hotwire -lxar linkage for the moment.
    - add proof-of-concept rpmwf "wrapper format" to rpmdb.
    - move rpmReadHeader from lib/package.c to rpmdb/pkgio.c.

  Summary:
    Revision    Changes     Path
    1.1798      +3  -0      rpm/CHANGES
    1.25        +0  -1      rpm/lib/librpm.vers
    2.181       +0  -98     rpm/lib/package.c
    1.86        +2  -2      rpm/rpmdb/Makefile.am
    1.22        +1  -0      rpm/rpmdb/librpmdb.vers
    1.26        +98 -0      rpm/rpmdb/pkgio.c
    1.1         +375 -0     rpm/rpmdb/rpmwf.c
    1.1         +82 -0      rpm/rpmdb/rpmwf.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1797 -r1.1798 CHANGES
  --- rpm/CHANGES	10 Nov 2007 18:06:41 -0000	1.1797
  +++ rpm/CHANGES	10 Nov 2007 19:35:59 -0000	1.1798
  @@ -1,4 +1,7 @@
   4.5 -> 5.0:
  +    - jbj: hotwire -lxar linkage for the moment.
  +    - jbj: add proof-of-concept rpmwf "wrapper format" to rpmdb.
  +    - jbj: move rpmReadHeader from lib/package.c to rpmdb/pkgio.c.
       - jbj: remove HGE_t casts everywhere.
       - jbj: hmmm, rpm-perl seems to have issues on BIGENDIAN non-int32 retrieves.
       - jbj: use HE_t instead of individual args. dunno HGE_t et al desired ...
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/librpm.vers
  ============================================================================
  $ cvs diff -u -r1.24 -r1.25 librpm.vers
  --- rpm/lib/librpm.vers	9 Nov 2007 21:15:45 -0000	1.24
  +++ rpm/lib/librpm.vers	10 Nov 2007 19:35:59 -0000	1.25
  @@ -250,7 +250,6 @@
       rpmQVKArgs;
       rpmQVSourcePoptTable;
       rpmReadConfigFiles;
  -    rpmReadHeader;
       rpmReadPackageFile;
       rpmReadPackageManifest;
       rpmRollback;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/package.c
  ============================================================================
  $ cvs diff -u -r2.180 -r2.181 package.c
  --- rpm/lib/package.c	10 Nov 2007 18:06:42 -0000	2.180
  +++ rpm/lib/package.c	10 Nov 2007 19:35:59 -0000	2.181
  @@ -82,104 +82,6 @@
       return 0;
   }
   
  -rpmRC rpmReadHeader(rpmts ts, void * _fd, Header *hdrp, const char ** msg)
  -{
  -    FD_t fd = _fd;
  -    char buf[BUFSIZ];
  -    int_32 block[4];
  -    int_32 il;
  -    int_32 dl;
  -    int_32 * ei = NULL;
  -    size_t uc;
  -    unsigned char * b;
  -    size_t nb;
  -    Header h = NULL;
  -    const char * origin = NULL;
  -    rpmRC rc = RPMRC_FAIL;		/* assume failure */
  -    int xx;
  -
  -    buf[0] = '\0';
  -
  -    if (hdrp)
  -	*hdrp = NULL;
  -    if (msg)
  -	*msg = NULL;
  -
  -    memset(block, 0, sizeof(block));
  -    if ((xx = timedRead(fd, (char *)block, sizeof(block))) != sizeof(block)) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("hdr size(%d): BAD, read returned %d\n"), (int)sizeof(block), xx);
  -	goto exit;
  -    }
  -
  -    b = NULL;
  -    nb = 0;
  -    (void) headerGetMagic(NULL, &b, &nb);
  -    if (memcmp(block, b, nb)) {
  -	(void) snprintf(buf, sizeof(buf), _("hdr magic: BAD\n"));
  -	goto exit;
  -    }
  -
  -    il = ntohl(block[2]);
  -    if (hdrchkTags(il)) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("hdr tags: BAD, no. of tags(%d) out of range\n"), il);
  -
  -	goto exit;
  -    }
  -    dl = ntohl(block[3]);
  -    if (hdrchkData(dl)) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("hdr data: BAD, no. of bytes(%d) out of range\n"), dl);
  -	goto exit;
  -    }
  -
  -/*@-sizeoftype@*/
  -    nb = (il * sizeof(struct entryInfo_s)) + dl;
  -/*@=sizeoftype@*/
  -    uc = sizeof(il) + sizeof(dl) + nb;
  -    ei = xmalloc(uc);
  -    ei[0] = block[2];
  -    ei[1] = block[3];
  -    if ((xx = timedRead(fd, (char *)&ei[2], nb)) != nb) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("hdr blob(%u): BAD, read returned %d\n"), (unsigned)nb, xx);
  -	goto exit;
  -    }
  -
  -    /* Sanity check header tags */
  -    rc = headerCheck(ts, ei, uc, msg);
  -    if (rc != RPMRC_OK)
  -	goto exit;
  -
  -    /* OK, blob looks sane, load the header. */
  -    h = headerLoad(ei);
  -    if (h == NULL) {
  -	(void) snprintf(buf, sizeof(buf), _("hdr load: BAD\n"));
  -        goto exit;
  -    }
  -    h->flags |= HEADERFLAG_ALLOCATED;
  -    ei = NULL;	/* XXX will be freed with header */
  -
  -    /* Save the opened path as the header origin. */
  -    origin = fdGetOPath(fd);
  -    if (origin != NULL)
  -	(void) headerSetOrigin(h, origin);
  -    
  -exit:
  -    if (hdrp && h && rc == RPMRC_OK)
  -	*hdrp = headerLink(h);
  -    ei = _free(ei);
  -    h = headerFree(h);
  -
  -    if (msg != NULL && *msg == NULL && buf[0] != '\0') {
  -	buf[sizeof(buf)-1] = '\0';
  -	*msg = xstrdup(buf);
  -    }
  -
  -    return rc;
  -}
  -
   /*@-mods@*/
   rpmRC rpmReadPackageFile(rpmts ts, void * _fd, const char * fn, Header * hdrp)
   {
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.85 -r1.86 Makefile.am
  --- rpm/rpmdb/Makefile.am	8 Nov 2007 15:15:40 -0000	1.85
  +++ rpm/rpmdb/Makefile.am	10 Nov 2007 19:35:59 -0000	1.86
  @@ -41,7 +41,7 @@
   librpmdb_la_SOURCES = \
   	dbconfig.c fprint.c \
   	hdrfmt.c hdrNVR.c header.c header_internal.c legacy.c merge.c \
  -	pkgio.c poptDB.c rpmdb.c \
  +	pkgio.c poptDB.c rpmdb.c rpmwf.c \
   	signature.c tagname.c tagtbl.c
   librpmdb_la_LDFLAGS = -release $(LT_CURRENT).$(LT_REVISION)
   if HAVE_LD_VERSION_SCRIPT
  @@ -55,7 +55,7 @@
   endif
   if ENABLE_BUILD_MAXEXTLIBDEP
   librpmdb_la_LDFLAGS += $(LDFLAGS)
  -librpmdb_la_LIBADD  += $(LIBS)
  +librpmdb_la_LIBADD  += $(LIBS) -lxar
   endif
   librpmdb_la_DEPENDENCIES = $(DBLIBOBJS)
   librpmdb.la: $(librpmdb_la_OBJECTS) $(librpmdb_la_DEPENDENCIES) 
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/librpmdb.vers
  ============================================================================
  $ cvs diff -u -r1.21 -r1.22 librpmdb.vers
  --- rpm/rpmdb/librpmdb.vers	20 Oct 2007 18:52:34 -0000	1.21
  +++ rpm/rpmdb/librpmdb.vers	10 Nov 2007 19:35:59 -0000	1.22
  @@ -84,6 +84,7 @@
       rpmpkgRead;
       rpmpkgSizeof;
       rpmpkgWrite;
  +    rpmReadHeader;
       rpm_mergesort;
       rpmTagTable;
       rpmTagTableSize;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/pkgio.c
  ============================================================================
  $ cvs diff -u -r1.25 -r1.26 pkgio.c
  --- rpm/rpmdb/pkgio.c	10 Nov 2007 18:06:43 -0000	1.25
  +++ rpm/rpmdb/pkgio.c	10 Nov 2007 19:35:59 -0000	1.26
  @@ -1089,6 +1089,104 @@
       return rc;
   }
   
  +rpmRC rpmReadHeader(rpmts ts, void * _fd, Header *hdrp, const char ** msg)
  +{
  +    FD_t fd = _fd;
  +    char buf[BUFSIZ];
  +    int_32 block[4];
  +    int_32 il;
  +    int_32 dl;
  +    int_32 * ei = NULL;
  +    size_t uc;
  +    unsigned char * b;
  +    size_t nb;
  +    Header h = NULL;
  +    const char * origin = NULL;
  +    rpmRC rc = RPMRC_FAIL;		/* assume failure */
  +    int xx;
  +
  +    buf[0] = '\0';
  +
  +    if (hdrp)
  +	*hdrp = NULL;
  +    if (msg)
  +	*msg = NULL;
  +
  +    memset(block, 0, sizeof(block));
  +    if ((xx = timedRead(fd, (char *)block, sizeof(block))) != sizeof(block)) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("hdr size(%d): BAD, read returned %d\n"), (int)sizeof(block), xx);
  +	goto exit;
  +    }
  +
  +    b = NULL;
  +    nb = 0;
  +    (void) headerGetMagic(NULL, &b, &nb);
  +    if (memcmp(block, b, nb)) {
  +	(void) snprintf(buf, sizeof(buf), _("hdr magic: BAD\n"));
  +	goto exit;
  +    }
  +
  +    il = ntohl(block[2]);
  +    if (hdrchkTags(il)) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("hdr tags: BAD, no. of tags(%d) out of range\n"), il);
  +
  +	goto exit;
  +    }
  +    dl = ntohl(block[3]);
  +    if (hdrchkData(dl)) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("hdr data: BAD, no. of bytes(%d) out of range\n"), dl);
  +	goto exit;
  +    }
  +
  +/*@-sizeoftype@*/
  +    nb = (il * sizeof(struct entryInfo_s)) + dl;
  +/*@=sizeoftype@*/
  +    uc = sizeof(il) + sizeof(dl) + nb;
  +    ei = xmalloc(uc);
  +    ei[0] = block[2];
  +    ei[1] = block[3];
  +    if ((xx = timedRead(fd, (char *)&ei[2], nb)) != nb) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("hdr blob(%u): BAD, read returned %d\n"), (unsigned)nb, xx);
  +	goto exit;
  +    }
  +
  +    /* Sanity check header tags */
  +    rc = headerCheck(ts, ei, uc, msg);
  +    if (rc != RPMRC_OK)
  +	goto exit;
  +
  +    /* OK, blob looks sane, load the header. */
  +    h = headerLoad(ei);
  +    if (h == NULL) {
  +	(void) snprintf(buf, sizeof(buf), _("hdr load: BAD\n"));
  +        goto exit;
  +    }
  +    h->flags |= HEADERFLAG_ALLOCATED;
  +    ei = NULL;	/* XXX will be freed with header */
  +
  +    /* Save the opened path as the header origin. */
  +    origin = fdGetOPath(fd);
  +    if (origin != NULL)
  +	(void) headerSetOrigin(h, origin);
  +    
  +exit:
  +    if (hdrp && h && rc == RPMRC_OK)
  +	*hdrp = headerLink(h);
  +    ei = _free(ei);
  +    h = headerFree(h);
  +
  +    if (msg != NULL && *msg == NULL && buf[0] != '\0') {
  +	buf[sizeof(buf)-1] = '\0';
  +	*msg = xstrdup(buf);
  +    }
  +
  +    return rc;
  +}
  +
   /**
    * Read metadata header.
    * @param fd		file handle
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmwf.c
  ============================================================================
  $ cvs diff -u -r0 -r1.1 rpmwf.c
  --- /dev/null	2007-11-10 20:33:00 +0100
  +++ rpmwf.c	2007-11-10 20:36:00 +0100
  @@ -0,0 +1,375 @@
  +
  +#define	RPM2XAR
  +#include "system.h"
  +#include <inttypes.h>
  +#include <xar/xar.h>
  +#include <rpmio.h>
  +#include <rpmlib.h>
  +
  +#define	_RPMWF_INTERNAL
  +#include <rpmwf.h>
  +
  +#include "debug.h"
  +
  +int _rpmwf_debug = 0;
  +
  +rpmRC rpmwfFiniXAR(rpmwf wf)
  +{
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rpmwfFiniXAR(%p)\n", wf);
  +    if (wf->i) {
  +	xar_iter_free(wf->i);
  +	wf->i = NULL;
  +    }
  +    if (wf->x) {
  +	xar_close(wf->x);
  +	wf->x = NULL;
  +    }
  +    return RPMRC_OK;
  +}
  +
  +rpmRC rpmwfInitXAR(rpmwf wf, const char * fn, const char * fmode)
  +{
  +    int flags = ((fmode && *fmode == 'w') ? WRITE : READ);
  +
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rpmwfInitXAR(%p, %s, %s)\n", wf, fn, fmode);
  +    if (fn == NULL)
  +	fn = wf->fn;
  +assert(fn);
  +    
  +    wf->x = xar_open(fn, flags);
  +    if (flags == READ) {
  +	wf->i = xar_iter_new();
  +	wf->first = 1;
  +    }
  +    return RPMRC_OK;
  +}
  +
  +rpmRC rpmwfNextXAR(rpmwf wf)
  +{
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rpmwfNextXAR(%p) first %d\n", wf, wf->first);
  +    if (wf->first) {
  +	wf->f = xar_file_first(wf->x, wf->i);
  +	wf->first = 0;
  +    } else
  +	wf->f = xar_file_next(wf->i);
  +
  +    if (wf->f == NULL)
  +	return RPMRC_NOTFOUND;
  +
  +    return RPMRC_OK;
  +}
  +
  +rpmRC rpmwfPushXAR(rpmwf wf, const char * fn)
  +{
  +    char * b = NULL;
  +    size_t nb = 0;
  +
  +    if (!strcmp(fn, "Lead")) {
  +	b = wf->l;
  +	nb = wf->nl;
  +    } else
  +    if (!strcmp(fn, "Signature")) {
  +	b = wf->s;
  +	nb = wf->ns;
  +    } else
  +    if (!strcmp(fn, "Header")) {
  +	b = wf->h;
  +	nb = wf->nh;
  +    } else
  +    if (!strcmp(fn, "Payload")) {
  +	b = wf->p;
  +	nb = wf->np;
  +    }
  +
  +    if (wf->x && b && nb > 0) {
  +	wf->f = xar_add_frombuffer(wf->x, NULL, fn, b, nb);
  +	if (wf->f == NULL)
  +	    return RPMRC_FAIL;
  +    }
  +    return RPMRC_OK;
  +}
  +
  +rpmRC rpmwfPullXAR(rpmwf wf, const char * fn)
  +{
  +    const char * path = xar_get_path(wf->f);
  +    char * b = NULL;
  +    size_t nb = 0;
  +    rpmRC rc = RPMRC_OK;
  +    int xx;
  +
  +#ifdef	NOTYET
  +    const char * name = NULL;
  +    const char * type = NULL;
  +
  +    xx = xar_prop_get(wf->f, "name", &name);
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** xx %d name %s\n", xx, name);
  +    if (xx || name == NULL)
  +	return RPMRC_NOTFOUND;
  +
  +    xx = xar_prop_get(wf->f, "type", &type);
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** xx %d type %s\n", xx, type);
  +    if (xx || type == NULL || strcmp(type, "file"))
  +	return RPMRC_NOTFOUND;
  +#endif
  +
  +    if (fn == NULL)
  +	fn = path;
  +    else
  +	assert(!strcmp(fn, path));
  +
  +    xx = xar_extract_tobuffersz(wf->x, wf->f, &b, &nb);
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** xx %d %p[%lu]\n", xx, b, (unsigned long)nb);
  +    if (xx || b == NULL || nb == 0)
  +	return RPMRC_NOTFOUND;
  +
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** %s %p[%lu]\n", xar_get_path(wf->f), b, (unsigned long)nb);
  +    if (!strcmp(fn, "Lead")) {
  +	wf->l = b;
  +	wf->nl = nb;
  +    } else
  +    if (!strcmp(fn, "Signature")) {
  +	wf->s = b;
  +	wf->ns = nb;
  +    } else
  +    if (!strcmp(fn, "Header")) {
  +	wf->h = b;
  +	wf->nh = nb;
  +    } else
  +    if (!strcmp(fn, "Payload")) {
  +	wf->p = b;
  +	wf->np = nb;
  +    } else
  +	rc = RPMRC_NOTFOUND;
  +
  +    return rc;
  +}
  +
  +rpmRC rpmwfFiniRPM(rpmwf wf)
  +{
  +    int xx;
  +
  +    if (wf->b && wf->b != (void *)-1) {
  +	xx = munmap(wf->b, wf->nb);
  +	wf->b = NULL;
  +    }
  +    if (wf->fd) {
  +	(void) Fclose(wf->fd);
  +	wf->fd = NULL;
  +    }
  +    return RPMRC_OK;
  +}
  +
  +static size_t hSize(uint_32 *p)
  +{
  +    return (8 + 8 + 16 * ntohl(p[2]) + ntohl(p[3]));
  +}
  +
  +rpmRC rpmwfInitRPM(rpmwf wf, const char * fn, const char * fmode)
  +{
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rpmwfInitRPM(%p, %s, %s)\n", wf, fn, fmode);
  +    if (fn == NULL)
  +	fn = wf->fn;
  +assert(fn);
  +
  +    wf->fd = Fopen(fn, fmode);
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** Fopen(%s, %s) fd %p nb %u\n", fn, fmode, wf->fd, (unsigned)wf->nb);
  +    if (wf->fd == NULL || Ferror(wf->fd)) {
  +	(void) rpmwfFiniRPM(wf);
  +	return RPMRC_NOTFOUND;
  +    }
  +
  +    if (fmode && *fmode == 'r') {
  +	wf->b = mmap(NULL, wf->nb, PROT_READ, MAP_SHARED, Fileno(wf->fd), 0L);
  +
  +	if (wf->b == (void *)-1) {
  +	    wf->b = NULL;
  +	    (void) rpmwfFiniRPM(wf);
  +	    return RPMRC_NOTFOUND;
  +	}
  +
  +	wf->l = wf->b;
  +	wf->nl = 96;
  +
  +	wf->s = wf->l + wf->nl;
  +	wf->ns = hSize((void *)wf->s);
  +	wf->ns += (8 - (wf->ns % 8));	/* padding */
  +
  +	wf->h = wf->s + wf->ns;
  +	wf->nh = hSize((void *)wf->h);
  +
  +	wf->p = wf->h + wf->nh;
  +	wf->np = wf->nb;
  +	wf->np -= wf->nl + wf->ns + wf->nh;
  +    }
  +
  +    return RPMRC_OK;
  +}
  +
  +rpmRC rpmwfPushRPM(rpmwf wf, const char * fn)
  +{
  +    char * b = NULL;
  +    size_t nb = 0;
  +
  +    if (!strcmp(fn, "Lead")) {
  +	b = wf->l;
  +	nb = wf->nl;
  +    } else
  +    if (!strcmp(fn, "Signature")) {
  +	b = wf->s;
  +	nb = wf->ns;
  +    } else
  +    if (!strcmp(fn, "Header")) {
  +	b = wf->h;
  +	nb = wf->nh;
  +    } else
  +    if (!strcmp(fn, "Payload")) {
  +	b = wf->p;
  +	nb = wf->np;
  +    }
  +
  +    if (!(b && nb > 0))
  +	return RPMRC_NOTFOUND;
  +
  +    if (Fwrite(b, 1, nb, wf->fd) != nb)
  +	return RPMRC_FAIL;
  +
  +    return RPMRC_OK;
  +}
  +
  +rpmwf rpmwfFree(rpmwf wf)
  +{
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rpmwfFree(%p)\n", wf);
  +    if (wf) {
  +
  +	if (wf->b == NULL) {
  +	    wf->l = _free(wf->l);
  +	    wf->s = _free(wf->s);
  +	    wf->h = _free(wf->h);
  +	    wf->p = _free(wf->p);
  +	}
  +
  +	(void) rpmwfFiniXAR(wf);
  +	(void) rpmwfFiniRPM(wf);
  +
  +	wf->fn = _free(wf->fn);
  +	wf = _free(wf);
  +    }
  +    return NULL;
  +}
  +
  +rpmwf rpmwfNew(const char * fn)
  +{
  +    struct stat sb, *st = &sb;
  +    rpmwf wf;
  +    int xx;
  +
  +    if ((xx = Stat(fn, st)) < 0)
  +	return NULL;
  +    wf = xcalloc(1, sizeof(*wf));
  +    wf->fn = xstrdup(fn);
  +    wf->nb = st->st_size;
  +
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rpmwfNew(%s) wf %p nb %u\n", wf->fn, wf, (unsigned)wf->nb);
  +    return wf;
  +}
  +
  +rpmwf rdRPM(const char * rpmfn)
  +{
  +    rpmwf wf;
  +    rpmRC rc;
  +
  +    if ((wf = rpmwfNew(rpmfn)) == NULL)
  +	return wf;
  +
  +    if ((rc = rpmwfInitRPM(wf, NULL, "r")) != RPMRC_OK) {
  +	wf = rpmwfFree(wf);
  +	return NULL;
  +    }
  +
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rdRPM(%s) wf %p\n", rpmfn, wf);
  +
  +    return wf;
  +}
  +
  +rpmwf rdXAR(const char * xarfn)
  +{
  +    rpmwf wf;
  +    rpmRC rc;
  +
  +    if ((wf = rpmwfNew(xarfn)) == NULL)
  +	return wf;
  +
  +    if ((rc = rpmwfInitXAR(wf, NULL, "r")) != RPMRC_OK) {
  +	wf = rpmwfFree(wf);
  +	return NULL;
  +    }
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** rdXAR(%s) wf %p\n", xarfn, wf);
  +
  +    while ((rc = rpmwfNextXAR(wf)) == RPMRC_OK) {
  +	rc = rpmwfPullXAR(wf, NULL);
  +    }
  +
  +    (void) rpmwfFiniXAR(wf);
  +    return wf;
  +}
  +
  +rpmRC wrXAR(const char * xarfn, rpmwf wf)
  +{
  +    rpmRC rc;
  +
  +    if ((rc = rpmwfInitXAR(wf, xarfn, "w")) != RPMRC_OK)
  +	goto exit;
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** wrXAR(%s, %p)\n", xarfn, wf);
  +
  +    if ((rc = rpmwfPushXAR(wf, "Lead")) != RPMRC_OK)
  +	goto exit;
  +    if ((rc = rpmwfPushXAR(wf, "Signature")) != RPMRC_OK)
  +	goto exit;
  +    if ((rc = rpmwfPushXAR(wf, "Header")) != RPMRC_OK)
  +	goto exit;
  +    if ((rc = rpmwfPushXAR(wf, "Payload")) != RPMRC_OK)
  +	goto exit;
  +
  +exit:
  +    (void) rpmwfFiniXAR(wf);
  +
  +    return rc;
  +}
  +
  +rpmRC wrRPM(const char * rpmfn, rpmwf wf)
  +{
  +    rpmRC rc;
  +
  +    if ((rc = rpmwfInitRPM(wf, rpmfn, "w")) != RPMRC_OK)
  +	goto exit;
  +if (_rpmwf_debug)
  +fprintf(stderr, "*** wrRPM(%s, %p)\n", rpmfn, wf);
  +
  +    if ((rc = rpmwfPushRPM(wf, "Lead")) != RPMRC_OK)
  +	goto exit;
  +    if ((rc = rpmwfPushRPM(wf, "Signature")) != RPMRC_OK)
  +	goto exit;
  +    if ((rc = rpmwfPushRPM(wf, "Header")) != RPMRC_OK)
  +	goto exit;
  +    if ((rc = rpmwfPushRPM(wf, "Payload")) != RPMRC_OK)
  +	goto exit;
  +
  +exit:
  +    (void) rpmwfFiniRPM(wf);
  +
  +    return rc;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmwf.h
  ============================================================================
  $ cvs diff -u -r0 -r1.1 rpmwf.h
  --- /dev/null	2007-11-10 20:33:00 +0100
  +++ rpmwf.h	2007-11-10 20:36:00 +0100
  @@ -0,0 +1,82 @@
  +#ifndef H_RPMWF
  +#define H_RPMWF
  +
  +/*@unchecked@*/
  +extern int _rpmwf_debug;
  +
  +typedef /*@abstract@*/ struct rpmwf_s * rpmwf;
  +
  +#ifdef	_RPMWF_INTERNAL
  +struct rpmwf_s {
  +    const char * fn;
  +    FD_t fd;
  +    void * b;
  +    size_t nb;
  +    char * l;
  +    size_t nl;
  +    char * s;
  +    size_t ns;
  +    char * h;
  +    size_t nh;
  +    char * p;
  +    size_t np;
  +    xar_t x;
  +    xar_file_t f;
  +    xar_iter_t i;
  +    int first;
  +};
  +#endif
  +
  +
  +#ifdef __cplusplus
  +extern "C" {
  +#endif
  +
  +rpmRC rpmwfFiniXAR(rpmwf wf)
  +	/*@*/;
  +
  +rpmRC rpmwfInitXAR(rpmwf wf, const char * fn, const char * fmode)
  +	/*@*/;
  +
  +rpmRC rpmwfNextXAR(rpmwf wf)
  +	/*@*/;
  +
  +rpmRC rpmwfPushXAR(rpmwf wf, const char * fn)
  +	/*@*/;
  +
  +rpmRC rpmwfPullXAR(rpmwf wf, const char * fn)
  +	/*@*/;
  +
  +rpmRC rpmwfFiniRPM(rpmwf wf)
  +	/*@*/;
  +
  +rpmRC rpmwfInitRPM(rpmwf wf, const char * fn, const char * fmode)
  +	/*@*/;
  +
  +rpmRC rpmwfPushRPM(rpmwf wf, const char * fn)
  +	/*@*/;
  +
  +rpmwf rpmwfFree(rpmwf wf)
  +	/*@*/;
  +
  +rpmwf rpmwfNew(const char * fn)
  +	/*@*/;
  +
  +rpmwf rdRPM(const char * rpmfn)
  +	/*@*/;
  +
  +rpmwf rdXAR(const char * xarfn)
  +	/*@*/;
  +
  +rpmRC wrXAR(const char * xarfn, rpmwf wf)
  +	/*@*/;
  +
  +rpmRC wrRPM(const char * rpmfn, rpmwf wf)
  +	/*@*/;
  +
  +
  +#ifdef __cplusplus
  +}
  +#endif
  +
  +#endif  /* H_RPMWF */
  @@ .
Received on Sat Nov 10 20:36:00 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.