Blame configure.d/config_os_functions

Packit Service b38f0b
# -*- autoconf -*-
Packit Service b38f0b
#########################################
Packit Service b38f0b
##
Packit Service b38f0b
# Checks for library functions.
Packit Service b38f0b
##
Packit Service b38f0b
#########################################
Packit Service b38f0b
#
Packit Service b38f0b
# Portions of this file are copyrighted by:
Packit Service b38f0b
# Copyright (c) 2016 VMware, Inc. All rights reserved.
Packit Service b38f0b
# Use is subject to license terms specified in the COPYING file
Packit Service b38f0b
# distributed with the Net-SNMP package.
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   Standard checks:
Packit Service b38f0b
##
Packit Service b38f0b
AC_FUNC_ALLOCA          #  alloca()
Packit Service b38f0b
AC_PROG_GCC_TRADITIONAL
Packit Service b38f0b
Packit Service b38f0b
if test "$cross_compiling" = yes -a "${ac_cv_func_memcmp_working+set}" != set
Packit Service b38f0b
then
Packit Service b38f0b
  # Cross-compiling and ac_cv_func_memcmp_working has not been set - assume
Packit Service b38f0b
  # that memcmp() is available.
Packit Service b38f0b
  ac_cv_func_memcmp_working=yes
Packit Service b38f0b
else
Packit Service b38f0b
  # Native compilation - test for the availability of memcmp().
Packit Service b38f0b
  AC_FUNC_MEMCMP
Packit Service b38f0b
fi
Packit Service b38f0b
Packit Service b38f0b
AC_TYPE_SIGNAL
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   Stand-alone function checks:
Packit Service b38f0b
##
Packit Service b38f0b
#  Core:
Packit Service b38f0b
AC_CHECK_FUNCS([rand   random srand srandom lrand48 srand48] dnl
Packit Service b38f0b
               [signal sigset                              ] )
Packit Service b38f0b
Packit Service b38f0b
#  Library:
Packit Service b38f0b
AC_CHECK_FUNCS([asprintf                                         ] dnl
Packit Service b38f0b
               [closedir        fgetc_unlocked  flockfile        ] dnl
Packit Service b38f0b
               [fork            funlockfile     getipnodebyname  ] dnl
Packit Service b38f0b
               [gettimeofday    if_nametoindex  mkstemp          ] dnl
Packit Service b38f0b
               [opendir         readdir         regcomp          ] dnl
Packit Service b38f0b
               [setenv          setitimer       setlocale        ] dnl
Packit Service b38f0b
               [setsid          snprintf        strcasestr       ] dnl
Packit Service b38f0b
               [strdup          strerror        strncasecmp      ] dnl
Packit Service b38f0b
               [sysconf         times           vsnprintf        ] )
Packit Service b38f0b
Packit Service b38f0b
# IPv4/IPv6 function checks. AC_CHECK_FUNC() can't find these on MinGW
Packit Service b38f0b
# since these functions have the __cdecl calling convention on MinGW.
Packit Service b38f0b
case x$target_os in
Packit Service b38f0b
  xmingw*)
Packit Service b38f0b
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <winsock2.h>],
Packit Service b38f0b
    [ closesocket(0); ])],
Packit Service b38f0b
    [ ac_cv_func_closesocket=yes
Packit Service b38f0b
      AS_ECHO "#define HAVE_CLOSESOCKET 1" >>confdefs.h
Packit Service b38f0b
    ], [ ])
Packit Service b38f0b
Packit Service b38f0b
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <ws2tcpip.h>],
Packit Service b38f0b
    [ gai_strerror(0); ])],
Packit Service b38f0b
    [ ac_cv_func_gai_strerror=yes
Packit Service b38f0b
      AS_ECHO "#define HAVE_GAI_STRERROR 1" >>confdefs.h
Packit Service b38f0b
    ], [ ])
Packit Service b38f0b
Packit Service b38f0b
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <ws2tcpip.h>],
Packit Service b38f0b
    [ getaddrinfo(NULL, NULL, NULL, NULL); ])],
Packit Service b38f0b
    [ ac_cv_func_getaddrinfo=yes
Packit Service b38f0b
      AS_ECHO "#define HAVE_GETADDRINFO 1" >>confdefs.h
Packit Service b38f0b
    ], [ ])
