--- rpm-4.2.1/lib/getdate.y	2002-01-17 23:56:22.000000000 +0200
+++ rpm-4.2.1.new/lib/getdate.y	2005-05-16 13:56:08.000000000 +0200
@@ -30,7 +30,10 @@
 #undef static
 #endif
 
+#ifndef OPENPKG_AIX
 #include <stdio.h>
+#endif
+
 #include <ctype.h>
 
 /* The code at the top of get_date which figures out the offset of the
--- rpm-4.2.1/system.h	2003-02-14 23:13:14.000000000 +0200
+++ rpm-4.2.1.new/system.h	2005-05-13 23:41:43.000000000 +0200
@@ -256,10 +256,6 @@
 #include <err.h>
 #endif
 
-#if HAVE_MALLOC_H && !defined(__LCLINT__)
-#include <malloc.h>
-#endif
-
 /*@-declundef -incondefs @*/ /* FIX: these are macros */
 /**
  */
@@ -550,7 +546,7 @@
 #define lchown chown
 #endif
 
-#if HAVE_GETMNTINFO_R || HAVE_MNTCTL
+#if HAVE_GETMNTINFO_R || HAVE_GETMNTINFO || HAVE_MNTCTL
 # define GETMNTENT_ONE 0
 # define GETMNTENT_TWO 0
 # if HAVE_SYS_MNTCTL_H
@@ -603,11 +599,21 @@
 
 #if defined(__LCLINT__)
 #define FILE_RCSID(id)
-#else
+#elif defined(__GNUC__)
 #define FILE_RCSID(id) \
 static inline const char *rcsid(const char *p) { \
         return rcsid(p = id); \
 }
+#else
+#define FILE_RCSID(id) \
+static const char *rcsid(const char *p) { \
+        return rcsid(p = id); \
+}
 #endif
 
+/* for basename(3) and dirname(3) */
+
+#ifndef OPENPKG_AIX
+#include <libgen.h>
+#endif
 #endif	/* H_SYSTEM */
--- rpm-4.2.1/rpmio/fts.c	2003-01-06 19:32:46.000000000 +0200
+++ rpm-4.2.1.new/rpmio/fts.c	2005-05-16 11:17:58.000000000 +0200
@@ -34,6 +34,8 @@
 static char sccsid[] = "@(#)fts.c	8.6 (Berkeley) 8/14/94";
 #endif /* LIBC_SCCS and not lint */
 
+#include <limits.h>
+
 #if defined(_LIBC)
 #include <sys/param.h>
 #include <include/sys/stat.h>
@@ -45,20 +47,49 @@
 #include <string.h>
 #include <unistd.h>
 #else
-#if defined(hpux)
+#if defined(OPENPKG_HPUX)
 # define        _INCLUDE_POSIX_SOURCE
 #   define __errno_location() 	(&errno)
 #   define dirfd(dirp)		-1
 #   define stat64		stat
 #   define _STAT_VER		0
 #   define __fxstat64(_stat_ver, _fd, _sbp)	fstat((_fd), (_sbp))
+#   define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
 #endif
-#if defined(sun)
+#if defined(sun) || defined(OPENPKG_UNIXWARE)
 #   define __errno_location()	(&errno)
 #   define dirfd(dirp)		-1
 #   define _STAT_VER		0
 #   define __fxstat64(_stat_ver, _fd, _sbp)	fstat((_fd), (_sbp))
 #endif
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENPKG_DARWIN)
+#   define __errno_location()	(&errno)
+#   define stat64 stat
+#   define _STAT_VER		0
+#   define __fxstat64(_stat_ver, _fd, _sbp)	fstat((_fd), (_sbp))
+#   define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+#endif
+#if defined(__osf__)
+#   define __errno_location()   (&errno)
+#   define dirfd(dirp)          -1
+#   define stat64               stat
+#   define _STAT_VER            0
+#   define __fxstat64(_stat_ver, _fd, _sbp)     fstat((_fd), (_sbp))
+#   define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+#endif
+#if defined(OPENPKG_AIX)
+#   define __errno_location()   (&errno)
+#   define _STAT_VER            0
+#   define dirfd(dirp)          ((dirp)->dd_fd) 
+#   define __fxstat64(_stat_ver, _fd, _sbp)     fstat((_fd), (_sbp))
+#   define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+#endif
+#if defined(OPENPKG_IRIX64)
+#   define __errno_location()   (&errno)
+#   define dirfd(dirp)          -1
+#   define __fxstat64(_stat_ver, _fd, _sbp)     fstat((_fd), (_sbp))
+#   define _D_EXACT_NAMLEN(d) ((d)->d_reclen)
+#endif
 #include "system.h"
 #include "fts.h"
 #include "rpmio.h"
@@ -73,7 +104,12 @@
 /* Largest alignment size needed, minus one.
    Usually long double is the worst case.  */
 #ifndef ALIGNBYTES
+#if defined(__GNUC__)
 #define ALIGNBYTES	(__alignof__ (long double) - 1)
