[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-gnulib] vasprintf EOVERFLOW fix
From: |
Bruno Haible |
Subject: |
Re: [Bug-gnulib] vasprintf EOVERFLOW fix |
Date: |
Thu, 9 Sep 2004 14:28:45 +0200 |
User-agent: |
KMail/1.5 |
Oskar Liljeblad wrote:
> A trivial patch to define EOVERFLOW in vasnprintf.c
I see. You mean, because AIX 3 doesn't have it and OSF/1 4.0 and 5.1 declare
it only if _XOPEN_SOURCE_EXTENDED is defined?
EINVAL is a bad replacement value, because for snprintf EINVAL means
"invalid format string".
Also we would get problems on OSF/1 if one part of an application is compiled
with _XOPEN_SOURCE_EXTENDED and another part without: Then the code would
assume different values of EOVERFLOW here and there.
I've committed this change.
Bruno
2004-09-09 Bruno Haible <address@hidden>
* modules/vasnprintf (Files): Add m4/eoverflow.m4.
* m4/eoverflow.m4: New file, taken from GNU libiconv eilseq.m4 with
modifications.
* m4/vasnprintf.m4 (gl_FUNC_VASNPRINTF): Require gl_EOVERFLOW.
*** modules/vasnprintf 25 Nov 2003 11:18:47 -0000 1.3
--- modules/vasnprintf 9 Sep 2004 12:26:19 -0000
***************
*** 15,20 ****
--- 15,21 ----
m4/wint_t.m4
m4/longlong.m4
m4/intmax_t.m4
+ m4/eoverflow.m4
m4/vasnprintf.m4
Depends-on:
*** m4/vasnprintf.m4 1 Jun 2004 20:27:24 -0000 1.6
--- m4/vasnprintf.m4 9 Sep 2004 12:26:21 -0000
***************
*** 1,4 ****
! # vasnprintf.m4 serial 4
dnl Copyright (C) 2002-2004 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
--- 1,4 ----
! # vasnprintf.m4 serial 5
dnl Copyright (C) 2002-2004 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
***************
*** 8,13 ****
--- 8,14 ----
AC_DEFUN([gl_FUNC_VASNPRINTF],
[
+ AC_REQUIRE([gl_EOVERFLOW])
AC_REPLACE_FUNCS(vasnprintf)
if test $ac_cv_func_vasnprintf = no; then
AC_LIBOBJ(printf-args)
*** /dev/null 1970-01-01 01:00:00.000000000 +0100
--- m4/eoverflow.m4 2004-09-09 14:15:24.000000000 +0200
***************
*** 0 ****
--- 1,66 ----
+ # eoverflow.m4 serial 1
+ dnl Copyright (C) 2004 Free Software Foundation, Inc.
+ dnl This file is free software, distributed under the terms of the GNU
+ dnl General Public License. As a special exception to the GNU General
+ dnl Public License, this file may be distributed as part of a program
+ dnl that contains a configuration script generated by Autoconf, under
+ dnl the same distribution terms as the rest of that program.
+
+ dnl From Bruno Haible.
+
+ # The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+ # POSIX. But some systems (like AIX 3) don't define it, and some systems
+ # (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+
+ # Define EOVERFLOW as a C macro and as a substituted macro in such a way that
+ # 1. on all systems, after inclusion of <errno.h>, EOVERFLOW is usable,
+ # 2. on systems where EOVERFLOW is defined elsewhere, we use the same numeric
+ # value.
+
+ AC_DEFUN([gl_EOVERFLOW],
+ [
+ AC_REQUIRE([AC_PROG_CC])dnl
+
+ AC_CACHE_CHECK([for EOVERFLOW], ac_cv_decl_EOVERFLOW, [
+ AC_EGREP_CPP(yes,[
+ #include <errno.h>
+ #ifdef EOVERFLOW
+ yes
+ #endif
+ ], have_eoverflow=1)
+ if test -n "$have_eoverflow"; then
+ dnl EOVERFLOW exists in <errno.h>. Don't need to define EOVERFLOW
ourselves.
+ ac_cv_decl_EOVERFLOW=yes
+ else
+ AC_EGREP_CPP(yes,[
+ #define _XOPEN_SOURCE_EXTENDED 1
+ #include <errno.h>
+ #ifdef EOVERFLOW
+ yes
+ #endif
+ ], have_eoverflow=1)
+ if test -n "$have_eoverflow"; then
+ dnl EOVERFLOW exists but is hidden.
+ dnl Define it to the same value.
+ _AC_COMPUTE_INT([EOVERFLOW], ac_cv_decl_EOVERFLOW, [
+ #define _XOPEN_SOURCE_EXTENDED 1
+ #include <errno.h>
+ /* The following two lines are a workaround against an autoconf-2.52 bug. */
+ #include <stdio.h>
+ #include <stdlib.h>
+ ])
+ else
+ dnl EOVERFLOW isn't defined by the system. Define EOVERFLOW
ourselves, but
+ dnl don't define it as EINVAL, because snprintf() callers want to
+ dnl distinguish EINVAL and EOVERFLOW.
+ ac_cv_decl_EOVERFLOW=E2BIG
+ fi
+ fi
+ ])
+ if test "$ac_cv_decl_EOVERFLOW" != yes; then
+ AC_DEFINE_UNQUOTED([EOVERFLOW], [$ac_cv_decl_EOVERFLOW],
+ [Define as good substitute value for EOVERFLOW.])
+ EOVERFLOW="$ac_cv_decl_EOVERFLOW"
+ AC_SUBST(EOVERFLOW)
+ fi
+ ])