Packit Service b38f0b
Packit Service b38f0b
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <winsock2.h>],
Packit Service b38f0b
    [ gethostbyname(NULL); ])],
Packit Service b38f0b
    [ ac_cv_func_gethostbyname=yes
Packit Service b38f0b
      AS_ECHO "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h
Packit Service b38f0b
    ], [ ])
Packit Service b38f0b
Packit Service b38f0b
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <winsock2.h>],
Packit Service b38f0b
    [ gethostbyaddr(NULL); ])],
Packit Service b38f0b
    [ ac_cv_func_gethostaddr=yes
Packit Service b38f0b
      AS_ECHO "#define HAVE_GETHOSTBYADDR 1" >>confdefs.h
Packit Service b38f0b
    ], [ ])
Packit Service b38f0b
Packit Service b38f0b
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <winsock2.h>],
Packit Service b38f0b
    [ gethostname(NULL, 0); ])],
Packit Service b38f0b
    [ ac_cv_func_gethostname=yes
Packit Service b38f0b
      AS_ECHO "#define HAVE_GETHOSTNAME 1" >>confdefs.h
Packit Service b38f0b
    ], [ ])
Packit Service b38f0b
    ;;
Packit Service b38f0b
Packit Service b38f0b
  *)
Packit Service b38f0b
    AC_CHECK_FUNCS([closesocket gai_strerror getaddrinfo gethostbyname gethostbyname2 gethostname gethostbyaddr])
Packit Service b38f0b
    ;;
Packit Service b38f0b
esac
Packit Service b38f0b
Packit Service b38f0b
AC_CONFIG_LIBOBJ_DIR([snmplib])
Packit Service b38f0b
Packit Service b38f0b
AC_REPLACE_FUNCS([getopt        inet_ntop     inet_pton        ] dnl
Packit Service b38f0b
                 [strlcat       strlcpy       strtok_r         ] dnl
Packit Service b38f0b
                 [strtol        strtoul       strtoull         ] )
Packit Service b38f0b
Packit Service b38f0b
#  Agent:
Packit Service b38f0b
AC_CHECK_FUNCS([cgetnext        chown          execv           ] dnl
Packit Service b38f0b
               [forkall         fsync                          ] dnl
Packit Service b38f0b
               [gai_strerror    getgrnam                       ] dnl
Packit Service b38f0b
               [gethostname     getloadavg                     ] dnl
Packit Service b38f0b
               [getpid          getpwnam                       ] dnl
Packit Service b38f0b
               [hasmntopt       initgroups                     ] dnl
Packit Service b38f0b
               [if_nameindex    if_indextoname if_nametoindex  ] dnl
Packit Service b38f0b
               [localtime_r     mkstemp        mktime          ] dnl
Packit Service b38f0b
               [poll            regcomp                        ] dnl
Packit Service b38f0b
               [setgid          setgroups                      ] dnl
Packit Service b38f0b
               [setmntent       setuid                         ] dnl
Packit Service b38f0b
               [sigaction       sigblock      sighold          ] dnl
Packit Service b38f0b
               [sigprocmask                                    ] dnl
Packit Service b38f0b
               [statfs          statvfs       stime            ] dnl
Packit Service b38f0b
               [strncasecmp     system                         ] dnl
Packit Service b38f0b
               [uname           usleep                         ] )
Packit Service b38f0b
Packit Service b38f0b
#  Apps:
Packit Service b38f0b
AC_CHECK_FUNCS([getdtablesize                                  ] dnl
Packit Service b38f0b
               [getgrnam        getpid        getpwnam         ] dnl
Packit Service b38f0b
               [setgid          setgroups     setuid           ] dnl
Packit Service b38f0b
               [tcgetattr                                      ] )
Packit Service b38f0b
Packit Service b38f0b
#  Not-Used:
Packit Service b38f0b
AC_CHECK_FUNCS([if_freenameindex              getpagesize      ] dnl
Packit Service b38f0b
               [lseek64         pread64                        ] dnl
Packit Service b38f0b
               [select          sigalrm       socket           ] )
