2004-01-31 Marcus Brinkmann <marcus@g10code.de>

* configure.ac: Add invocation of AC_SYS_LARGEFILE, AC_TYPE_OFF_T
	and AC_FUNC_FSEEKO.

doc/
2004-02-01  Marcus Brinkmann  <marcus@g10code.de>

	* gpgme.texi (Largefile Support): New section.

gpgme/
2004-02-01  Marcus Brinkmann  <marcus@g10code.de>

	* data-compat.c (gpgme_data_new_from_filepart): Call fseeko if
	available.
	* data-stream.c (stream_seek): Likewise.
This commit is contained in:
Marcus Brinkmann 2004-02-01 13:39:45 +00:00
parent 0c2e282d2f
commit 68ab067358
8 changed files with 187 additions and 14 deletions

View File

@ -1,3 +1,8 @@
2004-01-31 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Add invocation of AC_SYS_LARGEFILE, AC_TYPE_OFF_T
and AC_FUNC_FSEEKO.
2004-01-12 Werner Koch <wk@gnupg.org> 2004-01-12 Werner Koch <wk@gnupg.org>
Released 0.4.4. Released 0.4.4.
@ -435,7 +440,7 @@
* autogen.sh: Added option --build-w32. * autogen.sh: Added option --build-w32.
Copyright 2001, 2002 g10 Code GmbH Copyright 2001, 2002, 2003, 2004 g10 Code GmbH
This file is free software; as a special exception the author gives This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without unlimited permission to copy and/or distribute it, with or without

65
NEWS
View File

@ -1,3 +1,66 @@
Noteworthy changes in version 0.4.5 (unreleased)
------------------------------------------------
* GPGME is now compiled with LFS (large file support) by default.
This means that _all_ programs using GPGME must be compiled with
LFS support enabled by default. You can do this easily with
autoconf, by using the AC_SYS_LARGEFILE macro. Or you can do this
without autoconf by defining the preprocessor symbol
_FILE_OFFSET_BITS to 64 (by passing the -D_FILE_OFFSET_BITS=64 to
the C compiler command line, or by defining this preprocessor
symbol before including any system header files). For more
details, read the section on LFS in the manual.
Up to now, it was undocumented that GPGME was not using LFS.
But the public interfaces use off_t, and file descriptors are
exchanged between the application and GPGME. This was an oversight,
and bound to cause troubles in the future.
Writing GPGME as a dual mode library that seamlessly supports LFS
while keeping backwards compatibility is possible, but does not
solve the problem: Many applications already expect GPGME to have
LFS (they are compiled with off_t being a 64bit value). This is true
in particular for the popular Gtk+ and Qt programs.
So, although this is an ABI (but not an API) break, we will not
change the library version to reflect that. Because the interfaces
affected are probably not used yet in any GPGME 0.4 based
application, we don't expect any real failures from this change.
In fact, applications already using LFS will have some subtle bugs
fixed.
However, if you encounter an application using GPGME 0.4.x that
does _not_ use LFS by default (off_t is a 32bit value), _and_
uses at least one of the functions gpgme_data_seek,
gpgme_data_new_from_filepart, or a gpgme_data_seek_cb_t with
gpgme_data_new_from_cbs, then indeed this library will be ABI
incompatible with the program. As said above, we don't believe
such a program exists. If we are in error, then you have two
options: As a quick hack, you can configure GPGME with the
--disable-largefile option. This will revert the change, and GPGME
will not use LFS. However, GPGME will be incompatible with
programs that expect GPGME to use LFS. All applications are
required to use LFS when using GPGME, so this is only good as a
temporary local work-around.
The other option is to change the versioning of the library and
recompile all applications. We have reserved a special version of
the library for that, so you can do that without expecting a
version clash in the future. Furthermore, everyone who does this
will agree on the version to use (this is important for
distribution makers). Read the comment in configure.ac (before
LIBGPGME_LT_AGE) if you want to do this. Please don't do this
blindly: As stated above, we think it is unlikely this measure is
needed. Still, it is there if necessary. If in doubt, contact us
and we will give our advise for your specific situation.
* Interface changes relative to the 0.4.4 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gpgme_data_seek_cb_t CHANGED: off_t is now a largefile type.
gpgme_data_seek CHANGED: off_t is now a largefile type.
gpgme_data_new_from_filepart CHANGED: off_t is now a largefile type.
Noteworthy changes in version 0.4.4 (2004-01-12) Noteworthy changes in version 0.4.4 (2004-01-12)
------------------------------------------------ ------------------------------------------------
@ -868,7 +931,7 @@ Noteworthy changes in version 0.2.1 (2001-04-02)
* Made the W32 support more robust. * Made the W32 support more robust.
Copyright 2001, 2002, 2003 g10 Code GmbH Copyright 2001, 2002, 2003, 2004 g10 Code GmbH
This file is free software; as a special exception the author gives This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without unlimited permission to copy and/or distribute it, with or without

