# -*- autoconf -*-
#########################################
##
# Checks for library functions.
##
#########################################

##
#   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([lrand48         rand          random    ] dnl
               [signal          sigset                  ] )

#  Library:
AC_CHECK_FUNCS([fork            gai_strerror                   ] dnl
               [getaddrinfo     gethostname   gethostbyname    ] dnl
               [getipnodebyname               gettimeofday     ] dnl
               [if_nametoindex  mkstemp       regcomp          ] dnl
               [readdir                                        ] dnl
               [setenv          setitimer     setlocale        ] dnl
               [setsid          snprintf                       ] dnl
               [strcasestr      strdup        strerror         ] dnl
               [strlcat         strlcpy       strncasecmp      ] dnl
               [strtok_r        strtol        strtoul          ] dnl
               [strtoull        sysconf       times            ] dnl
               [vsnprintf                                      ] )

#  Agent:
AC_CHECK_FUNCS([cgetnext        execv         gai_strerror     ] dnl
               [getfsstat       getgrnam      gethostname      ] dnl
               [                getloadavg                     ] dnl
               [getpid          getpwnam      getvfsstat       ] dnl
               [hasmntopt       initgroups                     ] dnl
               [if_nameindex    if_nametoindex                 ] dnl
               [kinfo_get_cpus                                 ] dnl
               [mkstemp         mktime                         ] dnl
               [poll            regcomp                        ] dnl
               [setgid          setgroups                      ] dnl
               [setmntent       setuid                         ] dnl
               [sigaction       sigblock      sighold          ] 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_TRY_RUN([
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#include <sys/types.h>
#ifdef HAVE_SYS_MOUNT_H
#include <sys/mount.h>
#endif
#ifdef HAVE_SYS_FS_TYPES_H
#include <sys/fs_types.h>
#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_c_broken_inline],
    AC_COMPILE_IFELSE([[
static inline int nested_inline_function(void) {
  return 0;
}
inline int main_inline_function( void ) {
  return nested_inline_function();
}
    ]],
    netsnmp_cv_broken_inline=no,
    netsnmp_cv_broken_inline=yes))


#       Yes -  static inline functions are broken       (Solaris 2.x)
#
case "$target_os" in
    solaris*)
        netsnmp_cv_broken_inline=yes
        ;;
    *)
        ;;
esac

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 <sys/ioctl.h>
#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])