Packit Service b38f0b
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   More complex function checks:
Packit Service b38f0b
#           (Agent)
Packit Service b38f0b
##
Packit Service b38f0b
Packit Service b38f0b
#       rpmGetPath check needs clean LIBS environment   (Linux)
Packit Service b38f0b
#
Packit Service b38f0b
if test "x$with_rpm" != "xno"; then
Packit Service b38f0b
    OLDLIBS=$LIBS
Packit Service b38f0b
    LIBS=$LMIBLIBS
Packit Service b38f0b
    AC_CHECK_FUNCS(rpmGetPath)
Packit Service b38f0b
    LIBS=$OLDLIBS
Packit Service b38f0b
fi
Packit Service b38f0b
Packit Service b38f0b
#       statfs( char *, struct fs_data* )               (Ultrix)
Packit Service b38f0b
#
Packit Service b38f0b
AC_MSG_CHECKING([[for two-argument statfs with struct fs_data (Ultrix)]])
Packit Service b38f0b
AC_CACHE_VAL(
Packit Service b38f0b
    fu_cv_sys_stat_fs_data,
Packit Service b38f0b
    [AC_RUN_IFELSE([AC_LANG_SOURCE([[
Packit Service b38f0b
#ifdef HAVE_SYS_PARAM_H
Packit Service b38f0b
#include <sys/param.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#include <sys/types.h>
Packit Service b38f0b
#ifdef HAVE_SYS_MOUNT_H
Packit Service b38f0b
#include <sys/mount.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef HAVE_SYS_FS_TYPES_H
Packit Service b38f0b
#include <sys/fs_types.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
main ()
Packit Service b38f0b
{
Packit Service b38f0b
struct fs_data fsd;
Packit Service b38f0b
/* Ultrix's statfs returns 1 for success,
Packit Service b38f0b
   0 for not mounted, -1 for failure.  */
Packit Service b38f0b
exit (statfs (".", &fsd) != 1);
Packit Service b38f0b
}]])],
Packit Service b38f0b
    [fu_cv_sys_stat_fs_data=yes],
Packit Service b38f0b
    [fu_cv_sys_stat_fs_data=no],
Packit Service b38f0b
    [fu_cv_sys_stat_fs_data=no])])
Packit Service b38f0b
AC_MSG_RESULT($fu_cv_sys_stat_fs_data)
Packit Service b38f0b
if test $fu_cv_sys_stat_fs_data = yes; then
Packit Service b38f0b
    AC_DEFINE(STAT_STATFS_FS_DATA, 1,
Packit Service b38f0b
        [Define if statfs takes 2 args and the second argument has
Packit Service b38f0b
         type struct fs_data. @<:@Ultrix@:>@])
Packit Service b38f0b
fi
Packit Service b38f0b
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   Other function-related checks:
Packit Service b38f0b
#           (general build)
Packit Service b38f0b
##
Packit Service b38f0b
Packit Service b38f0b
#       How to get the name of the current function
Packit Service b38f0b
#
Packit Service b38f0b
AC_CACHE_CHECK([how to get the name of the current function],
Packit Service b38f0b
               [netsnmp_cv__func__name],[
Packit Service b38f0b
    netsnmp_cv__func__name=no
Packit Service b38f0b
    AC_COMPILE_IFELSE(
Packit Service b38f0b
        [AC_LANG_PROGRAM(,[[const char* cp = __func__;]])],
Packit Service b38f0b
        [netsnmp_cv__func__name=__func__])
Packit Service b38f0b
    if test "$netsnmp_cv__func__name" = no ; then
Packit Service b38f0b
      AC_COMPILE_IFELSE(
Packit Service b38f0b
        [AC_LANG_PROGRAM(,[[const char* cp = __FUNCTION__;]])],
Packit Service b38f0b
        [netsnmp_cv__func__name=__FUNCTION__])
Packit Service b38f0b
    fi])
Packit Service b38f0b
if test "$netsnmp_cv__func__name" != no; then
Packit Service b38f0b
    AC_DEFINE_UNQUOTED([NETSNMP_FUNCTION],[$netsnmp_cv__func__name],
Packit Service b38f0b
        [Should evaluate to the name of the current function if defined])
