RPM Community Forums

Mailing List Message of <rpm-devel>

Re: [CVS] RPM: rpm/lib/ Makefile.am misc.c rpmchecksig.c rpmcli.h rpminsta...

From: Jeff Johnson <n3npq@mac.com>
Date: Thu 31 Jul 2008 - 19:15:22 CEST
Message-id: <1382D266-C1A2-434E-A166-3A2A769993BC@mac.com>
This seems to be most of what is needed to always carry glob/fnmatch
in -lrpmio rather than -lrpmmisc.

In -lrpmio (at least on linux) there's a loader map that will prevent  
ABI
symbol collision, not true for -lrpmmisc, so renaming s/glob/rpmglob/  
doesn't seem immediately
necessary. But if non-linux (i.e. w/o loader maps) needs glob(3)  
renamed,
its easy enuf to do that whenever. I'd like to hear the problem  
report before undertaking
a solution for perhaps a non-existent, or minor, problem however ...

 From an API POV, in-tree vs. out-of-tree may need some thought. I've
just checked all occurences of glob(3), and (afaict) all code paths use
Glob(3) and Globfree(3) as they should, glob(3)/globfree(3) should be
using only by Glob(3) and Globfree(3).

I'll add a Fnmatch(3) wrapper to rpmio where/when needed. ATM, only  
rpmmtree and rpmcache
call fnmatch(3) directly, mire is used everywhere else, and tools/*  
has known good -I
include paths.

73 de Jeff

On Jul 31, 2008, at 12:58 PM, Jeff Johnson wrote:

>   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:   31-Jul-2008  
> 18:58:58
>   Branch: HEAD                             Handle: 2008073116585305
>
>   Added files:
>     rpm/lib                 rpmrollback.h
>     rpm/rpmio               fnmatch.c fnmatch.h glob.c glob.h
>   Modified files:
>     rpm                     rpmqv.c system.h
>     rpm/lib                 Makefile.am misc.c rpmchecksig.c rpmcli.h
>                             rpminstall.c rpmrollback.c rpmsx.c rpmts.h
>                             transaction.c verify.c
>     rpm/misc                Makefile.am librpmmisc.c
>     rpm/python              rpmfts-py.c rpmts-py.c
>     rpm/rpmdb               Makefile.am db3.c dbconfig.c fprint.c  
> hdrNVR.c
>                             header.c merge.c poptDB.c rpmdb.c  
> rpmdpkg.c
>                             rpmevr.c
>     rpm/rpmio               Makefile.am mire.c rpmhash.c rpmio.h  
> rpmiotypes.h
>                             rpmmg.c strcasecmp.c stringbuf.c  
> strtolocale.c
>   Removed files:
>     rpm/misc                fnmatch.c fnmatch.h glob.c glob.h
>
>   Log:
>     - jbj: hide FD_t typedef in rpmlib includes several places.
>     - jbj: move glob/fnmatch into -lrpmio from -lrpmmisc.
>     - jbj: bundle ctype(3) inline wrappers in <rpmiotypes.h>, not  
> <rpmio.h>.
>     - jbj: include <rpmiotypes.h> not <rpmio.h> for _free() and rpmRC.
>     - jbj: add rpmrollback.h to remove IDTX prototypes from <rpmcli.h>
>
>   Summary:
>     Revision    Changes     Path
>     2.186       +1  -1      rpm/lib/Makefile.am
>     2.150       +1  -1      rpm/lib/misc.c
>     1.222       +2  -2      rpm/lib/rpmchecksig.c
>     2.87        +7  -117    rpm/lib/rpmcli.h
>     1.212       +3  -0      rpm/lib/rpminstall.c
>     1.37        +2  -0      rpm/lib/rpmrollback.c
>     2.1         +133 -0     rpm/lib/rpmrollback.h
>     2.22        +1  -1      rpm/lib/rpmsx.c
>     2.104       +2  -0      rpm/lib/rpmts.h
>     1.381       +2  -1      rpm/lib/transaction.c
>     2.193       +1  -0      rpm/lib/verify.c
>     1.35        +3  -3      rpm/misc/Makefile.am
>     1.12        +0  -609    rpm/misc/fnmatch.c
>     1.8         +0  -88     rpm/misc/fnmatch.h
>     1.22        +0  -1206   rpm/misc/glob.c
>     1.16        +0  -205    rpm/misc/glob.h
>     1.3         +0  -8      rpm/misc/librpmmisc.c
>     1.22        +1  -1      rpm/python/rpmfts-py.c
>     1.92        +3  -1      rpm/python/rpmts-py.c
>     1.103       +1  -1      rpm/rpmdb/Makefile.am
>     1.90        +0  -1      rpm/rpmdb/db3.c
>     1.54        +1  -2      rpm/rpmdb/dbconfig.c
>     1.29        +1  -1      rpm/rpmdb/fprint.c
>     1.44        +2  -1      rpm/rpmdb/hdrNVR.c
>     1.166       +1  -1      rpm/rpmdb/header.c
>     1.14        +1  -1      rpm/rpmdb/merge.c
>     1.12        +1  -4      rpm/rpmdb/poptDB.c
>     1.256       +1  -1      rpm/rpmdb/rpmdb.c
>     1.4         +1  -1      rpm/rpmdb/rpmdpkg.c
>     1.8         +1  -1      rpm/rpmdb/rpmevr.c
>     1.188       +15 -11     rpm/rpmio/Makefile.am
>     2.1         +609 -0     rpm/rpmio/fnmatch.c
>     2.1         +88 -0      rpm/rpmio/fnmatch.h
>     2.1         +1206 -0    rpm/rpmio/glob.c
>     2.1         +205 -0     rpm/rpmio/glob.h
>     1.44        +1  -1      rpm/rpmio/mire.c
>     1.12        +0  -12     rpm/rpmio/rpmhash.c
>     1.78        +0  -91     rpm/rpmio/rpmio.h
>     1.4         +91 -0      rpm/rpmio/rpmiotypes.h
>     2.8         +1  -1      rpm/rpmio/rpmmg.c
>     2.7         +1  -1      rpm/rpmio/strcasecmp.c
>     2.4         +1  -1      rpm/rpmio/stringbuf.c
>     1.10        +1  -1      rpm/rpmio/strtolocale.c
>     1.150       +1  -0      rpm/rpmqv.c
>     2.113       +2  -2      rpm/system.h
>    
> ______________________________________________________________________ 
> ______
>
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/Makefile.am
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.185 -r2.186 Makefile.am
>   --- rpm/lib/Makefile.am	31 Jul 2008 00:44:15 -0000	2.185
>   +++ rpm/lib/Makefile.am	31 Jul 2008 16:58:53 -0000	2.186
>   @@ -39,7 +39,7 @@
>    	rpmrc.h rpmte.h rpmts.h rpm4compat.h
>    noinst_HEADERS = \
>    	filetriggers.h fs.h fsm.h manifest.h misc.h psm.h rpmal.h \
>   -	rpmfc.h rpmlib.h rpmlock.h rpmluaext.h rpmgi.h rpmsx.h
>   +	rpmfc.h rpmgi.h rpmlib.h rpmlock.h rpmluaext.h rpmrollback.h  
> rpmsx.h
>
>    usrlibdir = $(libdir)
>    usrlib_LTLIBRARIES = librpm.la
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/misc.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.149 -r2.150 misc.c
>   --- rpm/lib/misc.c	30 Jul 2008 22:14:32 -0000	2.149
>   +++ rpm/lib/misc.c	31 Jul 2008 16:58:54 -0000	2.150
>   @@ -7,7 +7,7 @@
>    /* just to put a marker in librpm.a */
>    const char * RPMVERSION = VERSION;
>
>   -#include <rpmio.h>
>   +#include <rpmiotypes.h>
>    #include <rpmlog.h>
>    #include <rpmurl.h>
>    #include <rpmmacro.h>	/* XXX for rpmGetPath */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpmchecksig.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.221 -r1.222 rpmchecksig.c
>   --- rpm/lib/rpmchecksig.c	31 Jul 2008 02:40:06 -0000	1.221
>   +++ rpm/lib/rpmchecksig.c	31 Jul 2008 16:58:54 -0000	1.222
>   @@ -858,11 +858,11 @@
>        return rc;
>    }
>
>   -int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd,
>   -		const char * fn)
>   +int rpmVerifySignatures(QVA_t qva, rpmts ts, void * _fd, const  
> char * fn)
>    {
>        HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
>        HE_t she = memset(alloca(sizeof(*she)), 0, sizeof(*she));
>   +    FD_t fd = (FD_t)_fd;
>        char result[1024];
>        char buf[8192], * b;
>        char missingKeys[7164], * m;
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpmcli.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.86 -r2.87 rpmcli.h
>   --- rpm/lib/rpmcli.h	31 Jul 2008 02:40:06 -0000	2.86
>   +++ rpm/lib/rpmcli.h	31 Jul 2008 16:58:54 -0000	2.87
>   @@ -5,15 +5,13 @@
>     * \file lib/rpmcli.h
>     */
>
>   -#include <rpmtypes.h>
>   -
>    #include <popt.h>
>    #include <rpmmacro.h>
>    #include <rpmtypes.h>
>   -#include "rpmps.h"
>   -#include "rpmrc.h"
>   -#include "rpmfi.h"	/* XXX rpmfileAttrs */
>   -#include "rpmts.h"	/* XXX rpmdepFlags */
>   +#include <rpmps.h>
>   +#include <rpmrc.h>
>   +#include <rpmfi.h>	/* XXX rpmfileAttrs */
>   +#include <rpmts.h>	/* XXX rpmdepFlags */
>
>    /**
>     * Table of query format extensions.
>   @@ -380,13 +378,13 @@
>     * Check package and header signatures.
>     * @param qva		parsed query/verify options
>     * @param ts		transaction set
>   - * @param fd		package file handle
>   + * @param _fd		package file handle
>     * @param fn		package file name
>     * @return		0 on success, 1 on failure
>     */
>   -int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd, const char  
> * fn)
>   +int rpmVerifySignatures(QVA_t qva, rpmts ts, void * _fd, const  
> char * fn)
>    	/*@globals rpmGlobalMacroContext, h_errno, fileSystem,  
> internalState @*/
>   -	/*@modifies qva, ts, fd, rpmGlobalMacroContext, h_errno,
>   +	/*@modifies qva, ts, _fd, rpmGlobalMacroContext, h_errno,
>    		fileSystem, internalState @*/;
>
>    /** \ingroup rpmcli
>   @@ -560,114 +558,6 @@
>    	/*@modifies ts, ia, rpmGlobalMacroContext,
>    		fileSystem, internalState @*/;
>
>   -/**
>   - * A rollback transaction id element.
>   - */
>   -/*@-fielduse@*/
>   -typedef /*@abstract@*/ struct IDT_s * IDT;
>   -#if !defined(SWIG)
>   -struct IDT_s {
>   -    int done;			/*!< package processed? */
>   -    unsigned int instance;	/*!< installed package transaction  
> id. */
>   -/*@owned@*/ /*@null@*/
>   -    const char * key;		/*! removed package file name. */
>   -    Header h;			/*!< removed package header. */
>   -    union {
>   -	rpmuint32_t u32;	/*!< install/remove transaction id */
>   -    } val;
>   -};
>   -#endif
>   -/*@=fielduse@*/
>   -
>   -/**
>   - * A rollback transaction id index.
>   - */
>   -typedef /*@abstract@*/ struct IDTindex_s * IDTX;
>   -#if !defined(SWIG)
>   -struct IDTindex_s {
>   -    int delta;			/*!< no. elements to realloc as a chunk. */
>   -    int size;			/*!< size of id index element. */
>   -    int alloced;		/*!< current number of elements allocated. */
>   -    int nidt;			/*!< current number of elements initialized. */
>   -/*@only@*/ /*@null@*/
>   -    IDT idt;			/*!< id index elements. */
>   -};
>   -#endif
>   -
>   -/**
>   - * Destroy id index.
>   - * @param idtx		id index
>   - * @return		NULL always
>   - */
>   -/*@null@*/
>   -IDTX IDTXfree(/*@only@*/ /*@null@*/ IDTX idtx)
>   -	/*@modifies idtx @*/;
>   -
>   -/**
>   - * Create id index.
>   - * @return		new id index
>   - */
>   -/*@only@*/
>   -IDTX IDTXnew(void)
>   -	/*@*/;
>   -
>   -/**
>   - * Insure that index has room for "need" elements.
>   - * @param idtx		id index
>   - * @param need		additional no. of elements needed
>   - * @return 		id index (with room for "need" elements)
>   - */
>   -/*@only@*/ /*@null@*/
>   -IDTX IDTXgrow(/*@only@*/ /*@null@*/ IDTX idtx, int need)
>   -	/*@modifies idtx @*/;
>   -
>   -/**
>   - * Sort tag (instance,value) pairs.
>   - * @param idtx		id index
>   - * @return 		id index
>   - */
>   -/*@only@*/ /*@null@*/
>   -IDTX IDTXsort(/*@only@*/ /*@null@*/ IDTX idtx)
>   -	/*@modifies idtx @*/;
>   -
>   -/**
>   - * Load tag (instance,value) pairs from rpm databse, and return  
> sorted id index.
>   - * @param ts		transaction set
>   - * @param tag		rpm tag
>   - * @param rbtid		rollback goal
>   - * @return 		id index
>   - */
>   -/*@only@*/ /*@null@*/
>   -IDTX IDTXload(rpmts ts, rpmTag tag, rpmuint32_t rbtid)
>   -	/*@globals rpmGlobalMacroContext, h_errno, fileSystem,  
> internalState @*/
>   -	/*@modifies ts, rpmGlobalMacroContext, fileSystem,  
> internalState  @*/;
>   -
>   -/**
>   - * Load tag (instance,value) pairs from packages, and return  
> sorted id index.
>   - * @param ts		transaction set
>   - * @param globstr	glob expression
>   - * @param tag		rpm tag
>   - * @param rbtid		rollback goal
>   - * @return 		id index
>   - */
>   -/*@only@*/ /*@null@*/
>   -IDTX IDTXglob(rpmts ts, const char * globstr, rpmTag tag,  
> rpmuint32_t rbtid)
>   -	/*@globals rpmGlobalMacroContext, h_errno, fileSystem,  
> internalState @*/
>   -	/*@modifies ts, rpmGlobalMacroContext, fileSystem,  
> internalState @*/;
>   -
>   -/** \ingroup rpmcli
>   - * Rollback transactions, erasing new, reinstalling old, package 
> (s).
>   - * @param ts		transaction set
>   - * @param ia		mode flags and parameters
>   - * @param argv		array of arguments (NULL terminated)
>   - * @return		0 on success
>   - */
>   -int rpmRollback(rpmts ts, QVA_t ia, /*@null@*/ const char ** argv)
>   -	/*@globals rpmcliPackagesTotal, rpmGlobalMacroContext, h_errno,
>   -		fileSystem, internalState @*/
>   -	/*@modifies ts, ia, rpmcliPackagesTotal, rpmGlobalMacroContext,
>   -		fileSystem, internalState @*/;
>   -
>    /** \ingroup rpmcli
>     */
>    /*@unchecked@*/
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpminstall.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.211 -r1.212 rpminstall.c
>   --- rpm/lib/rpminstall.c	31 Jul 2008 02:40:06 -0000	1.211
>   +++ rpm/lib/rpminstall.c	31 Jul 2008 16:58:54 -0000	1.212
>   @@ -24,7 +24,10 @@
>    #include "rpmgi.h"
>
>    #include <rpmlib.h>
>   +
>    #include <rpmcli.h>
>   +#define	_RPMROLLBACK_INTERNAL
>   +#include <rpmrollback.h>
>
>    #include "debug.h"
>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpmrollback.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.36 -r1.37 rpmrollback.c
>   --- rpm/lib/rpmrollback.c	31 Jul 2008 02:40:06 -0000	1.36
>   +++ rpm/lib/rpmrollback.c	31 Jul 2008 16:58:54 -0000	1.37
>   @@ -24,6 +24,8 @@
>    #include "rpmgi.h"		/* XXX rpmgiEscapeSpaces */
>
>    #include <rpmcli.h>
>   +#define	_RPMROLLBACK_INTERNAL
>   +#include <rpmrollback.h>
>
>    #include "debug.h"
>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpmrollback.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r0 -r2.1 rpmrollback.h
>   --- /dev/null	2008-07-31 18:55:00 +0200
>   +++ rpmrollback.h	2008-07-31 18:58:55 +0200
>   @@ -0,0 +1,133 @@
>   +#ifndef H_RPMROLLBACK
>   +#define H_RPMROLLBACK
>   +
>   +/** \ingroup rpmts
>   + * \file lib/rpmrollback.h
>   + *
>   + */
>   +
>   +/**
>   + */
>   +typedef /*@abstract@*/ struct IDT_s * IDT;
>   +
>   +/**
>   + */
>   +typedef /*@abstract@*/ struct IDTindex_s * IDTX;
>   +
>   +#if defined(_RPMROLLBACK_INTERNAL)
>   +/**
>   + * A rollback transaction id element.
>   + */
>   +/*@-fielduse@*/
>   +#if !defined(SWIG)
>   +struct IDT_s {
>   +    int done;			/*!< package processed? */
>   +    unsigned int instance;	/*!< installed package transaction  
> id. */
>   +/*@owned@*/ /*@null@*/
>   +    const char * key;		/*! removed package file name. */
>   +    Header h;			/*!< removed package header. */
>   +    union {
>   +	rpmuint32_t u32;	/*!< install/remove transaction id */
>   +    } val;
>   +};
>   +#endif
>   +/*@=fielduse@*/
>   +
>   +/**
>   + * A rollback transaction id index.
>   + */
>   +#if !defined(SWIG)
>   +struct IDTindex_s {
>   +    int delta;			/*!< no. elements to realloc as a chunk. */
>   +    int size;			/*!< size of id index element. */
>   +    int alloced;		/*!< current number of elements allocated. */
>   +    int nidt;			/*!< current number of elements initialized. */
>   +/*@only@*/ /*@null@*/
>   +    IDT idt;			/*!< id index elements. */
>   +};
>   +#endif
>   +#endif
>   +
>   +#ifdef __cplusplus
>   +extern "C" {
>   +#endif
>   +
>   +/**
>   + * Destroy id index.
>   + * @param idtx		id index
>   + * @return		NULL always
>   + */
>   +/*@null@*/
>   +IDTX IDTXfree(/*@only@*/ /*@null@*/ IDTX idtx)
>   +	/*@modifies idtx @*/;
>   +
>   +/**
>   + * Create id index.
>   + * @return		new id index
>   + */
>   +/*@only@*/
>   +IDTX IDTXnew(void)
>   +	/*@*/;
>   +
>   +/**
>   + * Insure that index has room for "need" elements.
>   + * @param idtx		id index
>   + * @param need		additional no. of elements needed
>   + * @return 		id index (with room for "need" elements)
>   + */
>   +/*@only@*/ /*@null@*/
>   +IDTX IDTXgrow(/*@only@*/ /*@null@*/ IDTX idtx, int need)
>   +	/*@modifies idtx @*/;
>   +
>   +/**
>   + * Sort tag (instance,value) pairs.
>   + * @param idtx		id index
>   + * @return 		id index
>   + */
>   +/*@only@*/ /*@null@*/
>   +IDTX IDTXsort(/*@only@*/ /*@null@*/ IDTX idtx)
>   +	/*@modifies idtx @*/;
>   +
>   +/**
>   + * Load tag (instance,value) pairs from rpm databse, and return  
> sorted id index.
>   + * @param ts		transaction set
>   + * @param tag		rpm tag
>   + * @param rbtid		rollback goal
>   + * @return 		id index
>   + */
>   +/*@only@*/ /*@null@*/
>   +IDTX IDTXload(rpmts ts, rpmTag tag, rpmuint32_t rbtid)
>   +	/*@globals rpmGlobalMacroContext, h_errno, fileSystem,  
> internalState @*/
>   +	/*@modifies ts, rpmGlobalMacroContext, fileSystem,  
> internalState  @*/;
>   +
>   +/**
>   + * Load tag (instance,value) pairs from packages, and return  
> sorted id index.
>   + * @param ts		transaction set
>   + * @param globstr	glob expression
>   + * @param tag		rpm tag
>   + * @param rbtid		rollback goal
>   + * @return 		id index
>   + */
>   +/*@only@*/ /*@null@*/
>   +IDTX IDTXglob(rpmts ts, const char * globstr, rpmTag tag,  
> rpmuint32_t rbtid)
>   +	/*@globals rpmGlobalMacroContext, h_errno, fileSystem,  
> internalState @*/
>   +	/*@modifies ts, rpmGlobalMacroContext, fileSystem,  
> internalState @*/;
>   +
>   +/** \ingroup rpmcli
>   + * Rollback transactions, erasing new, reinstalling old, package 
> (s).
>   + * @param ts		transaction set
>   + * @param ia		mode flags and parameters
>   + * @param argv		array of arguments (NULL terminated)
>   + * @return		0 on success
>   + */
>   +int rpmRollback(rpmts ts, QVA_t ia, /*@null@*/ const char ** argv)
>   +	/*@globals rpmcliPackagesTotal, rpmGlobalMacroContext, h_errno,
>   +		fileSystem, internalState @*/
>   +	/*@modifies ts, ia, rpmcliPackagesTotal, rpmGlobalMacroContext,
>   +		fileSystem, internalState @*/;
>   +
>   +#ifdef __cplusplus
>   +}
>   +#endif
>   +
>   +#endif  /* H_RPMROLLBACK */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpmsx.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.21 -r2.22 rpmsx.c
>   --- rpm/lib/rpmsx.c	30 Jul 2008 22:14:33 -0000	2.21
>   +++ rpm/lib/rpmsx.c	31 Jul 2008 16:58:54 -0000	2.22
>   @@ -3,7 +3,7 @@
>     */
>    #include "system.h"
>
>   -#include <rpmio.h>
>   +#include <rpmiotypes.h>
>    #include <rpmmacro.h>	/* for rpmGetPath() */
>
>    #include <rpmtypes.h>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/rpmts.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.103 -r2.104 rpmts.h
>   --- rpm/lib/rpmts.h	31 Jul 2008 02:40:06 -0000	2.103
>   +++ rpm/lib/rpmts.h	31 Jul 2008 16:58:54 -0000	2.104
>   @@ -718,6 +718,7 @@
>    void rpmtsSetCurrDir(rpmts ts, /*@null@*/ const char * currDir)
>    	/*@modifies ts @*/;
>
>   +#if defined(_RPMTS_INTERNAL)	/* XXX avoid FD_t in API. */
>    /** \ingroup rpmts
>     * Get transaction script file handle, i.e. stdout/stderr on  
> scriptlet execution
>     * @param ts		transaction set
>   @@ -735,6 +736,7 @@
>    void rpmtsSetScriptFd(rpmts ts, /*@null@*/ FD_t scriptFd)
>    	/*@globals fileSystem @*/
>    	/*@modifies ts, scriptFd, fileSystem @*/;
>   +#endif
>
>    /** \ingroup rpmts
>     * Get selinuxEnabled flag, i.e. is SE linux enabled?
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/transaction.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.380 -r1.381 transaction.c
>   --- rpm/lib/transaction.c	31 Jul 2008 02:40:06 -0000	1.380
>   +++ rpm/lib/transaction.c	31 Jul 2008 16:58:54 -0000	1.381
>   @@ -38,7 +38,8 @@
>
>    #include "filetriggers.h" /* XXX  
> mayAddToFilesAwaitingFiletriggers, rpmRunFileTriggers */
>
>   -#include "rpmcli.h"	/* IDTX prototypes */
>   +#include <rpmcli.h>	/* XXX QVA_t INSTALL_FOO flags */
>   +#include <rpmrollback.h>	/* IDTX prototypes */
>
>    #include "debug.h"
>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/lib/verify.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r2.192 -r2.193 verify.c
>   --- rpm/lib/verify.c	31 Jul 2008 02:40:06 -0000	2.192
>   +++ rpm/lib/verify.c	31 Jul 2008 16:58:54 -0000	2.193
>   @@ -21,6 +21,7 @@
>    #include "legacy.h"	/* XXX dodigest(), uidToUname(), gnameToGid */
>
>    #define	_RPMPS_INTERNAL	/* XXX rpmps needs iterator. */
>   +#define	_RPMTS_INTERNAL	/* XXX expose rpmtsSetScriptFd */
>    #include <rpmcli.h>
>
>    #include "debug.h"
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/misc/Makefile.am
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.34 -r1.35 Makefile.am
>   --- rpm/misc/Makefile.am	28 Jul 2008 14:35:26 -0000	1.34
>   +++ rpm/misc/Makefile.am	31 Jul 2008 16:58:55 -0000	1.35
>   @@ -9,8 +9,8 @@
>    EXTRA_DIST = \
>    	librpmmisc.vers asprintf.h \
>    	alloca.c	basename.c	err.c		error.c		\
>   -	fakefork.c	fnmatch.c	getcwd.c	getmntent.c	\
>   -	getwd.c		glob.c				memcmp.c	\
>   +	fakefork.c			getcwd.c	getmntent.c	\
>   +	getwd.c						memcmp.c	\
>    	mktime.c	myrealloc.c	putenv.c	realpath.c	\
>    	setenv.c	stpcpy.c	stpncpy.c			\
>    			strcspn.c	strdup.c	strerror.c	\
>   @@ -18,7 +18,7 @@
>    	strtoul.c
>
>    noinst_HEADERS = \
>   -	err.h		error.h		fnmatch.h	glob.h		
>   +	err.h		error.h
>
>    usrlibdir = $(libdir)
>    usrlib_LTLIBRARIES = librpmmisc.la
>   @@ .
>   rm -f rpm/misc/fnmatch.c <<'@@ .'
>   Index: rpm/misc/fnmatch.c
>    
> ====================================================================== 
> ======
>   [NO CHANGE SUMMARY BECAUSE FILE AS A WHOLE IS JUST REMOVED]
>   @@ .
>   rm -f rpm/misc/fnmatch.h <<'@@ .'
>   Index: rpm/misc/fnmatch.h
>    
> ====================================================================== 
> ======
>   [NO CHANGE SUMMARY BECAUSE FILE AS A WHOLE IS JUST REMOVED]
>   @@ .
>   rm -f rpm/misc/glob.c <<'@@ .'
>   Index: rpm/misc/glob.c
>    
> ====================================================================== 
> ======
>   [NO CHANGE SUMMARY BECAUSE FILE AS A WHOLE IS JUST REMOVED]
>   @@ .
>   rm -f rpm/misc/glob.h <<'@@ .'
>   Index: rpm/misc/glob.h
>    
> ====================================================================== 
> ======
>   [NO CHANGE SUMMARY BECAUSE FILE AS A WHOLE IS JUST REMOVED]
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/misc/librpmmisc.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.2 -r1.3 librpmmisc.c
>   --- rpm/misc/librpmmisc.c	14 Dec 2007 13:03:11 -0000	1.2
>   +++ rpm/misc/librpmmisc.c	31 Jul 2008 16:58:55 -0000	1.3
>   @@ -67,11 +67,3 @@
>    #if !defined(HAVE_STRSTR)
>    #include "strstr.c"
>    #endif
>   -
>   -#include "fnmatch.h"
>   -#include "fnmatch.c"
>   -#ifndef __CYGWIN__
>   -#include "glob.h"
>   -#include "glob.c"
>   -#endif
>   -
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/python/rpmfts-py.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.21 -r1.22 rpmfts-py.c
>   --- rpm/python/rpmfts-py.c	18 Jul 2008 00:17:23 -0000	1.21
>   +++ rpm/python/rpmfts-py.c	31 Jul 2008 16:58:56 -0000	1.22
>   @@ -15,7 +15,7 @@
>
>    #include "rpmfts-py.h"
>
>   -#include <rpmio.h>	/* XXX _free */
>   +#include <rpmiotypes.h>
>
>    #include "debug.h"
>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/python/rpmts-py.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.91 -r1.92 rpmts-py.c
>   --- rpm/python/rpmts-py.c	30 Jul 2008 22:14:35 -0000	1.91
>   +++ rpm/python/rpmts-py.c	31 Jul 2008 16:58:56 -0000	1.92
>   @@ -15,10 +15,12 @@
>    #include <pkgio.h>		/* XXX headerCheck() */
>    #include <rpmdb.h>
>
>   +#define	_RPMTS_INTERNAL		/* XXX expose rpmtsSetScriptFd */
>    #include <rpmbuild.h>
>
>   -#include <rpmlib.h>	/* XXX rpmReadPackageFile */
>    #include <rpmcli.h>
>   +#define	_RPMROLLBACK_INTERNAL	/* XXX IDTX et al */
>   +#include <rpmrollback.h>
>
>    #include "header-py.h"
>    #include "rpmds-py.h"	/* XXX for rpmdsNew */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/Makefile.am
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.102 -r1.103 Makefile.am
>   --- rpm/rpmdb/Makefile.am	31 Jul 2008 00:44:15 -0000	1.102
>   +++ rpm/rpmdb/Makefile.am	31 Jul 2008 16:58:56 -0000	1.103
>   @@ -30,7 +30,7 @@
>    tjfn_LDADD = librpmdb.la
>
>    pkgincdir = $(pkgincludedir)$(WITH_PATH_VERSIONED_SUFFIX)
>   -pkginc_HEADERS = pkgio.h rpmdb.h rpmevr.h rpmtag.h
>   +pkginc_HEADERS = pkgio.h rpmdb.h rpmevr.h rpmtag.h rpmtypes.h
>    noinst_HEADERS = \
>    	fprint.h header_internal.h legacy.h rpmdpkg.h rpmns.h \
>    	rpmtd.h rpmwf.h signature.h
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/db3.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.89 -r1.90 db3.c
>   --- rpm/rpmdb/db3.c	31 Jul 2008 02:40:08 -0000	1.89
>   +++ rpm/rpmdb/db3.c	31 Jul 2008 16:58:56 -0000	1.90
>   @@ -12,7 +12,6 @@
>    #include <sys/ipc.h>
>    #endif
>
>   -#include <rpmio.h>
>    #include <rpmlog.h>
>    #include <rpmmacro.h>
>    #include <rpmurl.h>	/* XXX urlPath proto */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/dbconfig.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.53 -r1.54 dbconfig.c
>   --- rpm/rpmdb/dbconfig.c	31 Jul 2008 02:40:08 -0000	1.53
>   +++ rpm/rpmdb/dbconfig.c	31 Jul 2008 16:58:56 -0000	1.54
>   @@ -5,11 +5,10 @@
>    #include "system.h"
>
>    #include <popt.h>
>   -#include <rpmtag.h>
>   -#include <rpmio.h>
>    #include <rpmlog.h>
>    #include <rpmmacro.h>
>
>   +#include <rpmtag.h>
>    #define	_RPMDB_INTERNAL
>    #include "rpmdb.h"
>    #include "debug.h"
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/fprint.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.28 -r1.29 fprint.c
>   --- rpm/rpmdb/fprint.c	31 Jul 2008 02:40:08 -0000	1.28
>   +++ rpm/rpmdb/fprint.c	31 Jul 2008 16:58:56 -0000	1.29
>   @@ -4,7 +4,7 @@
>
>    #include "system.h"
>
>   -#include <rpmio.h>	/* XXX rpmRC codes. */
>   +#include <rpmiotypes.h>	/* XXX rpmRC codes. */
>    #include <rpmmacro.h>	/* XXX for rpmCleanPath */
>    #include <rpmtag.h>
>    #include <rpmdb.h>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/hdrNVR.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.43 -r1.44 hdrNVR.c
>   --- rpm/rpmdb/hdrNVR.c	31 Jul 2008 02:40:08 -0000	1.43
>   +++ rpm/rpmdb/hdrNVR.c	31 Jul 2008 16:58:56 -0000	1.44
>   @@ -3,7 +3,8 @@
>     */
>
>    #include "system.h"
>   -#include <rpmio.h>
>   +
>   +#include <rpmiotypes.h>
>    #include <rpmmacro.h>
>
>    #define	_RPMTAG_INTERNAL
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/header.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.165 -r1.166 header.c
>   --- rpm/rpmdb/header.c	31 Jul 2008 02:40:08 -0000	1.165
>   +++ rpm/rpmdb/header.c	31 Jul 2008 16:58:56 -0000	1.166
>   @@ -10,7 +10,7 @@
>
>    #include "system.h"
>
>   -#include <rpmio.h>
>   +#include <rpmiotypes.h>
>    #define	_RPMTAG_INTERNAL
>    #include <header_internal.h>
>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/merge.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.13 -r1.14 merge.c
>   --- rpm/rpmdb/merge.c	30 Jul 2008 22:14:36 -0000	1.13
>   +++ rpm/rpmdb/merge.c	31 Jul 2008 16:58:56 -0000	1.14
>   @@ -55,7 +55,7 @@
>
>    #include "system.h"
>
>   -#include <rpmio.h>	/* XXX rpmRC returns. */
>   +#include <rpmiotypes.h>
>    #include <rpmtag.h>
>    #include <rpmdb.h>
>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/poptDB.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.11 -r1.12 poptDB.c
>   --- rpm/rpmdb/poptDB.c	31 Jul 2008 00:21:42 -0000	1.11
>   +++ rpm/rpmdb/poptDB.c	31 Jul 2008 16:58:56 -0000	1.12
>   @@ -5,12 +5,9 @@
>
>    #include "system.h"
>
>   -#include <rpmio.h>
>   -#include <rpmiotypes.h>		/* XXX fnpyKey */
>   +#include <rpmiotypes.h>
>    #include <rpmtag.h>
>    #include <rpmtypes.h>
>   -#include <rpmfi.h>
>   -#include <rpmts.h>
>    #include <rpmcli.h>
>
>    #include "debug.h"
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/rpmdb.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.255 -r1.256 rpmdb.c
>   --- rpm/rpmdb/rpmdb.c	31 Jul 2008 02:40:08 -0000	1.255
>   +++ rpm/rpmdb/rpmdb.c	31 Jul 2008 16:58:56 -0000	1.256
>   @@ -8,7 +8,7 @@
>
>    #include <sys/file.h>
>
>   -#include <rpmio.h>
>   +#include <rpmiotypes.h>
>    #include <rpmlog.h>
>    #include <rpmpgp.h>
>    #include <rpmurl.h>
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/rpmdpkg.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.3 -r1.4 rpmdpkg.c
>   --- rpm/rpmdb/rpmdpkg.c	30 Jul 2008 22:14:36 -0000	1.3
>   +++ rpm/rpmdb/rpmdpkg.c	31 Jul 2008 16:58:56 -0000	1.4
>   @@ -3,7 +3,7 @@
>     */
>    #include "system.h"
>
>   -#include <rpmio.h>
>   +#include <rpmiotypes.h>
>    #include <rpmtag.h>
>
>    #define	_RPMEVR_INTERNAL
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmdb/rpmevr.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.7 -r1.8 rpmevr.c
>   --- rpm/rpmdb/rpmevr.c	31 Jul 2008 02:40:08 -0000	1.7
>   +++ rpm/rpmdb/rpmevr.c	31 Jul 2008 16:58:56 -0000	1.8
>   @@ -3,7 +3,7 @@
>     */
>    #include "system.h"
>
>   -#include <rpmio.h>
>   +#include <rpmiotypes.h>
>
>    #include <rpmtag.h>
>    #define	_RPMEVR_INTERNAL
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/Makefile.am
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.187 -r1.188 Makefile.am
>   --- rpm/rpmio/Makefile.am	31 Jul 2008 00:21:43 -0000	1.187
>   +++ rpm/rpmio/Makefile.am	31 Jul 2008 16:58:57 -0000	1.188
>   @@ -57,25 +57,29 @@
>
>    pkgincdir = $(pkgincludedir)$(WITH_PATH_VERSIONED_SUFFIX)
>    pkginc_HEADERS = \
>   -	rpmcb.h rpmio.h rpmiotypes.h rpmkeyring.h rpmlog.h rpmmacro.h  
> rpmpgp.h
>   +	rpmcb.h rpmio.h rpmiotypes.h rpmmacro.h rpmpgp.h
>    noinst_HEADERS = \
>   -	argv.h ar.h cpio.h envvar.h fts.h iosm.h md2.h md4.h mire.h  
> poptIO.h \
>   -	rmd128.h rmd160.h rmd256.h rmd320.h sha224.h \
>   -	salsa10.h salsa20.h tar.h tiger.h rpmbc.h rpmdav.h rpmgc.h  
> rpmhash.h \
>   -	rpmhook.h rpmio_internal.h rpmlua.h rpmmg.h rpmnss.h rpmsq.h  
> rpmssl.h \
>   -	rpmio-stub.h rpmsw.h rpmurl.h rpmuuid.h rpmxar.h stringbuf.h  
> ugid.h
>   +	argv.h ar.h cpio.h envvar.h fnmatch.h fts.h glob.h iosm.h \
>   +	md2.h md4.h rmd128.h rmd160.h rmd256.h rmd320.h sha224.h \
>   +	salsa10.h salsa20.h tiger.h \
>   +	mire.h poptIO.h rpmbc.h rpmdav.h \
>   +	rpmgc.h rpmhash.h rpmhook.h rpmio_internal.h rpmkeyring.h \
>   +	rpmlog.h rpmlua.h rpmmg.h rpmnss.h rpmsq.h rpmssl.h \
>   +	rpmio-stub.h rpmsw.h rpmurl.h rpmuuid.h rpmxar.h \
>   +	stringbuf.h tar.h ugid.h
>
>    usrlibdir = $(libdir)
>    usrlib_LTLIBRARIES = librpmio.la
>    librpmio_la_SOURCES = \
>   -	ar.c argv.c bzdio.c cpio.c digest.c fts.c getdate.c getpass.c \
>   -	gzdio.c iosm.c lzdio.c macro.c mire.c mount.c \
>   -	md2.c md4.c poptIO.c rmd128.c rmd160.c rmd256.c rmd320.c  
> sha224.c \
>   +	ar.c argv.c bzdio.c cpio.c digest.c fnmatch.c fts.c \
>   +	getdate.c getpass.c gzdio.c glob.c iosm.c lzdio.c \
>   +	macro.c mire.c mount.c poptIO.c \
>   +	md2.c md4.c rmd128.c rmd160.c rmd256.c rmd320.c sha224.c \
>    	salsa10.c salsa20.c tiger.c \
>    	rpmbc.c rpmdav.c rpmgc.c rpmhash.c rpmhook.c rpmio.c rpmio- 
> stub.c \
>    	rpmkeyring.c rpmlog.c rpmlua.c rpmmalloc.c rpmmg.c rpmnss.c  
> rpmpgp.c \
>   -	rpmrpc.c rpmsq.c rpmssl.c rpmsw.c rpmxar.c \
>   -	strcasecmp.c stringbuf.c strtolocale.c tar.c url.c ugid.c  
> rpmuuid.c
>   +	rpmrpc.c rpmsq.c rpmssl.c rpmsw.c rpmuuid.c rpmxar.c \
>   +	strcasecmp.c stringbuf.c strtolocale.c tar.c url.c ugid.c
>    librpmio_la_LDFLAGS = -release $(LT_CURRENT).$(LT_REVISION)
>    if HAVE_LD_VERSION_SCRIPT
>    librpmio_la_LDFLAGS += -Wl,--version-script=$(srcdir)/librpmio.vers
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/fnmatch.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r0 -r2.1 fnmatch.c
>   --- /dev/null	2008-07-31 18:55:00 +0200
>   +++ fnmatch.c	2008-07-31 18:58:58 +0200
>   @@ -0,0 +1,609 @@
>   +/*@-bounds@*/
>   +/*@-retalias@*/
>   +/*@-shiftimplementation@*/
>   +/*@-temptrans@*/
>   +/*@-unreachable@*/
>   +/* Copyright (C) 1991-1993, 1996-1999, 2000 Free Software  
> Foundation, Inc.
>   +   This file is part of the GNU C Library.
>   +
>   +   This library is free software; you can redistribute it and/or
>   +   modify it under the terms of the GNU Library General Public  
> License as
>   +   published by the Free Software Foundation; either version 2  
> of the
>   +   License, or (at your option) any later version.
>   +
>   +   This library 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
>   +   Library General Public License for more details.
>   +
>   +   You should have received a copy of the GNU Library General  
> Public
>   +   License along with this library; see the file COPYING.LIB.   
> If not,
>   +   write to the Free Software Foundation, Inc., 59 Temple Place  
> - Suite 330,
>   +   Boston, MA 02111-1307, USA.  */
>   +
>   +# include "system.h"
>   +
>   +/* Find the first occurrence of C in S or the final NUL byte.  */
>   +static inline char *
>   +internal__strchrnul (const char *s, int c)
>   +{
>   +  const unsigned char *char_ptr;
>   +  const unsigned long int *longword_ptr;
>   +  unsigned long int longword, magic_bits, charmask;
>   +
>   +  c = (unsigned char) c;
>   +
>   +  /* Handle the first few characters by reading one character at  
> a time.
>   +     Do this until CHAR_PTR is aligned on a longword boundary.  */
>   +  for (char_ptr = (const unsigned char *)s; ((unsigned long int)  
> char_ptr
>   +		      & (sizeof (longword) - 1)) != 0;
>   +       ++char_ptr)
>   +    if (*char_ptr == c || *char_ptr == '\0')
>   +      return (void *) char_ptr;
>   +
>   +  /* All these elucidatory comments refer to 4-byte longwords,
>   +     but the theory applies equally well to 8-byte longwords.  */
>   +
>   +  longword_ptr = (unsigned long int *) char_ptr;
>   +
>   +  /* Bits 31, 24, 16, and 8 of this number are zero.  Call these  
> bits
>   +     the "holes."  Note that there is a hole just to the left of
>   +     each byte, with an extra at the end:
>   +
>   +     bits:  01111110 11111110 11111110 11111111
>   +     bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
>   +
>   +     The 1-bits make sure that carries propagate to the next 0-bit.
>   +     The 0-bits provide holes for carries to fall into.  */
>   +  switch (sizeof (longword))
>   +    {
>   +    case 4: magic_bits = 0x7efefeffL; break;
>   +    case 8: magic_bits = ((0x7efefefeL << 16) << 16) |  
> 0xfefefeffL; break;
>   +    default:
>   +      abort ();
>   +    }
>   +
>   +  /* Set up a longword, each of whose bytes is C.  */
>   +  charmask = c | (c << 8);
>   +  charmask |= charmask << 16;
>   +  if (sizeof (longword) > 4)
>   +    /* Do the shift in two steps to avoid a warning if long has  
> 32 bits.  */
>   +    charmask |= (charmask << 16) << 16;
>   +  if (sizeof (longword) > 8)
>   +    abort ();
>   +
>   +  /* Instead of the traditional loop which tests each character,
>   +     we will test a longword at a time.  The tricky part is testing
>   +     if *any of the four* bytes in the longword in question are  
> zero.  */
>   +  for (;;)
>   +    {
>   +      /* We tentatively exit the loop if adding MAGIC_BITS to
>   +	 LONGWORD fails to change any of the hole bits of LONGWORD.
>   +
>   +	 1) Is this safe?  Will it catch all the zero bytes?
>   +	 Suppose there is a byte with all zeros.  Any carry bits
>   +	 propagating from its left will fall into the hole at its
>   +	 least significant bit and stop.  Since there will be no
>   +	 carry from its most significant bit, the LSB of the
>   +	 byte to the left will be unchanged, and the zero will be
>   +	 detected.
>   +
>   +	 2) Is this worthwhile?  Will it ignore everything except
>   +	 zero bytes?  Suppose every byte of LONGWORD has a bit set
>   +	 somewhere.  There will be a carry into bit 8.  If bit 8
>   +	 is set, this will carry into bit 16.  If bit 8 is clear,
>   +	 one of bits 9-15 must be set, so there will be a carry
>   +	 into bit 16.  Similarly, there will be a carry into bit
>   +	 24.  If one of bits 24-30 is set, there will be a carry
>   +	 into bit 31, so all of the hole bits will be changed.
>   +
>   +	 The one misfire occurs when bits 24-30 are clear and bit
>   +	 31 is set; in this case, the hole at bit 31 is not
>   +	 changed.  If we had access to the processor carry flag,
>   +	 we could close this loophole by putting the fourth hole
>   +	 at bit 32!
>   +
>   +	 So it ignores everything except 128's, when they're aligned
>   +	 properly.
>   +
>   +	 3) But wait!  Aren't we looking for C as well as zero?
>   +	 Good point.  So what we do is XOR LONGWORD with a longword,
>   +	 each of whose bytes is C.  This turns each byte that is C
>   +	 into a zero.  */
>   +
>   +      longword = *longword_ptr++;
>   +
>   +      /* Add MAGIC_BITS to LONGWORD.  */
>   +      if ((((longword + magic_bits)
>   +
>   +	    /* Set those bits that were unchanged by the addition.  */
>   +	    ^ ~longword)
>   +
>   +	   /* Look at only the hole bits.  If any of the hole bits
>   +	      are unchanged, most likely one of the bytes was a
>   +	      zero.  */
>   +	   & ~magic_bits) != 0 ||
>   +
>   +	  /* That caught zeroes.  Now test for C.  */
>   +	  ((((longword ^ charmask) + magic_bits) ^ ~(longword ^ charmask))
>   +	   & ~magic_bits) != 0)
>   +	{
>   +	  /* Which of the bytes was C or zero?
>   +	     If none of them were, it was a misfire; continue the  
> search.  */
>   +
>   +	  const unsigned char *cp = (const unsigned char *)  
> (longword_ptr - 1);
>   +
>   +	  if (*cp == c || *cp == '\0')
>   +	    return (char *) cp;
>   +	  if (*++cp == c || *cp == '\0')
>   +	    return (char *) cp;
>   +	  if (*++cp == c || *cp == '\0')
>   +	    return (char *) cp;
>   +	  if (*++cp == c || *cp == '\0')
>   +	    return (char *) cp;
>   +	  if (sizeof (longword) > 4)
>   +	    {
>   +	      if (*++cp == c || *cp == '\0')
>   +		return (char *) cp;
>   +	      if (*++cp == c || *cp == '\0')
>   +		return (char *) cp;
>   +	      if (*++cp == c || *cp == '\0')
>   +		return (char *) cp;
>   +	      if (*++cp == c || *cp == '\0')
>   +		return (char *) cp;
>   +	    }
>   +	}
>   +    }
>   +
>   +  /* This should never happen.  */
>   +  return NULL;
>   +}
>   +
>   +/* For platform which support the ISO C amendement 1  
> functionality we
>   +   support user defined character classes.  */
>   +#if defined _LIBC || (defined HAVE_WCTYPE_H && defined  
> HAVE_WCHAR_H)
>   +/* Solaris 2.5 has a bug: <wchar.h> must be included before  
> <wctype.h>.  */
>   +# include <wchar.h>
>   +# include <wctype.h>
>   +#endif
>   +
>   +/* Comment out all this code if we are using the GNU C Library,  
> and are not
>   +   actually compiling the library itself.  This code is part of  
> the GNU C
>   +   Library, but also included in many other GNU distributions.   
> Compiling
>   +   and linking in this code is a waste when using the GNU C library
>   +   (especially if it is a shared library).  Rather than having  
> every GNU
>   +   program understand `configure --with-gnu-libc' and omit the  
> object files,
>   +   it is simpler to just do this in the source for each such  
> file.  */
>   +
>   +#if defined _LIBC || !defined __GNU_LIBRARY__
>   +
>   +
>   +# if defined STDC_HEADERS || !defined isascii
>   +#  define ISASCII(c) 1
>   +# else
>   +#  define ISASCII(c) isascii(c)
>   +# endif
>   +
>   +#ifdef isblank
>   +# define ISBLANK(c) (ISASCII (c) && isblank (c))
>   +#else
>   +# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
>   +#endif
>   +#ifdef isgraph
>   +# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
>   +#else
>   +# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
>   +#endif
>   +
>   +#define ISPRINT(c) (ISASCII (c) && isprint (c))
>   +#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
>   +#define ISALNUM(c) (ISASCII (c) && isalnum (c))
>   +#define ISALPHA(c) (ISASCII (c) && isalpha (c))
>   +#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
>   +#define ISLOWER(c) (ISASCII (c) && islower (c))
>   +#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
>   +#define ISSPACE(c) (ISASCII (c) && isspace (c))
>   +#define ISUPPER(c) (ISASCII (c) && isupper (c))
>   +#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
>   +
>   +# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
>   +
>   +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined  
> HAVE_WCHAR_H)
>   +/* The GNU C library provides support for user-defined character  
> classes
>   +   and the functions from ISO C amendement 1.  */
>   +#  ifdef CHARCLASS_NAME_MAX
>   +#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
>   +#  else
>   +/* This shouldn't happen but some implementation might still  
> have this
>   +   problem.  Use a reasonable default value.  */
>   +#   define CHAR_CLASS_MAX_LENGTH 256
>   +#  endif
>   +
>   +#  ifdef _LIBC
>   +#   define IS_CHAR_CLASS(string) __wctype (string)
>   +#  else
>   +#   define IS_CHAR_CLASS(string) wctype (string)
>   +#  endif
>   +# else
>   +#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
>   +
>   +#  define IS_CHAR_CLASS(string)						      \
>   +   (STREQ (string, "alpha") || STREQ (string, "upper")			      \
>   +    || STREQ (string, "lower") || STREQ (string, "digit")		      \
>   +    || STREQ (string, "alnum") || STREQ (string, "xdigit")		      \
>   +    || STREQ (string, "space") || STREQ (string, "print")		      \
>   +    || STREQ (string, "punct") || STREQ (string, "graph")		      \
>   +    || STREQ (string, "cntrl") || STREQ (string, "blank"))
>   +# endif
>   +
>   +/* Match STRING against the filename pattern PATTERN, returning  
> zero if
>   +   it matches, nonzero if not.  */
>   +static int
>   +#ifdef _LIBC
>   +internal_function
>   +#endif
>   +internal_fnmatch (const char *pattern, const char *string,
>   +		  int no_leading_period, int flags)
>   +{
>   +  register const char *p = pattern, *n = string;
>   +  register unsigned char c;
>   +
>   +/* Note that this evaluates C many times.  */
>   +# ifdef _LIBC
>   +#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
>   +# else
>   +#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ?  
> tolower (c) : (c))
>   +# endif
>   +
>   +  while ((c = *p++) != '\0')
>   +    {
>   +      c = FOLD (c);
>   +
>   +      switch (c)
>   +	{
>   +	case '?':
>   +	  if (*n == '\0')
>   +	    return FNM_NOMATCH;
>   +	  else if (*n == '/' && (flags & FNM_FILE_NAME))
>   +	    return FNM_NOMATCH;
>   +	  else if (*n == '.' && no_leading_period
>   +		   && (n == string
>   +		       || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
>   +	    return FNM_NOMATCH;
>   +	  break;
>   +
>   +	case '\\':
>   +	  if (!(flags & FNM_NOESCAPE))
>   +	    {
>   +	      c = *p++;
>   +	      if (c == '\0')
>   +		/* Trailing \ loses.  */
>   +		return FNM_NOMATCH;
>   +	      c = FOLD (c);
>   +	    }
>   +	  if (FOLD ((unsigned char) *n) != c)
>   +	    return FNM_NOMATCH;
>   +	  break;
>   +
>   +	case '*':
>   +	  if (*n == '.' && no_leading_period
>   +	      && (n == string
>   +		  || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
>   +	    return FNM_NOMATCH;
>   +
>   +	  for (c = *p++; c == '?' || c == '*'; c = *p++)
>   +	    {
>   +	      if (*n == '/' && (flags & FNM_FILE_NAME))
>   +		/* A slash does not match a wildcard under FNM_FILE_NAME.  */
>   +		return FNM_NOMATCH;
>   +	      else if (c == '?')
>   +		{
>   +		  /* A ? needs to match one character.  */
>   +		  if (*n == '\0')
>   +		    /* There isn't another character; no match.  */
>   +		    return FNM_NOMATCH;
>   +		  else
>   +		    /* One character of the string is consumed in matching
>   +		       this ? wildcard, so *??? won't match if there are
>   +		       less than three characters.  */
>   +		    ++n;
>   +		}
>   +	    }
>   +
>   +	  if (c == '\0')
>   +	    /* The wildcard(s) is/are the last element of the pattern.
>   +	       If the name is a file name and contains another slash
>   +	       this does mean it cannot match.  If the FNM_LEADING_DIR
>   +	       flag is set and exactly one slash is following, we have
>   +	       a match.  */
>   +	    {
>   +	      int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
>   +
>   +	      if (flags & FNM_FILE_NAME)
>   +		{
>   +		  const char *slashp = strchr (n, '/');
>   +
>   +		  if (flags & FNM_LEADING_DIR)
>   +		    {
>   +		      if (slashp != NULL
>   +			  && strchr (slashp + 1, '/') == NULL)
>   +			result = 0;
>   +		    }
>   +		  else
>   +		    {
>   +		      if (slashp == NULL)
>   +			result = 0;
>   +		    }
>   +		}
>   +
>   +	      return result;
>   +	    }
>   +	  else
>   +	    {
>   +	      const char *endp;
>   +
>   +	      endp = internal__strchrnul (n, (flags & FNM_FILE_NAME) ?  
> '/' : '\0');
>   +
>   +	      if (c == '[')
>   +		{
>   +		  int flags2 = ((flags & FNM_FILE_NAME)
>   +				? flags : (flags & ~FNM_PERIOD));
>   +
>   +		  for (--p; n < endp; ++n)
>   +		    if (internal_fnmatch (p, n,
>   +					  (no_leading_period
>   +					   && (n == string
>   +					       || (n[-1] == '/'
>   +						   && (flags
>   +						       & FNM_FILE_NAME)))),
>   +					  flags2)
>   +			== 0)
>   +		      return 0;
>   +		}
>   +	      else if (c == '/' && (flags & FNM_FILE_NAME))
>   +		{
>   +		  while (*n != '\0' && *n != '/')
>   +		    ++n;
>   +		  if (*n == '/'
>   +		      && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD,
>   +					    flags) == 0))
>   +		    return 0;
>   +		}
>   +	      else
>   +		{
>   +		  int flags2 = ((flags & FNM_FILE_NAME)
>   +				? flags : (flags & ~FNM_PERIOD));
>   +
>   +		  if (c == '\\' && !(flags & FNM_NOESCAPE))
>   +		    c = *p;
>   +		  c = FOLD (c);
>   +		  for (--p; n < endp; ++n)
>   +		    if (FOLD ((unsigned char) *n) == c
>   +			&& (internal_fnmatch (p, n,
>   +					      (no_leading_period
>   +					       && (n == string
>   +						   || (n[-1] == '/'
>   +						       && (flags
>   +							   & FNM_FILE_NAME)))),
>   +					      flags2) == 0))
>   +		      return 0;
>   +		}
>   +	    }
>   +
>   +	  /* If we come here no match is possible with the wildcard.  */
>   +	  return FNM_NOMATCH;
>   +
>   +	case '[':
>   +	  {
>   +	    /* Nonzero if the sense of the character class is  
> inverted.  */
>   +	    static int posixly_correct;
>   +	    register int not;
>   +	    char cold;
>   +
>   +	    if (posixly_correct == 0)
>   +	      posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ?  
> 1 : -1;
>   +
>   +	    if (*n == '\0')
>   +	      return FNM_NOMATCH;
>   +
>   +	    if (*n == '.' && no_leading_period && (n == string
>   +						   || (n[-1] == '/'
>   +						       && (flags
>   +							   & FNM_FILE_NAME))))
>   +	      return FNM_NOMATCH;
>   +
>   +	    if (*n == '/' && (flags & FNM_FILE_NAME))
>   +	      /* `/' cannot be matched.  */
>   +	      return FNM_NOMATCH;
>   +
>   +	    not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
>   +	    if (not)
>   +	      ++p;
>   +
>   +	    c = *p++;
>   +	    for (;;)
>   +	      {
>   +		unsigned char fn = FOLD ((unsigned char) *n);
>   +
>   +		if (!(flags & FNM_NOESCAPE) && c == '\\')
>   +		  {
>   +		    if (*p == '\0')
>   +		      return FNM_NOMATCH;
>   +		    c = FOLD ((unsigned char) *p);
>   +		    ++p;
>   +
>   +		    if (c == fn)
>   +		      goto matched;
>   +		  }
>   +		else if (c == '[' && *p == ':')
>   +		  {
>   +		    /* Leave room for the null.  */
>   +		    char str[CHAR_CLASS_MAX_LENGTH + 1];
>   +		    size_t c1 = 0;
>   +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined  
> HAVE_WCHAR_H)
>   +		    wctype_t wt;
>   +# endif
>   +		    const char *startp = p;
>   +
>   +		    for (;;)
>   +		      {
>   +			if (c1 == CHAR_CLASS_MAX_LENGTH)
>   +			  /* The name is too long and therefore the pattern
>   +			     is ill-formed.  */
>   +			  return FNM_NOMATCH;
>   +
>   +			c = *++p;
>   +			if (c == ':' && p[1] == ']')
>   +			  {
>   +			    p += 2;
>   +			    break;
>   +			  }
>   +			if (c < 'a' || c >= 'z')
>   +			  {
>   +			    /* This cannot possibly be a character class name.
>   +			       Match it as a normal range.  */
>   +			    p = startp;
>   +			    c = '[';
>   +			    goto normal_bracket;
>   +			  }
>   +			str[c1++] = c;
>   +		      }
>   +		    str[c1] = '\0';
>   +
>   +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined  
> HAVE_WCHAR_H)
>   +		    wt = IS_CHAR_CLASS (str);
>   +		    if (wt == 0)
>   +		      /* Invalid character class name.  */
>   +		      return FNM_NOMATCH;
>   +
>   +		    if (__iswctype (__btowc ((unsigned char) *n), wt))
>   +		      goto matched;
>   +# else
>   +		    if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n))
>   +			|| (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n))
>   +			|| (STREQ (str, "blank") && ISBLANK ((unsigned char) *n))
>   +			|| (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n))
>   +			|| (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n))
>   +			|| (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n))
>   +			|| (STREQ (str, "lower") && ISLOWER ((unsigned char) *n))
>   +			|| (STREQ (str, "print") && ISPRINT ((unsigned char) *n))
>   +			|| (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n))
>   +			|| (STREQ (str, "space") && ISSPACE ((unsigned char) *n))
>   +			|| (STREQ (str, "upper") && ISUPPER ((unsigned char) *n))
>   +			|| (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n)))
>   +		      goto matched;
>   +# endif
>   +		  }
>   +		else if (c == '\0')
>   +		  /* [ (unterminated) loses.  */
>   +		  return FNM_NOMATCH;
>   +		else
>   +		  {
>   +		    c = FOLD (c);
>   +		  normal_bracket:
>   +		    if (c == fn)
>   +		      goto matched;
>   +
>   +		    cold = c;
>   +		    c = *p++;
>   +
>   +		    if (c == '-' && *p != ']')
>   +		      {
>   +			/* It is a range.  */
>   +			char lo[2];
>   +			char fc[2];
>   +			unsigned char cend = *p++;
>   +			if (!(flags & FNM_NOESCAPE) && cend == '\\')
>   +			  cend = *p++;
>   +			if (cend == '\0')
>   +			  return FNM_NOMATCH;
>   +
>   +			lo[0] = cold;
>   +			lo[1] = '\0';
>   +			fc[0] = fn;
>   +			fc[1] = '\0';
>   +			if (strcoll (lo, fc) <= 0)
>   +			  {
>   +			    char hi[2];
>   +			    hi[0] = FOLD (cend);
>   +			    hi[1] = '\0';
>   +			    if (strcoll (fc, hi) <= 0)
>   +			      goto matched;
>   +			  }
>   +
>   +			c = *p++;
>   +		      }
>   +		  }
>   +
>   +		if (c == ']')
>   +		  break;
>   +	      }
>   +
>   +	    if (!not)
>   +	      return FNM_NOMATCH;
>   +	    break;
>   +
>   +	  matched:
>   +	    /* Skip the rest of the [...] that already matched.  */
>   +	    while (c != ']')
>   +	      {
>   +		if (c == '\0')
>   +		  /* [... (unterminated) loses.  */
>   +		  return FNM_NOMATCH;
>   +
>   +		c = *p++;
>   +		if (!(flags & FNM_NOESCAPE) && c == '\\')
>   +		  {
>   +		    if (*p == '\0')
>   +		      return FNM_NOMATCH;
>   +		    /* XXX 1003.2d11 is unclear if this is right.  */
>   +		    ++p;
>   +		  }
>   +		else if (c == '[' && *p == ':')
>   +		  {
>   +		    do
>   +		      if (*++p == '\0')
>   +			return FNM_NOMATCH;
>   +		    while (*p != ':' || p[1] == ']');
>   +		    p += 2;
>   +		    c = *p;
>   +		  }
>   +	      }
>   +	    if (not)
>   +	      return FNM_NOMATCH;
>   +	  }
>   +	  break;
>   +
>   +	default:
>   +	  if (c != FOLD ((unsigned char) *n))
>   +	    return FNM_NOMATCH;
>   +	}
>   +
>   +      ++n;
>   +    }
>   +
>   +  if (*n == '\0')
>   +    return 0;
>   +
>   +  if ((flags & FNM_LEADING_DIR) && *n == '/')
>   +    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/ 
> frobozz".  */
>   +    return 0;
>   +
>   +  return FNM_NOMATCH;
>   +
>   +# undef FOLD
>   +}
>   +
>   +
>   +int
>   +fnmatch (const char *pattern, const char *string, int flags)
>   +{
>   +  return internal_fnmatch (pattern, string, flags & FNM_PERIOD,  
> flags);
>   +}
>   +
>   +#endif	/* _LIBC or not __GNU_LIBRARY__.  */
>   +/*@=unreachable@*/
>   +/*@=temptrans@*/
>   +/*@=shiftimplementation@*/
>   +/*@=retalias@*/
>   +/*@=bounds@*/
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/fnmatch.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r0 -r2.1 fnmatch.h
>   --- /dev/null	2008-07-31 18:55:00 +0200
>   +++ fnmatch.h	2008-07-31 18:58:58 +0200
>   @@ -0,0 +1,88 @@
>   +/* Copyright (C) 1991,92,93,96,97,98,99,2001 Free Software  
> Foundation, Inc.
>   +   This file is part of the GNU C Library.
>   +
>   +   The GNU C Library is free software; you can redistribute it  
> and/or
>   +   modify it under the terms of the GNU Lesser General Public
>   +   License as published by the Free Software Foundation; either
>   +   version 2.1 of the License, or (at your option) any later  
> version.
>   +
>   +   The GNU C Library 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
>   +   Lesser General Public License for more details.
>   +
>   +   You should have received a copy of the GNU Lesser General Public
>   +   License along with the GNU C Library; if not, write to the Free
>   +   Software Foundation, Inc., 59 Temple Place, Suite 330,  
> Boston, MA
>   +   02111-1307 USA.  */
>   +
>   +#ifndef	_FNMATCH_H
>   +#define	_FNMATCH_H	1
>   +
>   +#ifdef	__cplusplus
>   +extern "C" {
>   +#endif
>   +
>   +#if defined __cplusplus || (defined __STDC__ && __STDC__) ||  
> defined WINDOWS32
>   +# if !defined __GLIBC__ || !defined __P
>   +#  undef	__P
>   +#  define __P(protos)	protos
>   +# endif
>   +#else /* Not C++ or ANSI C.  */
>   +# undef	__P
>   +# define __P(protos)	()
>   +/* We can get away without defining `const' here only because in  
> this file
>   +   it is used only inside the prototype for `fnmatch', which is  
> elided in
>   +   non-ANSI C where `const' is problematical.  */
>   +#endif /* C++ or ANSI C.  */
>   +
>   +#ifndef __const
>   +# if (defined __STDC__ && __STDC__) || defined __cplusplus
>   +#  define __const	const
>   +# else
>   +#  define __const
>   +# endif
>   +#endif
>   +
>   +/* We #undef these before defining them because some losing systems
>   +   (HP-UX A.08.07 for example) define these in <unistd.h>.  */
>   +#undef	FNM_PATHNAME
>   +#undef	FNM_NOESCAPE
>   +#undef	FNM_PERIOD
>   +
>   +/* Bits set in the FLAGS argument to `fnmatch'.  */
>   +#define	FNM_PATHNAME	(1 << 0) /* No wildcard can ever match  
> `/'.  */
>   +#define	FNM_NOESCAPE	(1 << 1) /* Backslashes don't quote special  
> chars.  */
>   +#define	FNM_PERIOD	(1 << 2) /* Leading `.' is matched only  
> explicitly.  */
>   +
>   +#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined  
> _GNU_SOURCE
>   +# define FNM_FILE_NAME	 FNM_PATHNAME	/* Preferred GNU name.  */
>   +# define FNM_LEADING_DIR (1 << 3)	/* Ignore `/...' after a  
> match.  */
>   +# define FNM_CASEFOLD	 (1 << 4)	/* Compare without regard to  
> case.  */
>   +# define FNM_EXTMATCH	 (1 << 5)	/* Use ksh-like extended  
> matching. */
>   +#endif
>   +
>   +/* Value returned by `fnmatch' if STRING does not match  
> PATTERN.  */
>   +#define	FNM_NOMATCH	1
>   +
>   +/* This value is returned if the implementation does not support
>   +   `fnmatch'.  Since this is not the case here it will never be
>   +   returned but the conformance test suites still require the  
> symbol
>   +   to be defined.  */
>   +#ifdef _XOPEN_SOURCE
>   +# define FNM_NOSYS	(-1)
>   +#endif
>   +
>   +/* Match NAME against the filename pattern PATTERN,
>   +   returning zero if it matches, FNM_NOMATCH if not.  */
>   +/*@-redecl@*/
>   +extern int fnmatch __P ((__const char *__pattern, __const char  
> *__name,
>   +			 int __flags))
>   +	/*@*/;
>   +/*@=redecl@*/
>   +
>   +#ifdef	__cplusplus
>   +}
>   +#endif
>   +
>   +#endif /* fnmatch.h */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/glob.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r0 -r2.1 glob.c
>   --- /dev/null	2008-07-31 18:55:00 +0200
>   +++ glob.c	2008-07-31 18:58:58 +0200
>   @@ -0,0 +1,1206 @@
>   +/*@-bounds@*/
>   +/*@-branchstate@*/
>   +/*@-compdef@*/
>   +/*@-immediatetrans@*/
>   +/*@-internalglobs@*/
>   +/*@-loopswitchbreak@*/
>   +/*@-modnomods@*/
>   +/*@-mods@*/
>   +/*@-moduncon@*/
>   +/*@-modunconnomods@*/
>   +/*@-noeffectuncon@*/
>   +/*@-nullpass@*/
>   +/*@-onlytrans@*/
>   +/*@-protoparammatch@*/
>   +/*@-retalias@*/
>   +/*@-retvalint@*/
>   +/*@-shadow@*/
>   +/*@-sizeoftype@*/
>   +/*@-temptrans@*/
>   +/*@-unqualifiedtrans@*/
>   +/*@-unrecog@*/
>   +
>   +/* Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software  
> Foundation, Inc.
>   +
>   +   This library is free software; you can redistribute it and/or
>   +   modify it under the terms of the GNU Library General Public  
> License as
>   +   published by the Free Software Foundation; either version 2  
> of the
>   +   License, or (at your option) any later version.
>   +
>   +   This library 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
>   +   Library General Public License for more details.
>   +
>   +   You should have received a copy of the GNU Library General  
> Public
>   +   License along with this library; see the file COPYING.LIB.   
> If not,
>   +   write to the Free Software Foundation, Inc., 59 Temple Place  
> - Suite 330,
>   +   Boston, MA 02111-1307, USA.  */
>   +
>   +/* AIX requires this to be the first thing in the file.  */
>   +#if defined _AIX && !defined __GNUC__
>   + #pragma alloca
>   +#endif
>   +
>   +/*@access DIR@*/
>   +
>   +# include "system.h"
>   +
>   +# include <assert.h>
>   +
>   +#undef __alloca
>   +#define	__alloca	alloca
>   +#define	__stat		stat
>   +#define	NAMLEN(_d)	NLENGTH(_d)
>   +
>   +#if (defined POSIX || defined WINDOWS32) && !defined  
> __GNU_LIBRARY__
>   +/* Posix does not require that the d_ino field be present, and some
>   +   systems do not provide it. */
>   +# define REAL_DIR_ENTRY(dp) 1
>   +#else
>   +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
>   +#endif /* POSIX */
>   +
>   +#include <errno.h>
>   +#ifndef __set_errno
>   +# define __set_errno(val) errno = (val)
>   +#endif
>   +
>   +/* Outcomment the following line for production quality code.  */
>   +/* #define NDEBUG 1 */
>   +
>   +#define GLOB_INTERFACE_VERSION 1
>   +
>   +static inline const char *next_brace_sub __P ((const char *begin));
>   +static int glob_in_dir __P ((const char *pattern, const char  
> *directory,
>   +			     int flags,
>   +			     int (*errfunc) (const char *, int),
>   +			     glob_t *pglob));
>   +static int prefix_array __P ((const char *prefix, char **array,  
> size_t n));
>   +static int collated_compare __P ((const __ptr_t, const __ptr_t));
>   +
>   +
>   +/* Find the end of the sub-pattern in a brace expression.  We  
> define
>   +   this as an inline function if the compiler permits.  */
>   +static inline const char *
>   +next_brace_sub (const char *begin)
>   +{
>   +  unsigned int depth = 0;
>   +  const char *cp = begin;
>   +
>   +  while (1)
>   +    {
>   +      if (depth == 0)
>   +	{
>   +	  if (*cp != ',' && *cp != '}' && *cp != '\0')
>   +	    {
>   +	      if (*cp == '{')
>   +		++depth;
>   +	      ++cp;
>   +	      continue;
>   +	    }
>   +	}
>   +      else
>   +	{
>   +	  while (*cp != '\0' && (*cp != '}' || depth > 0))
>   +	    {
>   +	      if (*cp == '}')
>   +		--depth;
>   +	      ++cp;
>   +	    }
>   +	  if (*cp == '\0')
>   +	    /* An incorrectly terminated brace expression.  */
>   +	    return NULL;
>   +
>   +	  continue;
>   +	}
>   +      break;
>   +    }
>   +
>   +  return cp;
>   +}
>   +
>   +static int __glob_pattern_p (const char *pattern, int quote);
>   +
>   +/* Do glob searching for PATTERN, placing results in PGLOB.
>   +   The bits defined above may be set in FLAGS.
>   +   If a directory cannot be opened or read and ERRFUNC is not nil,
>   +   it is called with the pathname that caused the error, and the
>   +   `errno' value from the failing call; if it returns non-zero
>   +   `glob' returns GLOB_ABORTED; if it returns zero, the error is  
> ignored.
>   +   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is  
> returned.
>   +   Otherwise, `glob' returns zero.  */
>   +int
>   +glob (const char *pattern, int flags,
>   +	int (*errfunc) __P ((const char *, int)), glob_t *pglob)
>   +{
>   +  const char *filename;
>   +  const char *dirname;
>   +  size_t dirlen;
>   +  int status;
>   +  int oldcount;
>   +
>   +  if (pattern == NULL || pglob == NULL || (flags &  
> ~__GLOB_FLAGS) != 0)
>   +    {
>   +      __set_errno (EINVAL);
>   +      return -1;
>   +    }
>   +
>   +  if (flags & GLOB_BRACE)
>   +    {
>   +      const char *begin = strchr (pattern, '{');
>   +      if (begin != NULL)
>   +	{
>   +	  /* Allocate working buffer large enough for our work.  Note that
>   +	    we have at least an opening and closing brace.  */
>   +	  int firstc;
>   +	  char *alt_start;
>   +	  const char *p;
>   +	  const char *next;
>   +	  const char *rest;
>   +	  size_t rest_len;
>   +#ifdef __GNUC__
>   +	  char onealt[strlen (pattern) - 1];
>   +#else
>   +	  char *onealt = (char *) xmalloc (strlen (pattern) - 1);
>   +	  if (onealt == NULL)
>   +	    {
>   +	      if (!(flags & GLOB_APPEND))
>   +		globfree (pglob);
>   +	      return GLOB_NOSPACE;
>   +	    }
>   +#endif
>   +
>   +	  /* We know the prefix for all sub-patterns.  */
>   +#ifdef HAVE_MEMPCPY
>   +	  alt_start = mempcpy (onealt, pattern, begin - pattern);
>   +#else
>   +	  memcpy (onealt, pattern, begin - pattern);
>   +	  alt_start = &onealt[begin - pattern];
>   +#endif
>   +
>   +	  /* Find the first sub-pattern and at the same time find the
>   +	     rest after the closing brace.  */
>   +	  next = next_brace_sub (begin + 1);
>   +	  if (next == NULL)
>   +	    {
>   +	      /* It is an illegal expression.  */
>   +#ifndef __GNUC__
>   +	      free (onealt);
>   +#endif
>   +	      return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
>   +	    }
>   +
>   +	  /* Now find the end of the whole brace expression.  */
>   +	  rest = next;
>   +	  while (*rest != '}')
>   +	    {
>   +	      rest = next_brace_sub (rest + 1);
>   +	      if (rest == NULL)
>   +		{
>   +		  /* It is an illegal expression.  */
>   +#ifndef __GNUC__
>   +		  free (onealt);
>   +#endif
>   +		  return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
>   +		}
>   +	    }
>   +	  /* Please note that we now can be sure the brace expression
>   +	     is well-formed.  */
>   +	  rest_len = strlen (++rest) + 1;
>   +
>   +	  /* We have a brace expression.  BEGIN points to the opening {,
>   +	     NEXT points past the terminator of the first element, and END
>   +	     points past the final }.  We will accumulate result names  
> from
>   +	     recursive runs for each brace alternative in the buffer using
>   +	     GLOB_APPEND.  */
>   +
>   +	  if (!(flags & GLOB_APPEND))
>   +	    {
>   +	      /* This call is to set a new vector, so clear out the
>   +		 vector so we can append to it.  */
>   +	      pglob->gl_pathc = 0;
>   +	      pglob->gl_pathv = NULL;
>   +	    }
>   +	  firstc = pglob->gl_pathc;
>   +
>   +	  p = begin + 1;
>   +	  while (1)
>   +	    {
>   +	      int result;
>   +
>   +	      /* Construct the new glob expression.  */
>   +#ifdef HAVE_MEMPCPY
>   +	      mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
>   +#else
>   +	      memcpy (alt_start, p, next - p);
>   +	      memcpy (&alt_start[next - p], rest, rest_len);
>   +#endif
>   +
>   +	      result = glob (onealt,
>   +			     ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
>   +			      | GLOB_APPEND), errfunc, pglob);
>   +
>   +	      /* If we got an error, return it.  */
>   +	      if (result && result != GLOB_NOMATCH)
>   +		{
>   +#ifndef __GNUC__
>   +		  free (onealt);
>   +#endif
>   +		  if (!(flags & GLOB_APPEND))
>   +		    globfree (pglob);
>   +		  return result;
>   +		}
>   +
>   +	      if (*next == '}')
>   +		/* We saw the last entry.  */
>   +		break;
>   +
>   +	      p = next + 1;
>   +	      next = next_brace_sub (p);
>   +	      assert (next != NULL);
>   +	    }
>   +
>   +#ifndef __GNUC__
>   +	  free (onealt);
>   +#endif
>   +
>   +	  if ((int)pglob->gl_pathc != firstc)
>   +	    /* We found some entries.  */
>   +	    return 0;
>   +	  else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
>   +	    return GLOB_NOMATCH;
>   +	}
>   +    }
>   +
>   +  /* Find the filename.  */
>   +  filename = strrchr (pattern, '/');
>   +#if defined __MSDOS__ || defined WINDOWS32
>   +  /* The case of "d:pattern".  Since `:' is not allowed in
>   +     file names, we can safely assume that wherever it
>   +     happens in pattern, it signals the filename part.  This
>   +     is so we could some day support patterns like "[a-z]:foo".  */
>   +  if (filename == NULL)
>   +    filename = strchr (pattern, ':');
>   +#endif /* __MSDOS__ || WINDOWS32 */
>   +  if (filename == NULL)
>   +    {
>   +      /* This can mean two things: a simple name or "~name".   
> The latter
>   +	 case is nothing but a notation for a directory.  */
>   +      if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0]  
> == '~')
>   +	{
>   +	  dirname = pattern;
>   +	  dirlen = strlen (pattern);
>   +
>   +	  /* Set FILENAME to NULL as a special flag.  This is ugly but
>   +	     other solutions would require much more code.  We test for
>   +	     this special case below.  */
>   +	  filename = NULL;
>   +	}
>   +      else
>   +	{
>   +	  filename = pattern;
>   +#ifdef _AMIGA
>   +	  dirname = "";
>   +#else
>   +	  dirname = ".";
>   +#endif
>   +	  dirlen = 0;
>   +	}
>   +    }
>   +  else if (filename == pattern)
>   +    {
>   +      /* "/pattern".  */
>   +      dirname = "/";
>   +      dirlen = 1;
>   +      ++filename;
>   +    }
>   +  else
>   +    {
>   +      char *newp;
>   +      dirlen = filename - pattern;
>   +#if defined __MSDOS__ || defined WINDOWS32
>   +      if (*filename == ':'
>   +	  || (filename > pattern + 1 && filename[-1] == ':'))
>   +	{
>   +	  char *drive_spec;
>   +
>   +	  ++dirlen;
>   +	  drive_spec = (char *) __alloca (dirlen + 1);
>   +#ifdef HAVE_MEMPCPY
>   +	  *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
>   +#else
>   +	  memcpy (drive_spec, pattern, dirlen);
>   +	  drive_spec[dirlen] = '\0';
>   +#endif
>   +	  /* For now, disallow wildcards in the drive spec, to
>   +	     prevent infinite recursion in glob.  */
>   +	  if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
>   +	    return GLOB_NOMATCH;
>   +	  /* If this is "d:pattern", we need to copy `:' to DIRNAME
>   +	     as well.  If it's "d:/pattern", don't remove the slash
>   +	     from "d:/", since "d:" and "d:/" are not the same.*/
>   +	}
>   +#endif
>   +      newp = (char *) __alloca (dirlen + 1);
>   +#ifdef HAVE_MEMPCPY
>   +      *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
>   +#else
>   +      memcpy (newp, pattern, dirlen);
>   +      newp[dirlen] = '\0';
>   +#endif
>   +      dirname = newp;
>   +      ++filename;
>   +
>   +      if (filename[0] == '\0'
>   +#if defined __MSDOS__ || defined WINDOWS32
>   +          && dirname[dirlen - 1] != ':'
>   +	  && (dirlen < 3 || dirname[dirlen - 2] != ':'
>   +	      || dirname[dirlen - 1] != '/')
>   +#endif
>   +	  && dirlen > 1)
>   +	/* "pattern/".  Expand "pattern", appending slashes.  */
>   +	{
>   +	  int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
>   +	  if (val == 0)
>   +	    pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
>   +			       | (flags & GLOB_MARK));
>   +	  return val;
>   +	}
>   +    }
>   +
>   +  if (!(flags & GLOB_APPEND))
>   +    {
>   +      pglob->gl_pathc = 0;
>   +      pglob->gl_pathv = NULL;
>   +    }
>   +
>   +  oldcount = pglob->gl_pathc;
>   +
>   +#ifndef VMS
>   +  if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
>   +    {
>   +      if (dirname[1] == '\0' || dirname[1] == '/')
>   +	{
>   +	  /* Look up home directory.  */
>   +	  const char *home_dir = getenv ("HOME");
>   +# ifdef _AMIGA
>   +	  if (home_dir == NULL || home_dir[0] == '\0')
>   +	    home_dir = "SYS:";
>   +# else
>   +#  ifdef WINDOWS32
>   +	  if (home_dir == NULL || home_dir[0] == '\0')
>   +            home_dir = "c:/users/default"; /* poor default */
>   +#  else
>   +	  if (home_dir == NULL || home_dir[0] == '\0')
>   +	    {
>   +	      int success;
>   +	      char *name;
>   +#   if defined HAVE_GETLOGIN_R || defined _LIBC
>   +	      size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
>   +
>   +	      if (buflen == 0)
>   +		/* `sysconf' does not support _SC_LOGIN_NAME_MAX.  Try
>   +		   a moderate value.  */
>   +		buflen = 20;
>   +	      name = (char *) __alloca (buflen);
>   +
>   +	      success = getlogin_r (name, buflen) >= 0;
>   +#   else
>   +	      success = (name = getlogin ()) != NULL;
>   +#   endif
>   +	      if (success)
>   +		{
>   +		  struct passwd *p;
>   +#   if defined HAVE_GETPWNAM_R || defined _LIBC
>   +		  size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
>   +		  char *pwtmpbuf;
>   +		  struct passwd pwbuf;
>   +		  int save = errno;
>   +
>   +		  if (pwbuflen == -1)
>   +		    /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
>   +		       Try a moderate value.  */
>   +		    pwbuflen = 1024;
>   +		  pwtmpbuf = (char *) __alloca (pwbuflen);
>   +
>   +		  while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
>   +			 != 0)
>   +		    {
>   +		      if (errno != ERANGE)
>   +			{
>   +			  p = NULL;
>   +			  break;
>   +			}
>   +		      pwbuflen *= 2;
>   +		      pwtmpbuf = (char *) __alloca (pwbuflen);
>   +		      __set_errno (save);
>   +		    }
>   +#   else
>   +		  p = getpwnam (name);
>   +#   endif
>   +		  if (p != NULL)
>   +		    home_dir = p->pw_dir;
>   +		}
>   +	    }
>   +	  if (home_dir == NULL || home_dir[0] == '\0')
>   +	    {
>   +	      if (flags & GLOB_TILDE_CHECK)
>   +		return GLOB_NOMATCH;
>   +	      else
>   +		home_dir = "~"; /* No luck.  */
>   +	    }
>   +#  endif /* WINDOWS32 */
>   +# endif
>   +	  /* Now construct the full directory.  */
>   +	  if (dirname[1] == '\0')
>   +	    dirname = home_dir;
>   +	  else
>   +	    {
>   +	      char *newp;
>   +	      size_t home_len = strlen (home_dir);
>   +	      newp = (char *) __alloca (home_len + dirlen);
>   +# ifdef HAVE_MEMPCPY
>   +	      mempcpy (mempcpy (newp, home_dir, home_len),
>   +		       &dirname[1], dirlen);
>   +# else
>   +	      memcpy (newp, home_dir, home_len);
>   +	      memcpy (&newp[home_len], &dirname[1], dirlen);
>   +# endif
>   +	      dirname = newp;
>   +	    }
>   +	}
>   +# if !defined _AMIGA && !defined WINDOWS32
>   +      else
>   +	{
>   +	  char *end_name = strchr (dirname, '/');
>   +	  const char *user_name;
>   +	  const char *home_dir;
>   +
>   +	  if (end_name == NULL)
>   +	    user_name = dirname + 1;
>   +	  else
>   +	    {
>   +	      char *newp;
>   +	      newp = (char *) __alloca (end_name - dirname);
>   +# ifdef HAVE_MEMPCPY
>   +	      *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
>   +		= '\0';
>   +# else
>   +	      memcpy (newp, dirname + 1, end_name - dirname);
>   +	      newp[end_name - dirname - 1] = '\0';
>   +# endif
>   +	      user_name = newp;
>   +	    }
>   +
>   +	  /* Look up specific user's home directory.  */
>   +	  {
>   +	    struct passwd *p;
>   +#  if defined HAVE_GETPWNAM_R || defined _LIBC
>   +	    size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
>   +	    char *pwtmpbuf;
>   +	    struct passwd pwbuf;
>   +	    int save = errno;
>   +
>   +	    if (buflen == -1)
>   +	      /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.  Try a
>   +		 moderate value.  */
>   +	      buflen = 1024;
>   +	    pwtmpbuf = (char *) __alloca (buflen);
>   +
>   +	    while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen,  
> &p) != 0)
>   +	      {
>   +		if (errno != ERANGE)
>   +		  {
>   +		    p = NULL;
>   +		    break;
>   +		  }
>   +		buflen *= 2;
>   +		pwtmpbuf = __alloca (buflen);
>   +		__set_errno (save);
>   +	      }
>   +#  else
>   +	    p = getpwnam (user_name);
>   +#  endif
>   +	    if (p != NULL)
>   +	      home_dir = p->pw_dir;
>   +	    else
>   +	      home_dir = NULL;
>   +	  }
>   +	  /* If we found a home directory use this.  */
>   +	  if (home_dir != NULL)
>   +	    {
>   +	      char *newp;
>   +	      size_t home_len = strlen (home_dir);
>   +	      size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
>   +	      newp = (char *) __alloca (home_len + rest_len + 1);
>   +#  ifdef HAVE_MEMPCPY
>   +	      *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
>   +				  end_name, rest_len)) = '\0';
>   +#  else
>   +	      memcpy (newp, home_dir, home_len);
>   +	      memcpy (&newp[home_len], end_name, rest_len);
>   +	      newp[home_len + rest_len] = '\0';
>   +#  endif
>   +	      dirname = newp;
>   +	    }
>   +	  else
>   +	    if (flags & GLOB_TILDE_CHECK)
>   +	      /* We have to regard it as an error if we cannot find the
>   +		 home directory.  */
>   +	      return GLOB_NOMATCH;
>   +	}
>   +# endif	/* Not Amiga && not WINDOWS32.  */
>   +    }
>   +#endif	/* Not VMS.  */
>   +
>   +  /* Now test whether we looked for "~" or "~NAME".  In this  
> case we
>   +     can give the answer now.  */
>   +  if (filename == NULL)
>   +    {
>   +      struct stat st;
>   +
>   +      /* Return the directory if we don't check for error or if  
> it exists.  */
>   +      if ((flags & GLOB_NOCHECK)
>   +	  || (((flags & GLOB_ALTDIRFUNC)
>   +	       ? (*pglob->gl_stat) (dirname, &st)
>   +	       : __stat (dirname, &st)) == 0
>   +	      && S_ISDIR (st.st_mode)))
>   +	{
>   +	  pglob->gl_pathv
>   +	    = (char **) xrealloc (pglob->gl_pathv,
>   +				 (pglob->gl_pathc +
>   +				  ((flags & GLOB_DOOFFS) ?
>   +				   pglob->gl_offs : 0) +
>   +				  1 + 1) *
>   +				 sizeof (char *));
>   +	  if (pglob->gl_pathv == NULL)
>   +	    return GLOB_NOSPACE;
>   +
>   +	  if (flags & GLOB_DOOFFS)
>   +	    while (pglob->gl_pathc < pglob->gl_offs)
>   +	      pglob->gl_pathv[pglob->gl_pathc++] = NULL;
>   +
>   +#if defined HAVE_STRDUP || defined _LIBC
>   +	  pglob->gl_pathv[pglob->gl_pathc] = xstrdup (dirname);
>   +#else
>   +	  {
>   +	    size_t len = strlen (dirname) + 1;
>   +	    char *dircopy = xmalloc (len);
>   +	    if (dircopy != NULL)
>   +	      pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname,
>   +							 len);
>   +	  }
>   +#endif
>   +	  if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
>   +	    {
>   +	      free (pglob->gl_pathv);
>   +	      return GLOB_NOSPACE;
>   +	    }
>   +	  pglob->gl_pathv[++pglob->gl_pathc] = NULL;
>   +	  pglob->gl_flags = flags;
>   +
>   +	  return 0;
>   +	}
>   +
>   +      /* Not found.  */
>   +      return GLOB_NOMATCH;
>   +    }
>   +
>   +  if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
>   +    {
>   +      /* The directory name contains metacharacters, so we
>   +	 have to glob for the directory, and then glob for
>   +	 the pattern in each directory found.  */
>   +      glob_t dirs;
>   +      register int i;
>   +
>   +      if ((flags & GLOB_ALTDIRFUNC) != 0)
>   +	{
>   +	  /* Use the alternative access functions also in the recursive
>   +	     call.  */
>   +	  dirs.gl_opendir = pglob->gl_opendir;
>   +	  dirs.gl_readdir = pglob->gl_readdir;
>   +	  dirs.gl_closedir = pglob->gl_closedir;
>   +	  dirs.gl_stat = pglob->gl_stat;
>   +	  dirs.gl_lstat = pglob->gl_lstat;
>   +	}
>   +
>   +      status = glob (dirname,
>   +		     ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE
>   +				| GLOB_ALTDIRFUNC))
>   +		      | GLOB_NOSORT | GLOB_ONLYDIR),
>   +		     errfunc, &dirs);
>   +      if (status != 0)
>   +	return status;
>   +
>   +      /* We have successfully globbed the preceding directory name.
>   +	 For each name we found, call glob_in_dir on it and FILENAME,
>   +	 appending the results to PGLOB.  */
>   +      for (i = 0; i < (int)dirs.gl_pathc; ++i)
>   +	{
>   +	  int old_pathc;
>   +
>   +#ifdef	SHELL
>   +	  {
>   +	    /* Make globbing interruptible in the bash shell. */
>   +	    extern int interrupt_state;
>   +
>   +	    if (interrupt_state)
>   +	      {
>   +		globfree (&dirs);
>   +		globfree (&files);
>   +		return GLOB_ABORTED;
>   +	      }
>   +	  }
>   +#endif /* SHELL.  */
>   +
>   +	  old_pathc = pglob->gl_pathc;
>   +	  status = glob_in_dir (filename, dirs.gl_pathv[i],
>   +				((flags | GLOB_APPEND)
>   +				 & ~(GLOB_NOCHECK | GLOB_ERR)),
>   +				errfunc, pglob);
>   +	  if (status == GLOB_NOMATCH)
>   +	    /* No matches in this directory.  Try the next.  */
>   +	    continue;
>   +
>   +	  if (status != 0)
>   +	    {
>   +	      globfree (&dirs);
>   +	      globfree (pglob);
>   +	      return status;
>   +	    }
>   +
>   +	  /* Stick the directory on the front of each name.  */
>   +	  if (prefix_array (dirs.gl_pathv[i],
>   +			    &pglob->gl_pathv[old_pathc],
>   +			    pglob->gl_pathc - old_pathc))
>   +	    {
>   +	      globfree (&dirs);
>   +	      globfree (pglob);
>   +	      return GLOB_NOSPACE;
>   +	    }
>   +	}
>   +
>   +      flags |= GLOB_MAGCHAR;
>   +
>   +      /* We have ignored the GLOB_NOCHECK flag in the  
> `glob_in_dir' calls.
>   +	 But if we have not found any matching entry and thie GLOB_NOCHECK
>   +	 flag was set we must return the list consisting of the disrectory
>   +	 names followed by the filename.  */
>   +      if ((int)pglob->gl_pathc == oldcount)
>   +	{
>   +	  /* No matches.  */
>   +	  if (flags & GLOB_NOCHECK)
>   +	    {
>   +	      size_t filename_len = strlen (filename) + 1;
>   +	      char **new_pathv;
>   +	      struct stat st;
>   +
>   +	      /* This is an pessimistic guess about the size.  */
>   +	      pglob->gl_pathv
>   +		= (char **) xrealloc (pglob->gl_pathv,
>   +				     (pglob->gl_pathc +
>   +				      ((flags & GLOB_DOOFFS) ?
>   +				       pglob->gl_offs : 0) +
>   +				      dirs.gl_pathc + 1) *
>   +				     sizeof (char *));
>   +	      if (pglob->gl_pathv == NULL)
>   +		{
>   +		  globfree (&dirs);
>   +		  return GLOB_NOSPACE;
>   +		}
>   +
>   +	      if (flags & GLOB_DOOFFS)
>   +		while (pglob->gl_pathc < pglob->gl_offs)
>   +		  pglob->gl_pathv[pglob->gl_pathc++] = NULL;
>   +
>   +	      for (i = 0; i < (int)dirs.gl_pathc; ++i)
>   +		{
>   +		  const char *dir = dirs.gl_pathv[i];
>   +		  size_t dir_len = strlen (dir);
>   +
>   +		  /* First check whether this really is a directory.  */
>   +		  if (((flags & GLOB_ALTDIRFUNC)
>   +		       ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0
>   +		      || !S_ISDIR (st.st_mode))
>   +		    /* No directory, ignore this entry.  */
>   +		    continue;
>   +
>   +		  pglob->gl_pathv[pglob->gl_pathc] = xmalloc (dir_len + 1
>   +							     + filename_len);
>   +		  if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
>   +		    {
>   +		      globfree (&dirs);
>   +		      globfree (pglob);
>   +		      return GLOB_NOSPACE;
>   +		    }
>   +
>   +#ifdef HAVE_MEMPCPY
>   +		  mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc],
>   +					     dir, dir_len),
>   +				    "/", 1),
>   +			   filename, filename_len);
>   +#else
>   +		  memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len);
>   +		  pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/';
>   +		  memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1],
>   +			  filename, filename_len);
>   +#endif
>   +		  ++pglob->gl_pathc;
>   +		}
>   +
>   +	      pglob->gl_pathv[pglob->gl_pathc] = NULL;
>   +	      pglob->gl_flags = flags;
>   +
>   +	      /* Now we know how large the gl_pathv vector must be.  */
>   +	      new_pathv = (char **) xrealloc (pglob->gl_pathv,
>   +					     ((pglob->gl_pathc + 1)
>   +					      * sizeof (char *)));
>   +	      if (new_pathv != NULL)
>   +		pglob->gl_pathv = new_pathv;
>   +	    }
>   +	  else
>   +	    return GLOB_NOMATCH;
>   +	}
>   +
>   +      globfree (&dirs);
>   +    }
>   +  else
>   +    {
>   +      status = glob_in_dir (filename, dirname, flags, errfunc,  
> pglob);
>   +      if (status != 0)
>   +	return status;
>   +
>   +      if (dirlen > 0)
>   +	{
>   +	  /* Stick the directory on the front of each name.  */
>   +	  int ignore = oldcount;
>   +
>   +	  if ((flags & GLOB_DOOFFS) && ignore < (int)pglob->gl_offs)
>   +	    ignore = pglob->gl_offs;
>   +
>   +	  if (prefix_array (dirname,
>   +			    &pglob->gl_pathv[ignore],
>   +			    pglob->gl_pathc - ignore))
>   +	    {
>   +	      globfree (pglob);
>   +	      return GLOB_NOSPACE;
>   +	    }
>   +	}
>   +    }
>   +
>   +  if (flags & GLOB_MARK)
>   +    {
>   +      /* Append slashes to directory names.  */
>   +      int i;
>   +      struct stat st;
>   +      for (i = oldcount; i < (int)pglob->gl_pathc; ++i)
>   +	if (((flags & GLOB_ALTDIRFUNC)
>   +	     ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
>   +	     : __stat (pglob->gl_pathv[i], &st)) == 0
>   +	    && S_ISDIR (st.st_mode))
>   +	  {
>   + 	    size_t len = strlen (pglob->gl_pathv[i]) + 2;
>   +	    char *new = xrealloc (pglob->gl_pathv[i], len);
>   + 	    if (new == NULL)
>   +	      {
>   +		globfree (pglob);
>   +		return GLOB_NOSPACE;
>   +	      }
>   +	    strcpy (&new[len - 2], "/");
>   +	    pglob->gl_pathv[i] = new;
>   +	  }
>   +    }
>   +
>   +  if (!(flags & GLOB_NOSORT))
>   +    {
>   +      /* Sort the vector.  */
>   +      int non_sort = oldcount;
>   +
>   +      if ((flags & GLOB_DOOFFS) && (int)pglob->gl_offs > oldcount)
>   +	non_sort = pglob->gl_offs;
>   +
>   +      qsort ((__ptr_t) &pglob->gl_pathv[non_sort],
>   +	     pglob->gl_pathc - non_sort,
>   +	     sizeof (char *), collated_compare);
>   +    }
>   +
>   +  return 0;
>   +}
>   +
>   +
>   +/* Free storage allocated in PGLOB by a previous `glob' call.  */
>   +void
>   +globfree (glob_t *pglob)
>   +{
>   +  if (pglob->gl_pathv != NULL)
>   +    {
>   +      register int i;
>   +      for (i = 0; i < (int)pglob->gl_pathc; ++i)
>   +	if (pglob->gl_pathv[i] != NULL)
>   +	  free ((__ptr_t) pglob->gl_pathv[i]);
>   +      free ((__ptr_t) pglob->gl_pathv);
>   +    }
>   +}
>   +
>   +
>   +/* Do a collated comparison of A and B.  */
>   +static int
>   +collated_compare (const __ptr_t a, const __ptr_t b)
>   +{
>   +  const char *const s1 = *(const char *const * const) a;
>   +  const char *const s2 = *(const char *const * const) b;
>   +
>   +  if (s1 == s2)
>   +    return 0;
>   +  if (s1 == NULL)
>   +    return 1;
>   +  if (s2 == NULL)
>   +    return -1;
>   +  return strcoll (s1, s2);
>   +}
>   +
>   +
>   +/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
>   +   elements in place.  Return nonzero if out of memory, zero if  
> successful.
>   +   A slash is inserted between DIRNAME and each elt of ARRAY,
>   +   unless DIRNAME is just "/".  Each old element of ARRAY is  
> freed.  */
>   +static int
>   +prefix_array (const char *dirname, char **array, size_t n)
>   +{
>   +  register size_t i;
>   +  size_t dirlen = strlen (dirname);
>   +#if defined __MSDOS__ || defined WINDOWS32
>   +  int sep_char = '/';
>   +# define DIRSEP_CHAR sep_char
>   +#else
>   +# define DIRSEP_CHAR '/'
>   +#endif
>   +
>   +  if (dirlen == 1 && dirname[0] == '/')
>   +    /* DIRNAME is just "/", so normal prepending would get us "// 
> foo".
>   +       We want "/foo" instead, so don't prepend any chars from  
> DIRNAME.  */
>   +    dirlen = 0;
>   +#if defined __MSDOS__ || defined WINDOWS32
>   +  else if (dirlen > 1)
>   +    {
>   +      if (dirname[dirlen - 1] == '/')
>   +	/* DIRNAME is "d:/".  Don't prepend the slash from DIRNAME.  */
>   +	--dirlen;
>   +      else if (dirname[dirlen - 1] == ':')
>   +	{
>   +	  /* DIRNAME is "d:".  Use `:' instead of `/'.  */
>   +	  --dirlen;
>   +	  sep_char = ':';
>   +	}
>   +    }
>   +#endif
>   +
>   +  for (i = 0; i < n; ++i)
>   +    {
>   +      size_t eltlen = strlen (array[i]) + 1;
>   +      char *new = (char *) xmalloc (dirlen + 1 + eltlen);
>   +      if (new == NULL)
>   +	{
>   +	  while (i > 0)
>   +	    free ((__ptr_t) array[--i]);
>   +	  return 1;
>   +	}
>   +
>   +#ifdef HAVE_MEMPCPY
>   +      {
>   +	char *endp = (char *) mempcpy (new, dirname, dirlen);
>   +	*endp++ = DIRSEP_CHAR;
>   +	mempcpy (endp, array[i], eltlen);
>   +      }
>   +#else
>   +      memcpy (new, dirname, dirlen);
>   +      new[dirlen] = DIRSEP_CHAR;
>   +      memcpy (&new[dirlen + 1], array[i], eltlen);
>   +#endif
>   +      free ((__ptr_t) array[i]);
>   +      array[i] = new;
>   +    }
>   +
>   +  return 0;
>   +}
>   +
>   +
>   +/* We must not compile this function twice.  */
>   +#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
>   +/* Return nonzero if PATTERN contains any metacharacters.
>   +   Metacharacters can be quoted with backslashes if QUOTE is  
> nonzero.  */
>   +static int
>   +__glob_pattern_p (const char *pattern, int quote)
>   +{
>   +  register const char *p;
>   +  int open = 0;
>   +
>   +  for (p = pattern; *p != '\0'; ++p)
>   +    switch (*p)
>   +      {
>   +      case '?':
>   +      case '*':
>   +	return 1;
>   +
>   +      case '\\':
>   +	if (quote && p[1] != '\0')
>   +	  ++p;
>   +	break;
>   +
>   +      case '[':
>   +	open = 1;
>   +	break;
>   +
>   +      case ']':
>   +	if (open)
>   +	  return 1;
>   +	break;
>   +      }
>   +
>   +  return 0;
>   +}
>   +# ifdef _LIBC
>   +weak_alias (__glob_pattern_p, glob_pattern_p)
>   +# endif
>   +#endif
>   +
>   +
>   +/* Like `glob', but PATTERN is a final pathname component,
>   +   and matches are searched for in DIRECTORY.
>   +   The GLOB_NOSORT bit in FLAGS is ignored.  No sorting is ever  
> done.
>   +   The GLOB_APPEND flag is assumed to be set (always appends).  */
>   +static int
>   +glob_in_dir (const char *pattern, const char *directory, int flags,
>   +		int (*errfunc) __P ((const char *, int)), glob_t *pglob)
>   +{
>   +  __ptr_t stream = NULL;
>   +
>   +  struct globlink
>   +    {
>   +      struct globlink *next;
>   +      char *name;
>   +    };
>   +  struct globlink *names = NULL;
>   +  size_t nfound;
>   +  int meta;
>   +  int save;
>   +
>   +  meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
>   +  if (meta == 0)
>   +    {
>   +      if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
>   +	/* We need not do any tests.  The PATTERN contains no meta
>   +	   characters and we must not return an error therefore the
>   +	   result will always contain exactly one name.  */
>   +	flags |= GLOB_NOCHECK;
>   +      else
>   +	{
>   +	  /* Since we use the normal file functions we can also use stat()
>   +	     to verify the file is there.  */
>   +	  struct stat st;
>   +	  size_t patlen = strlen (pattern);
>   +	  size_t dirlen = strlen (directory);
>   +	  char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
>   +
>   +# ifdef HAVE_MEMPCPY
>   +	  mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
>   +			    "/", 1),
>   +		   pattern, patlen + 1);
>   +# else
>   +	  memcpy (fullname, directory, dirlen);
>   +	  fullname[dirlen] = '/';
>   +	  memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
>   +# endif
>   +	  if (((flags & GLOB_ALTDIRFUNC)
>   +	       ? (*pglob->gl_stat) (fullname, &st)
>   +	       : __stat (fullname, &st)) == 0)
>   +	    /* We found this file to be existing.  Now tell the rest
>   +	       of the function to copy this name into the result.  */
>   +	    flags |= GLOB_NOCHECK;
>   +	}
>   +
>   +      nfound = 0;
>   +    }
>   +  else
>   +    {
>   +      if (pattern[0] == '\0')
>   +	{
>   +	  /* This is a special case for matching directories like in
>   +	     "*a/".  */
>   +	  names = (struct globlink *) __alloca (sizeof (struct globlink));
>   +	  names->name = (char *) xmalloc (1);
>   +	  if (names->name == NULL)
>   +	    goto memory_error;
>   +	  names->name[0] = '\0';
>   +	  names->next = NULL;
>   +	  nfound = 1;
>   +	  meta = 0;
>   +	}
>   +      else
>   +	{
>   +	  stream = ((flags & GLOB_ALTDIRFUNC)
>   +		    ? (*pglob->gl_opendir) (directory)
>   +		    : (__ptr_t) opendir (directory));
>   +	  if (stream == NULL)
>   +	    {
>   +	      if (errno != ENOTDIR
>   +		  && ((errfunc != NULL && (*errfunc) (directory, errno))
>   +		      || (flags & GLOB_ERR)))
>   +		return GLOB_ABORTED;
>   +	      nfound = 0;
>   +	      meta = 0;
>   +	    }
>   +	  else
>   +	    {
>   +	      int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
>   +			       | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
>   +#if defined _AMIGA || defined VMS
>   +				   | FNM_CASEFOLD
>   +#endif
>   +				   );
>   +	      nfound = 0;
>   +	      flags |= GLOB_MAGCHAR;
>   +
>   +	      while (1)
>   +		{
>   +		  const char *name;
>   +		  size_t len;
>   +#ifdef _LARGEFILE64_SOURCE
>   +		  struct dirent64 *d = ((flags & GLOB_ALTDIRFUNC)
>   +				      ? (*pglob->gl_readdir) (stream)
>   +				      : readdir64 ((DIR *) stream));
>   +#else
>   +		  struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
>   +				      ? (*pglob->gl_readdir) (stream)
>   +				      : readdir ((DIR *) stream));
>   +#endif
>   +		  if (d == NULL)
>   +		    break;
>   +		  if (! REAL_DIR_ENTRY (d))
>   +		    continue;
>   +
>   +#ifdef HAVE_D_TYPE
>   +		  /* If we shall match only directories use the information
>   +		     provided by the dirent call if possible.  */
>   +		  if ((flags & GLOB_ONLYDIR)
>   +		      && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
>   +		    continue;
>   +#endif
>   +
>   +		  name = d->d_name;
>   +
>   +		  if (fnmatch (pattern, name, fnm_flags) == 0)
>   +		    {
>   +		      struct globlink *new = (struct globlink *)
>   +			__alloca (sizeof (struct globlink));
>   +		      len = NAMLEN (d);
>   +		      new->name = (char *) xmalloc (len + 1);
>   +		      if (new->name == NULL)
>   +			goto memory_error;
>   +#ifdef HAVE_MEMPCPY
>   +		      *((char *) mempcpy ((__ptr_t) new->name, name, len))
>   +			= '\0';
>   +#else
>   +		      memcpy ((__ptr_t) new->name, name, len);
>   +		      new->name[len] = '\0';
>   +#endif
>   +		      new->next = names;
>   +		      names = new;
>   +		      ++nfound;
>   +		    }
>   +		}
>   +	    }
>   +	}
>   +    }
>   +
>   +  if (nfound == 0 && (flags & GLOB_NOCHECK))
>   +    {
>   +      size_t len = strlen (pattern);
>   +      nfound = 1;
>   +      names = (struct globlink *) __alloca (sizeof (struct  
> globlink));
>   +      names->next = NULL;
>   +      names->name = (char *) xmalloc (len + 1);
>   +      if (names->name == NULL)
>   +	goto memory_error;
>   +#ifdef HAVE_MEMPCPY
>   +      *((char *) mempcpy (names->name, pattern, len)) = '\0';
>   +#else
>   +      memcpy (names->name, pattern, len);
>   +      names->name[len] = '\0';
>   +#endif
>   +    }
>   +
>   +  if (nfound != 0)
>   +    {
>   +      pglob->gl_pathv
>   +	= (char **) xrealloc (pglob->gl_pathv,
>   +			     (pglob->gl_pathc +
>   +			      ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
>   +			      nfound + 1) *
>   +			     sizeof (char *));
>   +      if (pglob->gl_pathv == NULL)
>   +	goto memory_error;
>   +
>   +      if (flags & GLOB_DOOFFS)
>   +	while (pglob->gl_pathc < pglob->gl_offs)
>   +	  pglob->gl_pathv[pglob->gl_pathc++] = NULL;
>   +
>   +      for (; names != NULL; names = names->next)
>   +	pglob->gl_pathv[pglob->gl_pathc++] = names->name;
>   +      pglob->gl_pathv[pglob->gl_pathc] = NULL;
>   +
>   +      pglob->gl_flags = flags;
>   +    }
>   +
>   +  save = errno;
>   +  if (stream != NULL)
>   +    {
>   +      if (flags & GLOB_ALTDIRFUNC)
>   +	(*pglob->gl_closedir) (stream);
>   +      else
>   +	closedir ((DIR *) stream);
>   +    }
>   +  __set_errno (save);
>   +
>   +  return nfound == 0 ? GLOB_NOMATCH : 0;
>   +
>   + memory_error:
>   +  {
>   +    save = errno;
>   +    if (flags & GLOB_ALTDIRFUNC)
>   +      (*pglob->gl_closedir) (stream);
>   +    else
>   +      closedir ((DIR *) stream);
>   +    __set_errno (save);
>   +  }
>   +  while (names != NULL)
>   +    {
>   +      if (names->name != NULL)
>   +	free ((__ptr_t) names->name);
>   +      names = names->next;
>   +    }
>   +  return GLOB_NOSPACE;
>   +}
>   +/*@=unrecog@*/
>   +/*@=unqualifiedtrans@*/
>   +/*@=temptrans@*/
>   +/*@=sizeoftype@*/
>   +/*@=shadow@*/
>   +/*@=retvalint@*/
>   +/*@=retalias@*/
>   +/*@=protoparammatch@*/
>   +/*@=onlytrans@*/
>   +/*@=nullpass@*/
>   +/*@=noeffectuncon@*/
>   +/*@=modunconnomods@*/
>   +/*@=moduncon@*/
>   +/*@=mods@*/
>   +/*@=modnomods@*/
>   +/*@=loopswitchbreak@*/
>   +/*@=internalglobs@*/
>   +/*@=immediatetrans@*/
>   +/*@=compdef@*/
>   +/*@=branchstate@*/
>   +/*@=bounds@*/
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/glob.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r0 -r2.1 glob.h
>   --- /dev/null	2008-07-31 18:55:00 +0200
>   +++ glob.h	2008-07-31 18:58:58 +0200
>   @@ -0,0 +1,205 @@
>   +/* Copyright (C) 1991, 92, 95, 96, 97, 98, 2000 Free Software  
> Foundation, Inc.
>   +
>   +   The GNU C Library is free software; you can redistribute it  
> and/or
>   +   modify it under the terms of the GNU Library General Public  
> License as
>   +   published by the Free Software Foundation; either version 2  
> of the
>   +   License, or (at your option) any later version.
>   +
>   +   The GNU C Library 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
>   +   Library General Public License for more details.
>   +
>   +   You should have received a copy of the GNU Library General  
> Public
>   +   License along with the GNU C Library; see the file  
> COPYING.LIB.  If not,
>   +   write to the Free Software Foundation, Inc., 59 Temple Place  
> - Suite 330,
>   +   Boston, MA 02111-1307, USA.  */
>   +
>   +#ifndef	_GLOB_H
>   +#define	_GLOB_H	1
>   +
>   +#if defined(hpux) || defined(__hpux)
>   +#define _GLOB_INCLUDED
>   +#endif
>   +
>   +#ifdef	__cplusplus
>   +extern "C" {
>   +#endif
>   +
>   +#undef	__ptr_t
>   +#if defined __cplusplus || (defined __STDC__ && __STDC__) ||  
> defined WINDOWS32
>   +# if !defined __GLIBC__ || !defined __P || !defined __PMT
>   +#  undef __P
>   +#  undef __PMT
>   +#  define __P(protos)	protos
>   +#  define __PMT(protos)	protos
>   +#  if !defined __GNUC__ || __GNUC__ < 2
>   +#   undef __const
>   +#   define __const const
>   +#  endif
>   +# endif
>   +# define __ptr_t	void *
>   +#else /* Not C++ or ANSI C.  */
>   +# undef	__P
>   +# undef __PMT
>   +# define __P(protos)	()
>   +# define __PMT(protos)	()
>   +# undef	__const
>   +# define __const
>   +# define __ptr_t	char *
>   +#endif /* C++ or ANSI C.  */
>   +
>   +/* We need `size_t' for the following definitions.  */
>   +#if !defined(__size_t) && !defined(_BSD_SIZE_T_DEFINED_)
>   +# if defined __GNUC__ && __GNUC__ >= 2
>   +typedef __SIZE_TYPE__ __size_t;
>   +#  if 0
>   +#  ifdef _XOPEN_SOURCE
>   +typedef __SIZE_TYPE__ size_t;
>   +#  endif
>   +#  endif
>   +# else
>   +/* This is a guess.  */
>   +typedef unsigned long int __size_t;
>   +# endif
>   +#else
>   +/* The GNU CC stddef.h version defines __size_t as empty.  We  
> need a real
>   +   definition.  */
>   +# undef __size_t
>   +# define __size_t size_t
>   +#endif
>   +
>   +/* Bits set in the FLAGS argument to `glob'.  */
>   +#define	GLOB_ERR	(1 << 0)/* Return on read errors.  */
>   +#define	GLOB_MARK	(1 << 1)/* Append a slash to each name.  */
>   +#define	GLOB_NOSORT	(1 << 2)/* Don't sort the names.  */
>   +#define	GLOB_DOOFFS	(1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
>   +#define	GLOB_NOCHECK	(1 << 4)/* If nothing matches, return the  
> pattern.  */
>   +#define	GLOB_APPEND	(1 << 5)/* Append to results of a previous  
> call.  */
>   +#define	GLOB_NOESCAPE	(1 << 6)/* Backslashes don't quote  
> metacharacters.  */
>   +#define	GLOB_PERIOD	(1 << 7)/* Leading `.' can be matched by  
> metachars.  */
>   +
>   +#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined  
> _BSD_SOURCE \
>   +     || defined _GNU_SOURCE)
>   +# define GLOB_MAGCHAR	 (1 << 8)/* Set in gl_flags if any  
> metachars seen.  */
>   +# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al  
> functions.  */
>   +# define GLOB_BRACE	 (1 << 10)/* Expand "{a,b}" to "a" "b".  */
>   +# define GLOB_NOMAGIC	 (1 << 11)/* If no magic chars, return the  
> pattern.  */
>   +# define GLOB_TILDE	 (1 << 12)/* Expand ~user and ~ to home  
> directories. */
>   +# define GLOB_ONLYDIR	 (1 << 13)/* Match only directories.  */
>   +# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return  
> an error
>   +				      if the user name is not available.  */
>   +# define __GLOB_FLAGS	(GLOB_ERR|GLOB_MARK|GLOB_NOSORT| 
> GLOB_DOOFFS| \
>   +			 GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
>   +			 GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE|     \
>   +			 GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK)
>   +#else
>   +# define __GLOB_FLAGS	(GLOB_ERR|GLOB_MARK|GLOB_NOSORT| 
> GLOB_DOOFFS| \
>   +			 GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
>   +			 GLOB_PERIOD)
>   +#endif
>   +
>   +/* Error returns from `glob'.  */
>   +#define	GLOB_NOSPACE	1	/* Ran out of memory.  */
>   +#define	GLOB_ABORTED	2	/* Read error.  */
>   +#define	GLOB_NOMATCH	3	/* No matches found.  */
>   +#define GLOB_NOSYS	4	/* Not implemented.  */
>   +#ifdef _GNU_SOURCE
>   +/* Previous versions of this file defined GLOB_ABEND instead of
>   +   GLOB_ABORTED.  Provide a compatibility definition here.  */
>   +# define GLOB_ABEND GLOB_ABORTED
>   +#endif
>   +
>   +/* Structure describing a globbing run.  */
>   +#if !defined _AMIGA && !defined VMS /* Buggy compiler.   */
>   +struct stat;
>   +#endif
>   +typedef struct
>   +  {
>   +    __size_t gl_pathc;		/* Count of paths matched by the  
> pattern.  */
>   +    char **gl_pathv;		/* List of matched pathnames.  */
>   +    __size_t gl_offs;		/* Slots to reserve in `gl_pathv'.  */
>   +    int gl_flags;		/* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
>   +
>   +    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
>   +       are used instead of the normal file access functions.  */
>   +    void (*gl_closedir) __PMT ((void *));
>   +    struct dirent *(*gl_readdir) __PMT ((void *));
>   +    __ptr_t (*gl_opendir) __PMT ((__const char *));
>   +    int (*gl_lstat) __PMT ((__const char *, struct stat *));
>   +    int (*gl_stat) __PMT ((__const char *, struct stat *));
>   +  } glob_t;
>   +
>   +#ifdef _LARGEFILE64_SOURCE
>   +struct stat64;
>   +typedef struct
>   +  {
>   +    __size_t gl_pathc;
>   +    char **gl_pathv;
>   +    __size_t gl_offs;
>   +    int gl_flags;
>   +
>   +    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
>   +       are used instead of the normal file access functions.  */
>   +    void (*gl_closedir) __PMT ((void *));
>   +    struct dirent64 *(*gl_readdir) __PMT ((void *));
>   +    __ptr_t (*gl_opendir) __PMT ((__const char *));
>   +    int (*gl_lstat) __PMT ((__const char *, struct stat64 *));
>   +    int (*gl_stat) __PMT ((__const char *, struct stat64 *));
>   +  } glob64_t;
>   +#endif
>   +
>   +/* Do glob searching for PATTERN, placing results in PGLOB.
>   +   The bits defined above may be set in FLAGS.
>   +   If a directory cannot be opened or read and ERRFUNC is not nil,
>   +   it is called with the pathname that caused the error, and the
>   +   `errno' value from the failing call; if it returns non-zero
>   +   `glob' returns GLOB_ABEND; if it returns zero, the error is  
> ignored.
>   +   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is  
> returned.
>   +   Otherwise, `glob' returns zero.  */
>   +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS != 64
>   +extern int glob __P ((__const char *__pattern, int __flags,
>   +		      int (*__errfunc) (__const char *, int),
>   +		      glob_t *__pglob));
>   +
>   +/* Free storage allocated in PGLOB by a previous `glob' call.  */
>   +extern void globfree __P ((glob_t *__pglob));
>   +#else
>   +# if defined(__GNUC__) && __GNUC__ >= 2
>   +extern int glob __P ((__const char *__pattern, int __flags,
>   +		      int (*__errfunc) (__const char *, int),
>   +		      glob_t *__pglob)) __asm__ ("glob64");
>   +
>   +extern void globfree __P ((glob_t *__pglob)) __asm__  
> ("globfree64");
>   +# else
>   +#  define glob glob64
>   +#  define globfree globfree64
>   +#  define glob_t glob64_t
>   +# endif
>   +#endif
>   +
>   +#ifdef _LARGEFILE64_SOURCE
>   +/*@-protoparammatch -type @*/
>   +extern int glob64 __P ((__const char *__pattern, int __flags,
>   +			int (*__errfunc) (__const char *, int),
>   +			glob64_t *__pglob));
>   +
>   +extern void globfree64 __P ((glob64_t *__pglob));
>   +/*@=protoparammatch =type @*/
>   +#endif
>   +
>   +
>   +#ifdef _GNU_SOURCE
>   +/* Return nonzero if PATTERN contains any metacharacters.
>   +   Metacharacters can be quoted with backslashes if QUOTE is  
> nonzero.
>   +
>   +   This function is not part of the interface specified by POSIX.2
>   +   but several programs want to use it.  */
>   +extern int glob_pattern_p __P ((__const char *__pattern, int  
> __quote));
>   +#endif
>   +
>   +#ifdef	__cplusplus
>   +}
>   +#endif
>   +
>   +#endif /* glob.h  */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/mire.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.43 -r1.44 mire.c
>   --- rpm/rpmio/mire.c	13 Jun 2008 06:18:56 -0000	1.43
>   +++ rpm/rpmio/mire.c	31 Jul 2008 16:58:58 -0000	1.44
>   @@ -3,7 +3,7 @@
>     */
>    #include "system.h"
>
>   -#include <rpmio.h>	/* XXX _free */
>   +#include <rpmiotypes.h>
>    #include <rpmlog.h>
>
>    #define	_MIRE_INTERNAL
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmhash.c
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.11 -r1.12 rpmhash.c
>   --- rpm/rpmio/rpmhash.c	31 Jul 2008 02:40:10 -0000	1.11
>   +++ rpm/rpmio/rpmhash.c	31 Jul 2008 16:58:58 -0000	1.12
>   @@ -32,18 +32,6 @@
>    };
>
>    /**
>   - * Wrapper to free(3), hides const compilation noise, permit  
> NULL, return NULL.
>   - * @param p		memory to free
>   - * @retval		NULL always
>   - */
>   -/*@unused@*/ static inline /*@null@*/ void *
>   -_free(/*@only@*/ /*@null@*/ const void * p) /*@modifies p@*/
>   -{
>   -    if (p != NULL)	free((void *)p);
>   -    return NULL;
>   -}
>   -
>   -/**
>     * Find entry in hash table.
>     * @param ht            pointer to hash table
>     * @param key           pointer to key value
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmio.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.77 -r1.78 rpmio.h
>   --- rpm/rpmio/rpmio.h	18 Jul 2008 01:31:56 -0000	1.77
>   +++ rpm/rpmio/rpmio.h	31 Jul 2008 16:58:58 -0000	1.78
>   @@ -46,17 +46,6 @@
>    extern "C" {
>    #endif
>
>   -/**
>   - * RPM return codes.
>   - */
>   -typedef	enum rpmRC_e {
>   -    RPMRC_OK		= 0,	/*!< Generic success code */
>   -    RPMRC_NOTFOUND	= 1,	/*!< Generic not found code. */
>   -    RPMRC_FAIL		= 2,	/*!< Generic failure code. */
>   -    RPMRC_NOTTRUSTED	= 3,	/*!< Signature is OK, but key is not  
> trusted. */
>   -    RPMRC_NOKEY		= 4	/*!< Public key is unavailable. */
>   -} rpmRC;
>   -
>    /** \ingroup rpmio
>     * \name RPMIO Vectors.
>     */
>   @@ -715,86 +704,6 @@
>    /*@=exportlocal@*/
>    /*@}*/
>
>   -/*@unused@*/ static inline int xislower(int c) /*@*/ {
>   -    return (c >= (int)'a' && c <= (int)'z');
>   -}
>   -/*@unused@*/ static inline int xisupper(int c) /*@*/ {
>   -    return (c >= (int)'A' && c <= (int)'Z');
>   -}
>   -/*@unused@*/ static inline int xisalpha(int c) /*@*/ {
>   -    return (xislower(c) || xisupper(c));
>   -}
>   -/*@unused@*/ static inline int xisdigit(int c) /*@*/ {
>   -    return (c >= (int)'0' && c <= (int)'9');
>   -}
>   -/*@unused@*/ static inline int xisalnum(int c) /*@*/ {
>   -    return (xisalpha(c) || xisdigit(c));
>   -}
>   -/*@unused@*/ static inline int xisblank(int c) /*@*/ {
>   -    return (c == (int)' ' || c == (int)'\t');
>   -}
>   -/*@unused@*/ static inline int xisspace(int c) /*@*/ {
>   -    return (xisblank(c) || c == (int)'\n' || c == (int)'\r' || c  
> == (int)'\f' || c == (int)'\v');
>   -}
>   -/*@unused@*/ static inline int xiscntrl(int c) /*@*/ {
>   -    return (c < (int)' ');
>   -}
>   -/*@unused@*/ static inline int xisascii(int c) /*@*/ {
>   -    return ((c & 0x80) != 0x80);
>   -}
>   -/*@unused@*/ static inline int xisprint(int c) /*@*/ {
>   -    return (c >= (int)' ' && xisascii(c));
>   -}
>   -/*@unused@*/ static inline int xisgraph(int c) /*@*/ {
>   -    return (c > (int)' ' && xisascii(c));
>   -}
>   -/*@unused@*/ static inline int xispunct(int c) /*@*/ {
>   -    return (xisgraph(c) && !xisalnum(c));
>   -}
>   -
>   -/*@unused@*/ static inline int xtolower(int c) /*@*/ {
>   -    return ((xisupper(c)) ? (c | ('a' - 'A')) : c);
>   -}
>   -/*@unused@*/ static inline int xtoupper(int c) /*@*/ {
>   -    return ((xislower(c)) ? (c & ~('a' - 'A')) : c);
>   -}
>   -
>   -/** \ingroup rpmio
>   - * Locale insensitive strcasecmp(3).
>   - */
>   -int xstrcasecmp(const char * s1, const char * s2)		/*@*/;
>   -
>   -/** \ingroup rpmio
>   - * Locale insensitive strncasecmp(3).
>   - */
>   -int xstrncasecmp(const char *s1, const char * s2, size_t n)	/*@*/;
>   -
>   -/** \ingroup rpmio
>   - * Force encoding of string.
>   - */
>   -/*@only@*/ /*@null@*/
>   -const char * xstrtolocale(/*@only@*/ const char *str)
>   -	/*@modifies *str @*/;
>   -
>   -#if !defined(SWIG)
>   -/**
>   - * Wrapper to free(3), hides const compilation noise, permit  
> NULL, return NULL.
>   - * @param p		memory to free
>   - * @return		NULL always
>   - */
>   -#if defined(WITH_DMALLOC)
>   -#define _free(p) ((p) != NULL ? free((void *)(p)) : (void)0, NULL)
>   -#else
>   -/*@unused@*/ static inline /*@null@*/
>   -void * _free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p)
>   -	/*@modifies p @*/
>   -{
>   -    if (p != NULL)	free((void *)p);
>   -    return NULL;
>   -}
>   -#endif
>   -#endif
>   -
>    /**
>     * Free all memory allocated by rpmio usage.
>     */
>   @@ .
>   patch -p0 <<'@@ .'
>   Index: rpm/rpmio/rpmiotypes.h
>    
> ====================================================================== 
> ======
>   $ cvs diff -u -r1.3 -r1.4 rpmiotypes.h
>   --- rpm/rpmio/rpmiotypes.h	31 Jul 2008 02:40:10 -0000	1.3
>   +++ rpm/rpmio/rpmiotypes.h	31 Jul 2008 16:58:58 -0000	1.4
>   @@ -6,6 +6,17 @@
>     */
>
>    /**
>   + * RPM return codes.
>   + */
>   +typedef	enum rpmRC_e {
>   +    RPMRC_OK		= 0,	/*!< Generic success code */
>   +    RPMRC_NOTFOUND	= 1,	/*!< Generic not found code. */
>   +    RPMRC_FAIL		= 2,	/*!< Generic failure code. */
>   +    RPMRC_NOTTRUSTED	= 3,	/*!< Signature is OK, but key is not  
> trusted. */
>   +    RPMRC_NOKEY		= 4	/*!< Public key is unavailable. */
>   +} rpmRC;
>   +
>   +/**
>     * Private int typedefs to avoid C99 portability issues.
>     */
>    typedef	unsigned char		rpmuint8_t;
>   @@ -62,6 +73,86 @@
>            /*@globals internalState@*/
>            /*@modifies internalState@*/;
>
>   +#if !defined(SWIG)
>   +/**
>   + * Wrapper to free(3), hides const compilation noise, permit  
> NULL, return NULL.
>   + * @param p		mem