View File

@ -1,6 +1,6 @@
# configure.in for GPGME # configure.in for GPGME
# Copyright (C) 2000 Werner Koch (dd9jn) # Copyright (C) 2000 Werner Koch (dd9jn)
# Copyright (C) 2001, 2002, 2003 g10 Code GmbH # Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
# #
# This file is part of GPGME. # This file is part of GPGME.
# #
@ -29,11 +29,13 @@ AC_INIT(gpgme, 0.4.4, [bug-gpgme@gnupg.org])
# (Code changed: REVISION++) # (Code changed: REVISION++)
# (Interfaces added/removed/changed: CURRENT++, REVISION=0) # (Interfaces added/removed/changed: CURRENT++, REVISION=0)
# (Interfaces added: AGE++) # (Interfaces added: AGE++)
# (Interfaces removed: AGE=0) # (Interfaces removed/changed: AGE=0)
# #
LIBGPGME_LT_CURRENT=12 LIBGPGME_LT_CURRENT=13
LIBGPGME_LT_AGE=1 # Subtract 2 from this value if you want to make the LFS transition an
LIBGPGME_LT_REVISION=1 # ABI break. [Note to self: Remove this comment with the next regular break.]
LIBGPGME_LT_AGE=2
LIBGPGME_LT_REVISION=0
NEED_GPG_VERSION=1.2.2 NEED_GPG_VERSION=1.2.2
NEED_GPGSM_VERSION=1.9.3 NEED_GPGSM_VERSION=1.9.3
############################################## ##############################################
@ -144,7 +146,8 @@ AC_CHECK_HEADERS(sys/select.h)
# Type checks. # Type checks.
AC_CHECK_SIZEOF(unsigned int) AC_CHECK_SIZEOF(unsigned int)
AC_SYS_LARGEFILE
AC_TYPE_OFF_T
# Checks for compiler features. # Checks for compiler features.
if test "$GCC" = yes; then if test "$GCC" = yes; then
@ -153,6 +156,8 @@ fi
# Checks for library functions. # Checks for library functions.
AC_FUNC_FSEEKO
AC_REPLACE_FUNCS(stpcpy) AC_REPLACE_FUNCS(stpcpy)
AC_REPLACE_FUNCS(vasprintf) AC_REPLACE_FUNCS(vasprintf)

View File

@ -1,3 +1,7 @@
2004-02-01 Marcus Brinkmann <marcus@g10code.de>
* gpgme.texi (Largefile Support): New section.
2004-01-13 Marcus Brinkmann <marcus@g10code.de> 2004-01-13 Marcus Brinkmann <marcus@g10code.de>
* gpgme.texi (Key Management): Fix exportable field. * gpgme.texi (Key Management): Fix exportable field.
@ -560,7 +564,7 @@
* Makefile.am (info_TEXINFOS): New variable. * Makefile.am (info_TEXINFOS): New variable.
(gpgme_TEXINFOS): Likewise. (gpgme_TEXINFOS): Likewise.
Copyright 2002 g10 Code GmbH Copyright 2002, 2003, 2004 g10 Code GmbH
This file is free software; as a special exception the author gives This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without unlimited permission to copy and/or distribute it, with or without

