bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] net_if: new module


From: Jasper Lievisse Adriaanse
Subject: Re: [PATCH] net_if: new module
Date: Thu, 6 Sep 2012 09:06:06 +0200
User-agent: Mutt/1.5.21 (2010-09-15)

On Wed, Sep 05, 2012 at 03:59:10PM -0600, Eric Blake wrote:
> OpenBSD's <net/if.h> is not self-contained; this should compile:
> 
> | #define _POSIX_C_SOURCE 200809L
> | #include <net/if.h>
> | struct if_nameindex i;
> 
> but fails with:
> 
> In file included from foo.c:2:
> /usr/include/net/if.h:112: error: expected specifier-qualifier-list before 
> 'u_int'
> ...
> /usr/include/net/if.h:674: error: field 'dstaddr' has incomplete type
> In file included from /usr/include/net/if.h:691,
>                  from foo.c:2:
> /usr/include/net/if_arp.h:79: error: field 'arp_pa' has incomplete type
> /usr/include/net/if_arp.h:80: error: field 'arp_ha' has incomplete type
> *** Error code 1
> 
> We already had a test program for systems with the if_* functions
> (including OpenBSD); but in adding this module, I had to enhance
> that test to also work on platforms like mingw where we are now
> providing a new header.
> 
> * modules/net_if: New module, borrowing ideas from netinet_in.
> * m4/net_if_h.m4: New file.
> * lib/net_if.in.h: Likewise.
> * doc/posix-headers/net_if.texi (net/if.h): Document it.
> * MODULES.html.sh (lacking POSIX:2008): Likewise.
> * tests/test-net_if.c: Make function checks conditional.
> Reported by Jasper Lievisse Adriaanse <address@hidden>.
> 
> Signed-off-by: Eric Blake <address@hidden>

Although the entry in net_if.texi is correct for OpenBSD, it may be ammended
to include 5.2 too? As that is the version I'm testing with (OpenBSD -current).