+#else
+/* not accurate enough (usually too large), but sufficient (and this way equal safe) */
+#define ALIGNBYTES	(sizeof (long double) - 1)
+#endif
 #endif
 /* Align P to that size.  */
 #ifndef ALIGN
@@ -107,9 +143,13 @@
 	/*@modifies fileSystem, internalState @*/;
 
 #ifndef MAX
+#if defined(__GNUC__)
 #define MAX(a, b)	({ __typeof__ (a) _a = (a); \
 			   __typeof__ (b) _b = (b); \
 			   _a > _b ? _a : _b; })
+#else
+#define MAX(a, b)   ((a) > (b) ? (a) : (b))
+#endif
 #endif
 
 #define	ISDOT(a)	(a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
--- rpm-4.2.1/rpmio/rpmrpc.c	2003-05-30 00:14:04.000000000 +0200
+++ rpm-4.2.1.new/rpmio/rpmrpc.c	2005-05-13 23:13:11.000000000 +0200
@@ -1079,6 +1079,8 @@
     return rc;
 }
 
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(sun) && !defined(OPENPKG_DARWIN)
+
 struct __dirstream {
     int fd;			/* File descriptor.  */
     char * data;		/* Directory block.  */
@@ -1091,6 +1093,8 @@
 #endif
 };
 
+#endif
+
 #if !defined(DT_DIR)
 # define DT_UNKNOWN	0
 # define DT_FIFO	1
@@ -1101,14 +1105,30 @@
 # define DT_LNK		10
 # define DT_SOCK	12
 # define DT_WHT		14
-typedef struct __dirstream *	FTPDIR;
-#else
-typedef DIR *			FTPDIR;
 #endif
 
+struct mydirstreament {
+    unsigned char type;
+    char *name;
+};
+struct mydirstream {
+    DIR dir;
+    struct dirent ent;
+    unsigned int offset;
+    unsigned int size;
+    struct mydirstreament av[1];
+};
+typedef struct mydirstream *FTPDIR;
+
 /*@unchecked@*/
 static int ftpmagicdir = 0x8440291;
-#define	ISFTPMAGIC(_dir) (!memcmp((_dir), &ftpmagicdir, sizeof(ftpmagicdir)))
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(sun) && !defined(OPENPKG_UNIXWARE) && !defined(OPENPKG_DARWIN) && !defined(__osf__) && !defined(OPENPKG_IRIX64) && !defined(OPENPKG_HPUX) && !defined(OPENPKG_AIX)
+#define SETFTPMAGIC(_dir) ((_dir)->fd) = ftpmagicdir
+#define ISFTPMAGIC(_dir) ((_dir)->fd == ftpmagicdir)
+#else
+#define SETFTPMAGIC(_dir) ((_dir)->dd_fd) = ftpmagicdir
+#define ISFTPMAGIC(_dir) ((_dir)->dd_fd == ftpmagicdir)
+#endif
 
 /*@-boundswrite@*/
 /*@-type@*/ /* FIX: abstract DIR */
@@ -1121,8 +1141,7 @@
     struct dirent * dp;
     size_t nb;
     const char * s, * sb, * se;
-    const char ** av;
-    unsigned char * dt;
+    struct mydirstreament * av;
     char * t;
     int ac;
     int c;
@@ -1165,28 +1184,22 @@
 	}
     }
 
-    nb += sizeof(*mydir) + sizeof(*dp) + ((ac + 1) * sizeof(*av)) + (ac + 1);
+    nb = sizeof(*mydir) + (ac * sizeof(*av)) + nb;
     mydir = xcalloc(1, nb);
     /*@-abstract@*/
-    dp = (struct dirent *) (mydir + 1);
-    av = (const char **) (dp + 1);
-    dt = (char *) (av + (ac + 1));
-    t = (char *) (dt + ac + 1);
+    dp = &mydir->ent;
+    av = &mydir->av[0];
+    t  = (char *)&mydir->av[ac+1];
     /*@=abstract@*/
 
-    mydir->fd = ftpmagicdir;
-/*@-usereleased@*/
-    mydir->data = (char *) dp;
-/*@=usereleased@*/
-    mydir->allocation = nb;
-    mydir->size = ac;
-    mydir->offset = -1;
-    mydir->filepos = 0;
+    SETFTPMAGIC((DIR *)mydir);
+    mydir->size   = ac;
+    mydir->offset = 0;
 
     ac = 0;
     /*@-dependenttrans -unrecog@*/
-    dt[ac] = DT_DIR;	av[ac++] = t;	t = stpcpy(t, ".");	t++;
-    dt[ac] = DT_DIR;	av[ac++] = t;	t = stpcpy(t, "..");	t++;
+    av[ac].type = DT_DIR; av[ac].name = t; t = stpcpy(t, ".");  ++ac;
+    av[ac].type = DT_DIR; av[ac].name = t; t = stpcpy(t, ".."); ++ac;
     /*@=dependenttrans =unrecog@*/
     sb = NULL;
     s = se = ftpBuf;
@@ -1198,34 +1211,34 @@
 	    /*@switchbreak@*/ break;
 	case '\r':
 	    /*@-dependenttrans@*/
