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