
# Copyright (C) Igor Sysoev
# Copyright (C) NGINX, Inc.


# Linux 3.17 with glibc 2.25, FreeBSD 12, Solaris 11.3.

nxt_feature="getrandom()"
nxt_feature_name=NXT_HAVE_GETRANDOM
nxt_feature_run=yes
nxt_feature_incs=
nxt_feature_libs=
nxt_feature_test="#include <unistd.h>
                  #include <sys/random.h>

                  int main() {
                      char  buf[4];

                      if (getrandom(buf, 4, 0) < 0) {
                          return 1;
                      }

                      return 0;
                  }"
. auto/feature


if [ $nxt_found = no ]; then

    # Linux 3.17 SYS_getrandom.

    nxt_feature="SYS_getrandom in Linux"
    nxt_feature_name=NXT_HAVE_LINUX_SYS_GETRANDOM
    nxt_feature_test="#include <unistd.h>
                      #include <sys/syscall.h>
                      #include <linux/random.h>

                      int main() {
                          char  buf[4];

                          if (syscall(SYS_getrandom, buf, 4, 0) < 0) {
                              return 1;
                          }

                          return 0;
                      }"
    . auto/feature
fi


if [ $nxt_found = no ]; then

    # OpenBSD 5.6 lacks <sys/random.h>.

    nxt_feature="getentropy()"
    nxt_feature_name=NXT_HAVE_GETENTROPY
    nxt_feature_test="#include <unistd.h>

                      int main() {
                          char  buf[4];

                          if (getentropy(buf, 4) == -1) {
                              return 1;
                          }

                          return 0;
                      }"
    . auto/feature
fi


if [ $nxt_found = no ]; then

    # macOS 10.12.

    nxt_feature="getentropy() in sys/random.h"
    nxt_feature_name=NXT_HAVE_GETENTROPY_SYS_RANDOM
    nxt_feature_test="#include <unistd.h>
                      #include <sys/random.h>

                      int main() {
                          char  buf[4];

                          if (getentropy(buf, 4) == -1) {
                              return 1;
                          }

                          return 0;
                      }"
    . auto/feature
fi


nxt_feature="ucontext"
nxt_feature_name=NXT_HAVE_UCONTEXT
nxt_feature_run=
nxt_feature_incs=
nxt_feature_libs=
nxt_feature_test="#include <stdlib.h>
                  #include <ucontext.h>

                  int main() {
                      ucontext_t  uc;

                      if (getcontext(&uc) == 0) {
                          makecontext(&uc, NULL, 0);
                          setcontext(&uc);
                      }

                      return 0;
                  }"
. auto/feature


if [ $nxt_found = no ]; then

    # MacOSX 10.6 (Snow Leopard) has deprecated ucontext
    # and requires _XOPEN_SOURCE to be defined.

    nxt_feature="_XOPEN_SOURCE ucontext"
    nxt_feature_name=NXT_HAVE_UCONTEXT
    nxt_feature_run=
    nxt_feature_incs=
    nxt_feature_libs=
    nxt_feature_test="#define _XOPEN_SOURCE
                      #include <stdlib.h>
                      #include <ucontext.h>

                      int main() {
                          ucontext_t  uc;

                          if (getcontext(&uc) == 0) {
                              makecontext(&uc, NULL, 0);
                              setcontext(&uc);
                          }

                          return 0;
                      }"
    . auto/feature
fi


# FreeBSD dlopen() is in libc.
# MacOSX libdl.dylib is a symlink to libSystem.dylib.
# GCC5 AddressSanitizer intercepts dlopen() and dlclose() but not dlsym()
# so all dynamic linker functions should be tested.

NXT_LIBDL=

nxt_feature="dlopen()"
nxt_feature_name=NXT_HAVE_DLOPEN
nxt_feature_run=
nxt_feature_incs=
nxt_feature_libs=
nxt_feature_test="#include <stdlib.h>
                  #include <dlfcn.h>

                  int main() {
                      void *h = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL);
                      dlsym(h, \"\");
                      dlclose(h);
                      return 0;
                  }"
. auto/feature

if [ $nxt_found = no ]; then

    # Linux and Solaris prior to 10 require libdl.
    # Solaris 10 libdl.so.1 is a filter to /usr/lib/ld.so.1.

    nxt_feature="dlopen() in libdl"
    nxt_feature_libs="-ldl"
    . auto/feature

    if [ $nxt_found = yes ]; then
        NXT_LIBDL="-ldl"
    fi
fi


nxt_feature="posix_spawn()"
nxt_feature_name=NXT_HAVE_POSIX_SPAWN
nxt_feature_run=
nxt_feature_incs=
nxt_feature_libs=
nxt_feature_test="#include <spawn.h>
                  #include <unistd.h>

                  int main(int argc, char *argv[]) {
                      (void) posix_spawn(NULL, \"\", NULL, NULL, argv, NULL);
                      return 0;
                  }"
. auto/feature


# NetBSD 1.0, OpenBSD 1.0, FreeBSD 2.2 setproctitle().

nxt_feature="setproctitle()"
nxt_feature_name=NXT_HAVE_SETPROCTITLE
nxt_feature_run=
nxt_feature_incs=
nxt_feature_libs=
nxt_feature_test="#include <stdlib.h>
                  #include <unistd.h>

                  int main() {
                      setproctitle(\"%s\", \"title\");
                      return 0;
                  }"
. auto/feature


# Linux, FreeBSD, Solaris getgrouplist()
nxt_feature="getgrouplist()"
nxt_feature_name=NXT_HAVE_GETGROUPLIST
nxt_feature_run=
nxt_feature_incs=
nxt_feature_libs=
nxt_feature_test="#include <unistd.h>
                  #include <grp.h>

                  int main() {
                      getgrouplist(\"root\", 0, NULL, NULL);
                      return 0;
                  }"
. auto/feature
