Use AC_CHECK_MEMBERS to check for dirent name length flds (#2923)

If `struct dirent` has `namlen` field, define `HAVE_DIRENT_NAMLEN`.
If the field is instead `namelen`, define `HAVE_DIRENT_NAMELEN` (case of QNX). 

Use this checks in `rktio_fs.c` and simplify `platform.h`.
This commit is contained in:
Paulo Matos 2019-11-25 16:35:10 +01:00 committed by GitHub
parent 219bac7fe7
commit b1b8beece5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 101 additions and 27 deletions

View File

@ -621,6 +621,8 @@ ac_includes_default="\
ac_subst_vars='LTLIBOBJS
LIBOBJS
HAVE_DIRENT_NAMELEN
HAVE_DIRENT_NAMLEN
RKTIO_NO_ICONV
HIDE_STANDALONE
HIDE_NOT_STANDALONE
@ -1668,6 +1670,63 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_header_compile
# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
# ----------------------------------------------------
# Tries to find if the field MEMBER exists in type AGGR, after including
# INCLUDES, setting cache variable VAR accordingly.
ac_fn_c_check_member ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
$as_echo_n "checking for $2.$3... " >&6; }
if eval \${$4+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
main ()
{
static $2 ac_aggr;
if (ac_aggr.$3)
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
eval "$4=yes"
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
main ()
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
return 0;
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
eval "$4=yes"
else
eval "$4=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$4
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_member
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
@ -4109,6 +4168,24 @@ $as_echo "#define RKTIO_BIG_ENDIAN 1" >>confdefs.h
fi
# Struct dirent
ac_fn_c_check_member "$LINENO" "struct dirent" "d_namelen" "ac_cv_member_struct_dirent_d_namelen" "#include <dirent.h>
"
if test "x$ac_cv_member_struct_dirent_d_namelen" = xyes; then :
$as_echo "#define HAVE_DIRENT_NAMELEN 1" >>confdefs.h
fi
ac_fn_c_check_member "$LINENO" "struct dirent" "d_namlen" "ac_cv_member_struct_dirent_d_namlen" "#include <dirent.h>
"
if test "x$ac_cv_member_struct_dirent_d_namlen" = xyes; then :
$as_echo "#define HAVE_DIRENT_NAMLEN 1" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5
$as_echo_n "checking for getaddrinfo... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@ -4528,6 +4605,9 @@ CPPFLAGS="$CPPFLAGS $PREFLAGS"

View File

@ -148,6 +148,14 @@ if test "${endianness}" = "big" ; then
AC_DEFINE(RKTIO_BIG_ENDIAN,1,[Big endian])
fi
# Struct dirent
AC_CHECK_MEMBER([struct dirent.d_namelen],
[AC_DEFINE(HAVE_DIRENT_NAMELEN, 1, [struct dirent has field namelen])],,
[#include <dirent.h>])
AC_CHECK_MEMBER([struct dirent.d_namlen],
[AC_DEFINE(HAVE_DIRENT_NAMLEN, 1, [struct dirent has field namlen])],,
[#include <dirent.h>])
AC_MSG_CHECKING([for getaddrinfo])
AC_TRY_LINK([#include <sys/types.h>
#include <sys/socket.h>
@ -426,6 +434,9 @@ AC_SUBST(HIDE_STANDALONE)
AC_SUBST(RKTIO_NO_ICONV)
AC_SUBST(HAVE_DIRENT_NAMLEN)
AC_SUBST(HAVE_DIRENT_NAMELEN)
makefiles="Makefile"
AC_OUTPUT($makefiles)

View File

@ -60,3 +60,8 @@ typedef unsigned long long rktio_uint64_t;
/* In case iconv is not available: */
#undef RKTIO_NO_ICONV
/* Fields of struct dirent */
#undef HAVE_DIRENT_NAMLEN
#undef HAVE_DIRENT_NAMELEN

View File

@ -1487,12 +1487,13 @@ char *rktio_directory_list_step(rktio_t *rktio, rktio_directory_list_t *dl)
while ((e = readdir(dl->dir))) {
int nlen;
# ifdef DIRENT_NO_NAMLEN
nlen = strlen(e->d_name);
# elif defined(__QNX__) || defined(__QNXNTO__)
# ifdef HAVE_DIRENT_NAMLEN
nlen = e->d_namlen;
# elif HAVE_DIRENT_NAMELEN
/* Case for QNX - which seems to define d_namelen instead */
nlen = e->d_namelen;
# else
nlen = e->d_namlen;
nlen = strlen(e->d_name);
# endif
# if defined(RKTIO_SYSTEM_UNIX) || defined(RKTIO_SYSTEM_WINDOWS)

View File

@ -7,7 +7,6 @@
# include <errno.h>
# ifdef ECHRNG
/* Solaris */
# define DIRENT_NO_NAMLEN
# define NO_USLEEP
# define USE_ULIMIT
# define SOME_FDS_ARE_NOT_SELECTABLE
@ -44,8 +43,6 @@
#if defined(__linux__)
# define DIRENT_NO_NAMLEN
# define USE_TIMEZONE_VAR_W_DLS
# define USE_TZNAME_VAR
@ -91,8 +88,6 @@
#if (defined(mips) || defined(__mips)) \
&& !(defined(ultrix) || defined(__ultrix) || defined(__linux__) || defined(__OpenBSD__))
# define DIRENT_NO_NAMLEN
# define BSTRING_INCLUDE
# define NO_USLEEP
@ -106,8 +101,6 @@
#if defined(ultrix) || defined(__ultrix)
# define DIRENT_NO_NAMLEN
# define NO_USLEEP
#endif
@ -134,15 +127,6 @@
# define USE_TIMEZONE_VAR_W_DLS
# define USE_TZNAME_VAR
#endif
/************** x86/SCO Unix with gcc ****************/
/* Contributed by Atanas Ivanov <nasko@noac.bg> */
#if defined(_M_XENIX) && defined(_M_SYSV)
# define DIRENT_NO_NAMLEN
#endif
/****************** Windows with MSVC or MinGW *****************/
@ -157,7 +141,6 @@
# define MKDIR_NO_MODE_FLAG
# endif
# if defined(__BORLANDC__)
# define DIRENT_NO_NAMLEN
# define MKDIR_NO_MODE_FLAG
# endif
@ -169,8 +152,6 @@
# define RKTIO_BINARY O_BINARY
# define DIRENT_NO_NAMLEN
# define SIGCHILD_DOESNT_INTERRUPT_SELECT
# define CANT_SET_SOCKET_BUFSIZE
@ -275,10 +256,6 @@
/* NO_READDIR means that there is no opendir() and readdir() for
implementing directory-list. */
/* DIRENT_NO_NAMLEN specifies that dirent entries do not have a
d_namlen field; this is used only when NO_READDIR is not
specified. */
/* MKDIR_NO_MODE_FLAG specifies that mkdir() takes only one argument,
instead of a directory name and mode flags. */