View File

@ -20,7 +20,7 @@ This is Edition @value{EDITION}, last updated @value{UPDATED}, of
@cite{The `GnuPG Made Easy' Reference Manual}, for Version @cite{The `GnuPG Made Easy' Reference Manual}, for Version
@value{VERSION}. @value{VERSION}.
Copyright @copyright{} 2002, 2003 g10 Code GmbH. Copyright @copyright{} 2002, 2003, 2004 g10 Code GmbH.
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or under the terms of the GNU Free Documentation License, Version 1.1 or
@ -104,6 +104,7 @@ Preparation
* Header:: What header file you need to include. * Header:: What header file you need to include.
* Building the Source:: Compiler options to be used. * Building the Source:: Compiler options to be used.
* Largefile Support:: How to use @acronym{GPGME} with LFS.
* Using Automake:: Compiler options to be used the easy way. * Using Automake:: Compiler options to be used the easy way.
* Using Libtool:: Avoiding compiler options entirely. * Using Libtool:: Avoiding compiler options entirely.
* Library Version Check:: Getting and verifying the library version. * Library Version Check:: Getting and verifying the library version.
@ -407,6 +408,82 @@ Supported thread packages are @option{--thread=pth} and
@option{--thread=pthread}. @option{--thread=pthread}.
@node Largefile Support
@section Largefile Support (LFS)
@cindex largfile support
@cindex LFS
@acronym{GPGME} is compiled with largfile support by default, if it is
available on the system. This means that GPGME supports files larger
than two gigabyte in size, if the underlying operating system can. On
some systems, largefile support is already the default. On such
systems, nothing special is required. However, some systems provide
only support for files up to two gigabyte in size by default. Support
for larger file sizes has to be specifically enabled.
To make a difficult situation even more complex, such systems provide
two different types of largefile support. You can either get all
relevant functions replaced with alternatives that are largefile
capable, or you can get new functions and data types for largefile
support added. Those new functions have the same name as their
smallfile counterparts, but with a suffix of 64.
An example: The data type @code{off_t} is 32 bit wide on GNU/Linux PC
systems. To address offsets in large files, you can either enable
largefile support add-on. Then a new data type @code{off64_t} is
provided, which is 64 bit wide. Or you can replace the existing
@code{off_t} data type with its 64 bit wide counterpart. All
occurences of @code{off_t} are then automagically replaced.
As if matters were not complex enough, there are also two different
types of file descriptors in such systems. This is important because
if file descriptors are exchanged between programs that use a
different maximum file size, certain errors must be produced on some
file descriptors to prevent subtle overflow bugs from occuring.
As you can see, supporting two different maximum file sizes at the
same time is not at all an easy task. However, the maximum file size
does matter for @acronym{GPGME}, because some data types it uses in
its interfaces are affected by that. For example, the @code{off_t}
data type is used in the @code{gpgme_data_seek} function, to match its
@acronym{POSIX} counterpart. This affects the call-frame of the
function, and thus the ABI of the library. Furthermore, file
descriptors can be exchanged between GPGME and the application.
For you as the user of the library, this means that your program must
be compiled in the same file size mode as the library. Luckily, there
is absolutely no valid reason for new programs to not enable largefile
support by default and just use that. The compatibility modes (small
file sizes or dual mode) can be considered an historic artefact, only
useful to allow for a transitional period.
@acronym{GPGME} is compiled using the largfile support by default.
This means that your application must do the same, at least as far as
it is relevant for using the @file{gpgme.h} header file. All types in
this header files refer to their largefile counterparts, if they are
different from any default types on the system.
You can enable largefile support, if it is different from the default
on the system the application is compiled on, by using the Autoconf
macro @code{AC_SYS_LARGEFILE}. If you do this, then you don't need to
worry about anything else: It will just work. In this case you might
also want to use @code{AC_FUNC_FSEEKO} to take advantage of some new
interfaces, and @code{AC_TYPE_OFF_T} (just in case).
If you do not use Autoconf, you can define the preprocessor symbol
@code{_FILE_OFFSET_BITS} to 64 @emph{before} including any header
files, for example by specifying the option
@code{-D_FILE_OFFSET_BITS=64} on the compiler command line. You will
also want to define the preprocessor symbol @code{LARGEFILE_SOURCE} to
1 in this case, to take advantage of some new interfaces.
If you do not want to do either of the above, you probably know enough
about the issue to invent your own solution. Just keep in mind that
the @acronym{GPGME} header file expects that largefile support is
enabled, if it is available. In particular, we do not support dual
mode (@code{_LARGEFILE64_SOURCE}).
@node Using Automake @node Using Automake
@section Using Automake @section Using Automake
@cindex automake @cindex automake

View File

@ -1,3 +1,9 @@
2004-02-01 Marcus Brinkmann <marcus@g10code.de>
* data-compat.c (gpgme_data_new_from_filepart): Call fseeko if
available.
* data-stream.c (stream_seek): Likewise.
2004-01-16 Werner Koch <wk@gnupg.org> 2004-01-16 Werner Koch <wk@gnupg.org>
* conversion.c (_gpgme_map_gnupg_error): Handle numerical codes as * conversion.c (_gpgme_map_gnupg_error): Handle numerical codes as
@ -4313,7 +4319,7 @@
* data.c (gpgme_data_rewind): Allow to rewind data_type_none. * data.c (gpgme_data_rewind): Allow to rewind data_type_none.
Copyright 2001, 2002 g10 Code GmbH Copyright 2001, 2002, 2003, 2004 g10 Code GmbH
This file is free software; as a special exception the author gives This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without unlimited permission to copy and/or distribute it, with or without

View File

@ -1,5 +1,5 @@
/* data-compat.c - Compatibility interfaces for data objects. /* data-compat.c - Compatibility interfaces for data objects.
Copyright (C) 2002, 2003 g10 Code GmbH Copyright (C) 2002, 2003, 2004 g10 Code GmbH
This file is part of GPGME. This file is part of GPGME.
@ -39,6 +39,7 @@ gpgme_data_new_from_filepart (gpgme_data_t *dh, const char *fname,
{ {
gpgme_error_t err; gpgme_error_t err;
char *buf = NULL; char *buf = NULL;
int res;
if (stream && fname) if (stream && fname)
return gpg_error (GPG_ERR_INV_VALUE); return gpg_error (GPG_ERR_INV_VALUE);
@ -48,7 +49,14 @@ gpgme_data_new_from_filepart (gpgme_data_t *dh, const char *fname,
if (!stream) if (!stream)
return gpg_error_from_errno (errno); return gpg_error_from_errno (errno);
if (fseek (stream, offset, SEEK_SET)) #ifdef HAVE_FSEEKO
res = fseeko (stream, offset, SEEK_SET);
#else
/* FIXME: Check for overflow, or at least bail at compilation. */
res = fseek (stream, offset, SEEK_SET);
#endif
if (res)
{ {
int saved_errno = errno; int saved_errno = errno;
if (fname) if (fname)

View File

@ -1,5 +1,5 @@
/* data-stream.c - A stream based data object. /* data-stream.c - A stream based data object.
Copyright (C) 2002 g10 Code GmbH Copyright (C) 2002, 2004 g10 Code GmbH
This file is part of GPGME. This file is part of GPGME.
@ -50,7 +50,12 @@ stream_write (gpgme_data_t dh, const void *buffer, size_t size)
static off_t static off_t
stream_seek (gpgme_data_t dh, off_t offset, int whence) stream_seek (gpgme_data_t dh, off_t offset, int whence)
{ {
#ifdef HAVE_FSEEKO
return fseeko (dh->data.stream, offset, whence);
#else
/* FIXME: Check for overflow, or at least bail at compilation. */
return fseek (dh->data.stream, offset, whence); return fseek (dh->data.stream, offset, whence);
#endif
} }