Packit Service b38f0b
fi
Packit Service b38f0b
Packit Service b38f0b
Packit Service b38f0b
#       Whether static inline functions are broken      (SCO Unixware)
Packit Service b38f0b
#
Packit Service b38f0b
AC_CACHE_CHECK([[whether static inline functions are broken (Unixware)]],
Packit Service b38f0b
                [netsnmp_cv_broken_inline],
Packit Service b38f0b
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([
Packit Service b38f0b
static inline int nested_inline_function(void) {
Packit Service b38f0b
  return 0;
Packit Service b38f0b
}
Packit Service b38f0b
inline int main_inline_function( void ) {
Packit Service b38f0b
  return nested_inline_function();
Packit Service b38f0b
}
Packit Service b38f0b
    ])], [[
Packit Service b38f0b
#       Yes -  static inline functions are broken       (Solaris 2.x)
Packit Service b38f0b
#
Packit Service b38f0b
case "$target_os" in
Packit Service b38f0b
    solaris*)
Packit Service b38f0b
        netsnmp_cv_broken_inline=yes
Packit Service b38f0b
        ;;
Packit Service b38f0b
    *)
Packit Service b38f0b
        netsnmp_cv_broken_inline=no
Packit Service b38f0b
        ;;
Packit Service b38f0b
esac]], [
Packit Service b38f0b
    netsnmp_cv_broken_inline=yes]
Packit Service b38f0b
))
Packit Service b38f0b
Packit Service b38f0b
if test "$netsnmp_cv_broken_inline" = yes ; then
Packit Service b38f0b
  AC_DEFINE(NETSNMP_BROKEN_INLINE, 1,
Packit Service b38f0b
        [Define if static inline functions are unsupported])
Packit Service b38f0b
fi
Packit Service b38f0b
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   Mis-placed (non-function) checks:
Packit Service b38f0b
##
Packit Service b38f0b
Packit Service b38f0b
AC_CACHE_CHECK([for SIOCGIFADDR in sys/ioctl.h],
Packit Service b38f0b
               netsnmp_cv_sys_ioctl_h_has_SIOCGIFADDR,
Packit Service b38f0b
    AC_COMPILE_IFELSE(
Packit Service b38f0b
        [AC_LANG_PROGRAM([[
Packit Service b38f0b
#ifdef HAVE_SYS_IOCTL_H
Packit Service b38f0b
#include <sys/ioctl.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef SIOCGIFADDR
Packit Service b38f0b
No SIOCGIFADDR found here.
Packit Service b38f0b
#endif
Packit Service b38f0b
        ]])],
Packit Service b38f0b
    [netsnmp_cv_sys_ioctl_h_has_SIOCGIFADDR=yes],
Packit Service b38f0b
    [netsnmp_cv_sys_ioctl_h_has_SIOCGIFADDR=no]))
Packit Service b38f0b
if test $netsnmp_cv_sys_ioctl_h_has_SIOCGIFADDR = yes; then
Packit Service b38f0b
  AC_DEFINE(SYS_IOCTL_H_HAS_SIOCGIFADDR, 1,
Packit Service b38f0b
   [define if SIOCGIFADDR exists in sys/ioctl.h])
Packit Service b38f0b
fi
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   Check how to print a size_t variable
Packit Service b38f0b
##
Packit Service b38f0b
Packit Service b38f0b
AC_CACHE_CHECK(
Packit Service b38f0b
    [the underlying type of a size_t],
Packit Service b38f0b
    netsnmp_cv_size_t_type,
Packit Service b38f0b
    [m4_foreach([TYPE], [[int],[long],[long long],[short],[char]],
Packit Service b38f0b
     [if [[ x$netsnmp_cv_size_t_type = x ]] ; then
Packit Service b38f0b
         AC_COMPILE_IFELSE(
Packit Service b38f0b
	     [AC_LANG_PROGRAM(
Packit Service b38f0b
[AC_INCLUDES_DEFAULT()
Packit Service b38f0b
extern unsigned TYPE variable;
Packit Service b38f0b
extern size_t variable;],
Packit Service b38f0b
                 [])],
Packit Service b38f0b
             [netsnmp_cv_size_t_type="TYPE"])
Packit Service b38f0b
     fi
Packit Service b38f0b
    ])])
