Skip to content

Commit

Permalink
Fix large file system support
Browse files Browse the repository at this point in the history
libupnp uses large file support (if available). If a program linking to
libupnp does not however it creates mismatches in callframes. See
Issue pupnp#51 for the results.

This simplifies LFS support by using AC_SYS_LARGEFILE_SENSITIVE instead of
manually defining _LARGE_FILE_SOURCE and _FILE_OFFSET_BITS (which is
useless on architectures where the size of off_t is fixed).

Furthermore additional logic is introduced to catch a library user without
64 bit wide off_t on such a platform.

upnp.h also makes use of off_t, but as this file includes FileInfo.h, the
latter is the single right place for this check.

This fixes pupnp#52 which is a generalized variant of pupnp#51.
  • Loading branch information
ukleinek committed Sep 3, 2017
1 parent 6584d88 commit 74c98de
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 17 deletions.
12 changes: 5 additions & 7 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,11 @@ AC_CANONICAL_HOST
# installed libraries.
#
AC_CONFIG_HEADERS([autoconfig.h upnp/inc/upnpconfig.h])
#AC_SYS_LARGEFILE_SENSITIVE
AX_SYS_LARGEFILE_SENSITIVE

if test "x$ac_cv_sys_largefile_sensitive" = "xyes"; then
AC_DEFINE([UPNP_LARGEFILE_SENSITIVE], 1, [whether the system defaults to 32bit off_t but can do 64bit when requested])
fi

AC_REVISION([$Revision: 1.11 $])

Expand Down Expand Up @@ -596,13 +600,7 @@ AX_CFLAGS_WARN_ALL
echo "-------------------------------------------------------------------------------"


#
# Lot's of stuff to ensure large file support
#
AC_TYPE_SIZE_T
AC_TYPE_OFF_T
AC_DEFINE([_LARGE_FILE_SOURCE], [], [Large files support])
AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size])


#
Expand Down
80 changes: 80 additions & 0 deletions m4/ax_sys_largefile_sensitive.m4
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# ===============================================================================
# https://www.gnu.org/software/autoconf-archive/ax_sys_largefile_sensitive.html
# ===============================================================================
#
# SYNOPSIS
#
# AX_SYS_LARGEFILE_SENSITIVE
#
# DESCRIPTION
#
# Check whether the current system is sensitive to -Ddefines making off_t
# having different types/sizes. Automatically define a config.h symbol
# LARGEFILE_SENSITIVE if that is the case, otherwise leave everything as
# is.
#
# This macro builds on top of AC_SYS_LARGEFILE to detect whether special
# options are neede to make the code use 64bit off_t - in many setups this
# will also make the code use 64bit off_t immediatly.
#
# The common use of a LARGEFILE_SENSITIVE config.h-define is to rename
# exported functions, usually adding a 64 to the original function name.
# Such renamings are only needed on systems being both (a) 32bit off_t by
# default and (b) implementing large.file extensions (as for unix98).
#
# a renaming section could look like this:
#
# #if defined LARGEFILE_SENSITIVE && _FILE_OFFSET_BITS+0 == 64
# #define zzip_open zzip_open64
# #define zzip_seek zzip_seek64
# #endif
#
# for libraries, it is best to take advantage of the prefix-config.h
# macro, otherwise you want to export a renamed LARGEFILE_SENSITIVE in an
# installed header file. -> see AX_PREFIX_CONFIG_H
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# This program 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 General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.

#serial 7

AU_ALIAS([AC_SYS_LARGEFILE_SENSITIVE], [AX_SYS_LARGEFILE_SENSITIVE])
AC_DEFUN([AX_SYS_LARGEFILE_SENSITIVE],[dnl
AC_REQUIRE([AC_SYS_LARGEFILE])dnl
# we know about some internals of ac_sys_largefile here...
AC_MSG_CHECKING(whether system differentiates 64bit off_t by defines)
ac_cv_sys_largefile_sensitive="no"
if test ".${ac_cv_sys_file_offset_bits-no}${ac_cv_sys_large_files-no}" != ".nono"
then ac_cv_sys_largefile_sensitive="yes"
AC_DEFINE(LARGEFILE_SENSITIVE, 1,
[whether the system defaults to 32bit off_t but can do 64bit when requested])
fi
AC_MSG_RESULT([$ac_cv_sys_largefile_sensitive])
])
4 changes: 4 additions & 0 deletions upnp/inc/FileInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
#include <sys/types.h> /* for off_t */
#include <time.h> /* for time_t */

#if defined UPNP_LARGEFILE_SENSITIVE && _FILE_OFFSET_BITS+0 != 64
#error libupnp uses large file support, so users must do that, too
#endif

#define CLASS UpnpFileInfo

#define EXPAND_CLASS_MEMBERS(CLASS) \
Expand Down
11 changes: 1 addition & 10 deletions upnp/inc/upnpconfig.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -54,20 +54,11 @@
#define UPNP_VERSION \
((UPNP_VERSION_MAJOR * 100 + UPNP_VERSION_MINOR) * 100 + UPNP_VERSION_PATCH)



/***************************************************************************
* Large file support
***************************************************************************/

/** File Offset size */
#undef _FILE_OFFSET_BITS

/** Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
#undef _LARGEFILE_SOURCE

/** Large files support */
#undef _LARGE_FILE_SOURCE
#undef UPNP_LARGEFILE_SENSITIVE

/***************************************************************************
* Library optional features
Expand Down

0 comments on commit 74c98de

Please sign in to comment.