> ---
>  ChangeLog                     | 11 +++++++++
>  MODULES.html.sh               |  1 +
>  doc/posix-headers/net_if.texi |  5 +++-
>  lib/net_if.in.h               | 53 
> +++++++++++++++++++++++++++++++++++++++++++
>  m4/net_if_h.m4                | 31 +++++++++++++++++++++++++
>  modules/net_if                | 49 +++++++++++++++++++++++++++++++++++++++
>  tests/test-net_if.c           | 12 ++++++++--
>  7 files changed, 159 insertions(+), 3 deletions(-)
>  create mode 100644 lib/net_if.in.h
>  create mode 100644 m4/net_if_h.m4
>  create mode 100644 modules/net_if
> 
> diff --git a/ChangeLog b/ChangeLog
> index dea1f86..d9f6f89 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,14 @@
> +2012-09-05  Eric Blake  <address@hidden>
> +
> +     net_if: new module
> +     * modules/net_if: New module, borrowing ideas from netinet_in.
> +     * m4/net_if_h.m4: New file.
> +     * lib/net_if.in.h: Likewise.
> +     * doc/posix-headers/net_if.texi (net/if.h): Document it.
> +     * MODULES.html.sh (lacking POSIX:2008): Likewise.
> +     * tests/test-net_if.c: Make function checks conditional.
> +     Reported by Jasper Lievisse Adriaanse <address@hidden>.
> +
>  2012-09-05  Mats Erik Andersson  <address@hidden>  (tiny change)
> 
>       readutmp: fix non-portable UT_PID use
> diff --git a/MODULES.html.sh b/MODULES.html.sh
> index 8ced611..0e34531 100755
> --- a/MODULES.html.sh
> +++ b/MODULES.html.sh
> @@ -2430,6 +2430,7 @@ func_all_modules ()
>    func_module mkfifo
>    func_module mknod
>    func_module mkstemp
> +  func_module net_if
>    func_module netdb
>    func_module netinet_in
>    func_module nl_langinfo
> diff --git a/doc/posix-headers/net_if.texi b/doc/posix-headers/net_if.texi
> index 38a52f4..fa01b6e 100644
> --- a/doc/posix-headers/net_if.texi
> +++ b/doc/posix-headers/net_if.texi
> @@ -3,10 +3,13 @@ net/if.h
> 
>  POSIX specification:@* 
> @url{http://www.opengroup.org/onlinepubs/9699919799/basedefs/net_if.h.html}
> 
> -Gnulib module: ---
> +Gnulib module: net_if
> 
>  Portability problems fixed by Gnulib:
>  @itemize
> address@hidden
> +This header file is not self-contained on some platforms:
> +FreeBSD 8.2, OpenBSD 5.1.
>  @end itemize
> 
>  Portability problems not fixed by Gnulib:
> diff --git a/lib/net_if.in.h b/lib/net_if.in.h
> new file mode 100644
> index 0000000..24f9f83
> --- /dev/null
> +++ b/lib/net_if.in.h
> @@ -0,0 +1,53 @@
> +/* Substitute for <net/if.h>.
> +   Copyright (C) 2007-2012 Free Software Foundation, Inc.
> +
> +   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 2, 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 <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef address@hidden@_NET_IF_H
> +
> +#if __GNUC__ >= 3
> address@hidden@
> +#endif
> address@hidden@
> +
> +#if @HAVE_NET_IF_H@
> +
> +/* On some platforms, <net/if.h> assumes prior inclusion of
> +   <sys/socket.h>.  */
> +# include <sys/socket.h>
> +
> +/* The include_next requires a split double-inclusion guard.  */
> +# @INCLUDE_NEXT@ @NEXT_NET_IF_H@
> +
> +#endif
> +
> +#ifndef address@hidden@_NET_IF_H
> +#define address@hidden@_NET_IF_H
> +
> +#if address@hidden@
> +
> +/* A platform that lacks <net/if.h>.  */
> +
> +struct if_nameindex
> +{
> +  unsigned if_index;
> +  char *if_name;
> +};
> +
> +# define IF_NAMESIZE 1 /* Without if_* functions, this supports only "". */
> +
> +#endif
> +
> +#endif /* address@hidden@_NET_IF_H */
> +#endif /* address@hidden@_NET_IF_H */
> diff --git a/m4/net_if_h.m4 b/m4/net_if_h.m4
> new file mode 100644
> index 0000000..171101f
> --- /dev/null
> +++ b/m4/net_if_h.m4
> @@ -0,0 +1,31 @@
> +# net_if_h.m4 serial 1
> +dnl Copyright (C) 2006-2012 Free Software Foundation, Inc.
> +dnl This file is free software; the Free Software Foundation
> +dnl gives unlimited permission to copy and/or distribute it,
> +dnl with or without modifications, as long as this notice is preserved.
> +
> +AC_DEFUN([gl_HEADER_NET_IF],
> +[
> +  AC_CACHE_CHECK([whether <net/if.h> is self-contained],
> +    [gl_cv_header_net_if_h_selfcontained],
> +    [
> +      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <net/if.h>]], [[]])],
> +        [gl_cv_header_net_if_h_selfcontained=yes],
> +        [gl_cv_header_net_if_h_selfcontained=no])
> +    ])
> +  if test $gl_cv_header_net_if_h_selfcontained = yes; then
> +    NET_IF_H=''
> +  else
> +    NET_IF_H='net/if.h'
> +    AC_CHECK_HEADERS([net/if.h], [], [], [[#include <sys/socket.h>]])
> +    gl_NEXT_HEADERS([net/if.h])
> +    if test $ac_cv_header_net_if_h = yes; then
> +      HAVE_NET_IF_H=1
> +    else
> +      HAVE_NET_IF_H=0
> +    fi
> +    AC_SUBST([HAVE_NET_IF_H])
> +  fi
> +  AC_SUBST([NET_IF_H])
> +  AM_CONDITIONAL([GL_GENERATE_NET_IF_H], [test -n "$NET_IF_H"])
> +])
> diff --git a/modules/net_if b/modules/net_if
> new file mode 100644
> index 0000000..9e30f01
> --- /dev/null
> +++ b/modules/net_if
> @@ -0,0 +1,49 @@
> +Description:
> +A <net/if.h> for systems lacking it.
> +
> +Files:
> +lib/net_if.in.h
> +m4/net_if_h.m4
> +
> +Depends-on:
> +include_next
> +sys_socket
> +
> +configure.ac:
> +gl_HEADER_NET_IF
> +AC_PROG_MKDIR_P
> +
> +Makefile.am:
> +BUILT_SOURCES += $(NET_IF_H)
> +
> +# We need the following in order to create <net/if.h> when the system
> +# doesn't have one.
> +if GL_GENERATE_NET_IF_H
> +net/if.h: net_if.in.h $(top_builddir)/config.status
> +     $(AM_V_at)$(MKDIR_P) net
> +     $(AM_V_GEN)rm -f address@hidden $@ && \
> +     { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
> +       sed -e 's|@''GUARD_PREFIX''@|${gl_include_guard_prefix}|g' \
> +           -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
> +           -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
> +           -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
> +           -e 's|@''NEXT_NET_IF_H''@|$(NEXT_NET_IF_H)|g' \
> +           -e 's|@''HAVE_NET_IF_H''@|$(HAVE_NET_IF_H)|g' \
> +           < $(srcdir)/net_if.in.h; \
> +     } > address@hidden && \
> +     mv address@hidden $@
> +else
> +net/if.h: $(top_builddir)/config.status
> +     rm -f $@
> +endif
> +MOSTLYCLEANFILES += net/if.h net/if.h-t
> +MOSTLYCLEANDIRS += net
> +
> +Include:
> +<net/if.h>
> +
> +License:
> +LGPLv2+
> +
> +Maintainer:
> +Eric Blake
> diff --git a/tests/test-net_if.c b/tests/test-net_if.c
> index ee3cdbd..f508642 100644
> --- a/tests/test-net_if.c
> +++ b/tests/test-net_if.c
> @@ -20,11 +20,17 @@
> 
>  #include <net/if.h>
> 
> -#include "signature.h"
> +static struct if_nameindex ni;
> +
> +/* We do not yet have replacements for if_* functions on systems that
> +   lack a native <net/if.h>.  */
> +#if HAVE_NET_IF_H
> +# include "signature.h"
>  SIGNATURE_CHECK (if_freenameindex, void, (struct if_nameindex *));
>  SIGNATURE_CHECK (if_indextoname, char *, (unsigned int, char *));
>  SIGNATURE_CHECK (if_nameindex, struct if_nameindex *, (void));
>  SIGNATURE_CHECK (if_nametoindex, unsigned int, (const char *));
> +#endif
> 
>  #include <stddef.h> /* NULL */
>  #include <stdio.h> /* fprintf */
> @@ -32,6 +38,7 @@ SIGNATURE_CHECK (if_nametoindex, unsigned int, (const char 
> *));
>  int
>  main (int argc, char *argv[])
>  {
> +#if HAVE_NET_IF_H
>    struct if_nameindex *ifnp, *p;
> 
>    p = ifnp = if_nameindex ();
> @@ -80,6 +87,7 @@ main (int argc, char *argv[])
>      }
> 
>    if_freenameindex (ifnp);
> +#endif /* HAVE_NET_IF_H */
> 
> -  return 0;
> +  return !IF_NAMESIZE + ni.if_index + !!ni.if_name;
>  }
> -- 
> 1.7.11.4
> 

-- 
Cheers,
Jasper

"Stay Hungry. Stay Foolish"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]