Packit Service b38f0b
Packit Service b38f0b
AC_MSG_CHECKING([how to printf a size_t])
Packit Service b38f0b
case "$netsnmp_cv_size_t_type" in
Packit Service b38f0b
    char|short|int) netsnmp_PRIz="" ;;
Packit Service b38f0b
    long) netsnmp_PRIz="l" ;;
Packit Service b38f0b
    "long long") netsnmp_PRIz="ll" ;;
Packit Service b38f0b
    *) AC_MSG_ERROR([underlying type of size_t not known]) ;;
Packit Service b38f0b
esac
Packit Service b38f0b
AC_MSG_RESULT($netsnmp_PRIz)
Packit Service b38f0b
AC_DEFINE_UNQUOTED([NETSNMP_PRIz], ["$netsnmp_PRIz"],
Packit Service b38f0b
                   [Size prefix to use to printf a size_t or ssize_t])
Packit Service b38f0b
Packit Service b38f0b
##
Packit Service b38f0b
#   Check how to print a uint32_t variable
Packit Service b38f0b
##
Packit Service b38f0b
Packit Service b38f0b
AC_CACHE_CHECK(
Packit Service b38f0b
    [the underlying type of an uint32_t],
Packit Service b38f0b
    netsnmp_cv_uint32_t_type,
Packit Service b38f0b
    [m4_foreach([TYPE], [[char],[short],[int],[long],[long long]],
Packit Service b38f0b
     [if [[ x$netsnmp_cv_uint32_t_type = x ]] ; then
Packit Service b38f0b
         AC_COMPILE_IFELSE(
Packit Service b38f0b
	     [AC_LANG_PROGRAM(
Packit Service b38f0b
[AC_INCLUDES_DEFAULT()
Packit Service b38f0b
extern unsigned TYPE variable;
Packit Service b38f0b
extern uint32_t variable;],
Packit Service b38f0b
                 [])],
Packit Service b38f0b
             [netsnmp_cv_uint32_t_type="TYPE"])
Packit Service b38f0b
     fi
Packit Service b38f0b
    ])])
Packit Service b38f0b
Packit Service b38f0b
AC_MSG_CHECKING([how to printf a uint32_t])
Packit Service b38f0b
case "$netsnmp_cv_uint32_t_type" in
Packit Service b38f0b
    char|short|int) netsnmp_PRI32="" ;;
Packit Service b38f0b
    long) netsnmp_PRI32="l" ;;
Packit Service b38f0b
    "long long") netsnmp_PRI32="ll" ;;
Packit Service b38f0b
    *) AC_MSG_ERROR([underlying type of uint32_t not known]) ;;
Packit Service b38f0b
esac
Packit Service b38f0b
AC_MSG_RESULT($netsnmp_PRI32)
Packit Service b38f0b
AC_DEFINE_UNQUOTED([NETSNMP_PRI32], ["$netsnmp_PRI32"],
Packit Service b38f0b
                   [Size prefix to use to printf a uint32_t])
Packit Service b38f0b
Packit Service b38f0b
# check to see if the openssl is good enough for DTLS
Packit Service b38f0b
# (BIO_dgram_get_peer is a macro, not a true function)
Packit Service b38f0b
if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
Packit Service b38f0b
    AC_CACHE_VAL(
Packit Service b38f0b
       netsnmp_cv_bio_dgram_get_peer,
Packit Service b38f0b
       AC_MSG_CHECKING([[for BIO_dgram_get_peer]])
Packit Service b38f0b
       [
Packit Service b38f0b
        oldLIBS="$LIBS"
Packit Service b38f0b
        LIBS="$LIBS -lcrypto"
Packit Service b38f0b
        AC_LINK_IFELSE(
Packit Service b38f0b
          [AC_LANG_PROGRAM(
Packit Service b38f0b
            [[#include <openssl/bio.h>]],
Packit Service b38f0b
            [[BIO_dgram_get_peer(NULL, NULL);]])], [],
Packit Service b38f0b
          [AC_MSG_ERROR(DTLS support requires a newer version of OpenSSL)])
Packit Service b38f0b
Packit Service b38f0b
        LIBS="$oldLIBS"
Packit Service b38f0b
       ]
Packit Service b38f0b
       AC_MSG_RESULT(yes)
Packit Service b38f0b
    )
Packit Service b38f0b
fi
Packit Service b38f0b