This likely needs some context ...
rpmmtree derived from BSD still has some *BSD peculier API usages,
strtouq(), asprintf() and strvis()
just to mention some of the portability issues.
Normally I'd just rewrite rpmmtree.c to avoid the portability issues,
and will likely do that with
rpmmtree(8) somewhen soon as well.
However, rpm.org is making heavy usage of something called
"rasprintf", so some sort
of malloc'ing printf simplifies stealing code from rpm.org. I prefer
the well known asprintf(3) API,
which is often present in system libraries, to a home rolled custom
malloc'ing printf gadget API.
strtouq(3) is almost certainly going to have some portability issues
somewhere (my guess). Dunno
the best answer, time to find out.
And I still don't know what to do with the strvis(3) usages in
rpmmtree. Internal to rpmmtree
a while longer hurts little for now.
hth
73 de Jeff
On Jul 28, 2008, at 10:35 AM, 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: 28-Jul-2008
> 16:35:27
> Branch: HEAD Handle: 2008072814352501
>
> Added files:
> rpm/misc asprintf.h
> Modified files:
> rpm CHANGES configure.ac
> rpm/misc Makefile.am
> rpm/rpmdb rpmdb.c sqlite.c
> rpm/tools rpmmtree.c
>
> Log:
> - QNX: use strtouq() instead of strtoul() in rpmmtree.
> - QNX: retrofit asprintf.h (from XAR) for the deprived.
> rpmmtree uses
> (rewrite to eliminate asprintf is an alternative).
> - QNX: supply missing typedef's for uint32_t.
>
> Summary:
> Revision Changes Path
> 1.2509 +4 -0 rpm/CHANGES
> 2.305 +1 -1 rpm/configure.ac
> 1.34 +1 -1 rpm/misc/Makefile.am
> 1.1 +92 -0 rpm/misc/asprintf.h
> 1.253 +1 -1 rpm/rpmdb/rpmdb.c
> 1.34 +1 -1 rpm/rpmdb/sqlite.c
> 2.3 +10 -2 rpm/tools/rpmmtree.c
>
> ______________________________________________________________________
> ______
>
> patch -p0 <<'@@ .'
> Index: rpm/CHANGES
>
> ======================================================================
> ======
> $ cvs diff -u -r1.2508 -r1.2509 CHANGES
> --- rpm/CHANGES 20 Jul 2008 00:04:51 -0000 1.2508
> +++ rpm/CHANGES 28 Jul 2008 14:35:25 -0000 1.2509
> @@ -1,5 +1,9 @@
>
> 5.1.0 -> 5.2a0:
> + - jbj: QNX: use strtouq() instead of strtoul() in rpmmtree.
> + - jbj: QNX: retrofit asprintf.h (from XAR) for the deprived.
> rpmmtree uses
> + (rewrite to eliminate asprintf is an alternative).
> + - jbj: QNX: supply missing typedef's for uint32_t.
> - jbj: add alternative %{sparcx} macro shorthand (bz #455972).
> - jbj: rpmio: add new link/unlink methods to loader map.
> - jbj: python: add rpm.Keyring/rpm.Pubkey subtype methods
> for rpmkeyring.
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/configure.ac
>
> ======================================================================
> ======
> $ cvs diff -u -r2.304 -r2.305 configure.ac
> --- rpm/configure.ac 15 Jul 2008 18:57:09 -0000 2.304
> +++ rpm/configure.ac 28 Jul 2008 14:35:25 -0000 2.305
> @@ -686,7 +686,7 @@
>
> dnl checks for library functions (generic)
> AC_CHECK_FUNCS([dnl
> - basename getaddrinfo getcwd getnameinfo getwd iconv
> inet_aton confstr dnl
> + asprintf basename getaddrinfo getcwd getnameinfo getwd iconv
> inet_aton confstr dnl
> mtrace putenv realpath setenv clearenv stpcpy stpncpy
> strcspn strdup dnl
> strndup strerror strtol strtoul strspn strstr sighold
> sigrelse sigpause dnl
> sigprocmask sigemptyset sigaddset sigdelset sigsuspend
> madvise dnl
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/misc/Makefile.am
>
> ======================================================================
> ======
> $ cvs diff -u -r1.33 -r1.34 Makefile.am
> --- rpm/misc/Makefile.am 28 Apr 2008 16:40:28 -0000 1.33
> +++ rpm/misc/Makefile.am 28 Jul 2008 14:35:26 -0000 1.34
> @@ -7,7 +7,7 @@
> -I$(top_srcdir)
>
> EXTRA_DIST = \
> - librpmmisc.vers \
> + 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 \
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/misc/asprintf.h
>
> ======================================================================
> ======
> $ cvs diff -u -r0 -r1.1 asprintf.h
> --- /dev/null 2008-07-28 16:33:00 +0200
> +++ asprintf.h 2008-07-28 16:35:26 +0200
> @@ -0,0 +1,92 @@
> +//
> ======================================================================
> ========
> +//
> +// Copyright (C) 2005 Jason Evans <jasone@canonware.com>. All
> rights reserved.
> +//
> +// Redistribution and use in source and binary forms, with or
> without
> +// modification, are permitted provided that the following
> conditions are met:
> +//
> +// 1. Redistributions of source code must retain the above
> copyright notice(s),
> +// this list of conditions and the following disclaimer
> unmodified other than
> +// the allowable addition of one or more copyright notices.
> +//
> +// 2. Redistributions in binary form must reproduce the above
> copyright
> +// notice(s), this list of conditions and the following
> disclaimer in the
> +// documentation and/or other materials provided with the
> distribution.
> +//
> +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) `AS IS'
> AND ANY EXPRESS
> +// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> IMPLIED WARRANTIES
> +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> DISCLAIMED. IN
> +// NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
> DIRECT, INDIRECT,
> +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> (INCLUDING, BUT NOT
> +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE, DATA,
> +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
> ANY THEORY OF
> +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> (INCLUDING
> +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> THIS SOFTWARE,
> +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +//
> +//
> ======================================================================
> ========
> +//
> +// Emulate vasprintf() and asprintf().
> +//
> +//
> ======================================================================
> ========
> +
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <stdarg.h>
> +
> +static inline int
> +vasprintf(char **rResult, const char *aFormat, va_list aAp)
> +{
> + int rVal;
> + char *result;
> + va_list ap;
> +#define XarAsprintfStartLen 16
> +
> + result = (char *) malloc(XarAsprintfStartLen);
> + if (result == NULL)
> + {
> + rVal = -1;
> + goto RETURN;
> + }
> +
> + va_copy(ap, aAp);
> + rVal = vsnprintf(result, XarAsprintfStartLen, aFormat, ap);
> + va_end(ap);
> +
> + if (rVal == -1)
> + {
> + goto RETURN;
> + }
> + else if (rVal >= XarAsprintfStartLen)
> + {
> + free(result);
> + result = (char *) malloc(rVal + 1);
> + if (result == NULL)
> + {
> + rVal = -1;
> + goto RETURN;
> + }
> +
> + va_copy(ap, aAp);
> + rVal = vsnprintf(result, rVal + 1, aFormat, aAp);
> + va_end(ap);
> + }
> +
> + *rResult = result;
> + RETURN:
> +#undef XarAsprintfStartLen
> + return rVal;
> +}
> +
> +static inline int
> +asprintf(char **rResult, const char *aFormat, ...)
> +{
> + int rVal;
> + va_list ap;
> +
> + va_start(ap, aFormat);
> + rVal = vasprintf(rResult, aFormat, ap);
> + va_end(ap);
> +
> + return rVal;
> +}
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/rpmdb/rpmdb.c
>
> ======================================================================
> ======
> $ cvs diff -u -r1.252 -r1.253 rpmdb.c
> --- rpm/rpmdb/rpmdb.c 3 Jul 2008 18:01:19 -0000 1.252
> +++ rpm/rpmdb/rpmdb.c 28 Jul 2008 14:35:26 -0000 1.253
> @@ -46,7 +46,7 @@
>
> /* XXX retrofit the *BSD typedef for the deprived. */
> #if defined(__QNXNTO__)
> -typedef u_int32_t uint32_t;
> +typedef uint32_t u_int32_t;
> #endif
>
> /*@access dbiIndexSet@*/
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/rpmdb/sqlite.c
>
> ======================================================================
> ======
> $ cvs diff -u -r1.33 -r1.34 sqlite.c
> --- rpm/rpmdb/sqlite.c 12 Mar 2008 19:41:13 -0000 1.33
> +++ rpm/rpmdb/sqlite.c 28 Jul 2008 14:35:26 -0000 1.34
> @@ -59,7 +59,7 @@
>
> /* XXX retrofit the *BSD typedef for the deprived. */
> #if defined(__QNXNTO__)
> -typedef u_int32_t uint32_t;
> +typedef uint32_t u_int32_t;
> #endif
>
> /*@unchecked@*/
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/tools/rpmmtree.c
>
> ======================================================================
> ======
> $ cvs diff -u -r2.2 -r2.3 rpmmtree.c
> --- rpm/tools/rpmmtree.c 16 Jun 2008 09:41:28 -0000 2.2
> +++ rpm/tools/rpmmtree.c 28 Jul 2008 14:35:26 -0000 2.3
> @@ -43,6 +43,10 @@
> #include <signal.h>
> #include <stdarg.h>
>
> +#if !defined(HAVE_ASPRINTF)
> +#include "asprintf.h"
> +#endif
> +
> #if defined(__FreeBSD__) || defined(__NetBSD__) || defined
> (__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
> #define HAVE_ST_FLAGS 1 /* XXX TODO: should be AutoFu test */
> #else
> @@ -53,6 +57,10 @@
> #define st_mtimespec st_mtim
> #endif
>
> +#if defined(__QNXNTO__)
> +#define st_mtimespec st_mtime
> +#endif
> +
> #include <rpmio_internal.h> /* XXX fdInitDigest() et al */
> #include <fts.h>
> #include <ugid.h>
> @@ -1015,7 +1023,7 @@
> /*==============================================================*/
>
> /* XXX *BSD systems already have getmode(3) and setmode(3) */
> -#if defined(__linux__) || defined(__LCLINT__)
> +#if defined(__linux__) || defined(__LCLINT__) || defined
> (__QNXNTO__)
> #if !defined(HAVE_GETMODE) || !defined(HAVE_SETMODE)
>
> #define SET_LEN 6 /* initial # of bitcmd struct to malloc */
> @@ -1500,7 +1508,7 @@
> /*@switchbreak@*/ break;
> case MTREE_KEYS_SIZE:
> /*@-unrecog@*/
> - ip->sb.st_size = strtouq(val, &ep, 10);
> + ip->sb.st_size = strtoul(val, &ep, 10);
> /*@=unrecog@*/
> if (*ep != '\0')
> mtree_error("invalid size %s", val);
> @@ .
> ______________________________________________________________________
> RPM Package Manager http://rpm5.org
> CVS Sources Repository rpm-cvs@rpm5.org
Received on Mon Jul 28 16:54:12 2008