-	    av[ac] = t;
+	    av[ac].name = t;
 	    /*@=dependenttrans@*/
 	    if (sb == NULL) {
 		/*@-unrecog@*/
 		switch(*s) {
 		case 'p':
-		    dt[ac] = DT_FIFO;
+		    av[ac].type = DT_FIFO;
 		    /*@innerbreak@*/ break;
 		case 'c':
-		    dt[ac] = DT_CHR;
+		    av[ac].type = DT_CHR;
 		    /*@innerbreak@*/ break;
 		case 'd':
-		    dt[ac] = DT_DIR;
+		    av[ac].type = DT_DIR;
 		    /*@innerbreak@*/ break;
 		case 'b':
-		    dt[ac] = DT_BLK;
+		    av[ac].type = DT_BLK;
 		    /*@innerbreak@*/ break;
 		case '-':
-		    dt[ac] = DT_REG;
+		    av[ac].type = DT_REG;
 		    /*@innerbreak@*/ break;
 		case 'l':
-		    dt[ac] = DT_LNK;
+		    av[ac].type = DT_LNK;
 		    /*@innerbreak@*/ break;
 		case 's':
-		    dt[ac] = DT_SOCK;
+		    av[ac].type = DT_SOCK;
 		    /*@innerbreak@*/ break;
 		default:
-		    dt[ac] = DT_UNKNOWN;
+		    av[ac].type = DT_UNKNOWN;
 		    /*@innerbreak@*/ break;
 		}
 		/*@=unrecog@*/
@@ -1243,7 +1256,7 @@
 	    /*@switchbreak@*/ break;
 	}
     }
-    av[ac] = NULL;
+    av[ac].name = NULL;
 
 /*@-kepttrans@*/
     return (DIR *) mydir;
@@ -1258,43 +1271,50 @@
 {
     FTPDIR mydir = (FTPDIR)dir;
     struct dirent * dp;
-    const char ** av;
-    unsigned char * dt;
+    struct mydirstreament * av;
     int ac;
     int i;
 
     /*@+voidabstract@*/
-    if (mydir == NULL || !ISFTPMAGIC(mydir) || mydir->data == NULL) {
+    if (dir == NULL || !ISFTPMAGIC(dir)) {
 	/* XXX TODO: EBADF errno. */
 	return NULL;
     }
     /*@=voidabstract@*/
 
-    dp = (struct dirent *) mydir->data;
-    av = (const char **) (dp + 1);
+    dp = &mydir->ent;
+    av = &mydir->av[0];
     ac = mydir->size;
-    dt = (char *) (av + (ac + 1));
-    i = mydir->offset + 1;
+    i  = mydir->offset + 1;
 
 /*@-boundsread@*/
-    if (i < 0 || i >= ac || av[i] == NULL)
+    if (i < 0 || i >= ac || av[i].name == NULL)
 	return NULL;
 /*@=boundsread@*/
 
     mydir->offset = i;
 
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(OPENPKG_DARWIN)
+    dp->d_ino = i + 1;
+    dp->d_reclen = 0;
+    dp->d_type = av[i].type;
+    strncpy(dp->d_name, av[i].name, sizeof(dp->d_name) - 1);
+    dp->d_name[sizeof(dp->d_name)-1] = '\0';
+    dp->d_namlen = strlen(dp->d_name);
+#elif defined(OPENPKG_HPUX) || defined(sun) || defined(OPENPKG_UNIXWARE) || defined(__osf__) || defined(OPENPKG_IRIX64) || defined(OPENPKG_AIX)
+    /* XXX glob(3) uses REAL_DIR_ENTRY(dp) test on d_ino */
+    dp->d_ino = i + 1;		/* W2DO? */
+    dp->d_reclen = 0;		/* W2DO? */
+    strncpy(dp->d_name, av[i].name, sizeof(dp->d_name));
+#else
     /* XXX glob(3) uses REAL_DIR_ENTRY(dp) test on d_ino */
     dp->d_ino = i + 1;		/* W2DO? */
     dp->d_reclen = 0;		/* W2DO? */
-
-#if !defined(hpux) && !defined(sun)
     dp->d_off = 0;		/* W2DO? */
-/*@-boundsread@*/
-    dp->d_type = dt[i];
-/*@=boundsread@*/
+    dp->d_type = av[i].type;
+    strncpy(dp->d_name, av[i].name, sizeof(dp->d_name));
 #endif
 
-    strncpy(dp->d_name, av[i], sizeof(dp->d_name));
 /*@+voidabstract@*/
 if (_ftp_debug)
 fprintf(stderr, "*** ftpReaddir(%p) %p \"%s\"\n", (void *)mydir, dp, dp->d_name);
@@ -1313,7 +1333,7 @@
     /*@+voidabstract@*/
 if (_ftp_debug)
 fprintf(stderr, "*** ftpClosedir(%p)\n", (void *)mydir);
-    if (mydir == NULL || !ISFTPMAGIC(mydir)) {
+    if (dir == NULL || !ISFTPMAGIC(dir)) {
 	/* XXX TODO: EBADF errno. */
 	return -1;
     }
