apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Joe Orton <jor...@redhat.com>
Subject Re: ABI change when _FILE_OFFSET_BITS=64 due to use of ino_t
Date Fri, 12 Oct 2007 14:53:26 GMT
On Tue, Sep 18, 2007 at 08:37:57PM +0300, Lucian Adrian Grijincu wrote:
> I see that some of my messages may have not hit the list:
> http://mail-archives.apache.org/mod_mbox/apr-dev/200709.mbox/browser
> only lists a few.
> 
> I've added a bug to bugzilla and attached patches for all three
> development branches: 0.9.x, 1.2.x and trunk.
> 
> http://issues.apache.org/bugzilla/show_bug.cgi?id=43417

Thanks for the patches.  

The placement of the configure tests was not quite right - it would not 
have effect if --disable-lfs was used.  I also think it's unnecessary to 
hard-code ino_t for anything other than the "unsigned long" case; e.g. 
there are no platforms where the native ino_t is a 64-bit type *and* 
will vary by _FILE_OFFSET_BITS, to my knowledge.

Here's an updated patch:

Index: configure.in
===================================================================
--- configure.in	(revision 583792)
+++ configure.in	(working copy)
@@ -1456,6 +1456,21 @@
 fi
 AC_MSG_RESULT($off_t_value)
 
+# Regardless of whether _LARGEFILE64_SOURCE is used, on 32-bit
+# platforms _FILE_OFFSET_BITS will affect the size of ino_t and hence
+# the build-time ABI may be different from the apparent ABI when using
+# APR with another package which *does* define _FILE_OFFSET_BITS.
+# (Exactly as per the case above with off_t where LFS is *not* used)
+#
+# To be safe, hard-code apr_ino_t as 'unsigned long' iff that is
+# exactly the size of ino_t here; otherwise use ino_t as existing
+# releases did.  To be correct, apr_ino_t should have been made an
+# ino64_t as apr_off_t is off64_t, but this can't be done now without
+# breaking ABI.
+ino_t_value=ino_t
+APR_CHECK_TYPES_COMPATIBLE(ino_t, unsigned long, ino_t_value="unsigned long")
+AC_MSG_NOTICE([using $ino_t_value for ino_t])
+
 APR_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], pid_t, 8)
 
 if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_short"; then
@@ -1495,6 +1510,7 @@
 AC_SUBST(size_t_value)
 AC_SUBST(ssize_t_value)
 AC_SUBST(socklen_t_value)
+AC_SUBST(ino_t_value)
 AC_SUBST(int64_t_fmt) 
 AC_SUBST(uint64_t_fmt) 
 AC_SUBST(uint64_t_hex_fmt) 
Index: include/apr.h.in
===================================================================
--- include/apr.h.in	(revision 583792)
+++ include/apr.h.in	(working copy)
@@ -283,6 +283,7 @@
 typedef  @ssize_t_value@         apr_ssize_t;
 typedef  @off_t_value@           apr_off_t;
 typedef  @socklen_t_value@       apr_socklen_t;
+typedef  @ino_t_value@           apr_ino_t;
 
 #define APR_SIZEOF_VOIDP @voidp_size@
 
Index: include/apr_file_info.h
===================================================================
--- include/apr_file_info.h	(revision 583792)
+++ include/apr_file_info.h	(working copy)
@@ -125,16 +125,10 @@
 typedef apr_int32_t               apr_fileperms_t;
 #if (defined WIN32) || (defined NETWARE)
 /**
- * Structure for determining the inode of the file.
- */
-typedef apr_uint64_t              apr_ino_t;
-/**
  * Structure for determining the device the file is on.
  */
 typedef apr_uint32_t              apr_dev_t;
 #else
-/** The inode of the file. */
-typedef ino_t                     apr_ino_t;
 /**
  * Structure for determining the device the file is on.
  */
Index: include/apr.hw
===================================================================
--- include/apr.hw	(revision 583792)
+++ include/apr.hw	(working copy)
@@ -346,6 +346,8 @@
 #endif
 typedef  int         apr_socklen_t;
 
+typedef apr_uint64_t       apr_ino_t;
+
 /* Are we big endian? */
 /* XXX: Fatal assumption on Alpha platforms */
 #define APR_IS_BIGENDIAN	0
Index: include/apr.hnw
===================================================================
--- include/apr.hnw	(revision 583792)
+++ include/apr.hnw	(working copy)
@@ -256,6 +256,8 @@
 typedef  size_t            apr_socklen_t;
 #endif
 
+typedef apr_uint64_t       apr_ino_t;
+
 /* Are we big endian? */
 /* XXX: Fatal assumption on Alpha platforms */
 #define APR_IS_BIGENDIAN	0

Mime
View raw message