
# Copyright (C) Igor Sysoev


if test -z "$NGX_PLATFORM"; then
    echo "checking for OS"

    NGX_SYSTEM=`uname -s 2>/dev/null`
    NGX_RELEASE=`uname -r 2>/dev/null`
    NGX_MACHINE=`uname -m 2>/dev/null`

    echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"

    NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";
else
    echo "building for $NGX_PLATFORM"
fi

case $NGX_PLATFORM in

    FreeBSD:* | DragonFly:*)
        . auto/os/freebsd
    ;;

    Linux:*)
        . auto/os/linux
    ;;

    SunOS:*)
        . auto/os/solaris
    ;;

    win32)
        . auto/os/win32
    ;;

    *)
        CORE_INCS="$UNIX_INCS"
        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"
        CORE_SRCS="$UNIX_SRCS"
    ;;

esac


case $NGX_MACHINE in

     i386|i686|i86pc|amd64)
         have=NGX_HAVE_NONALIGNED . auto/have
     ;;

esac


if [ $NGX_PLATFORM != win32 ]; then

     NGX_USER=${NGX_USER:-nobody}

    if [ -z "$NGX_GROUP" -a $NGX_USER = nobody ] ; then
       if grep nobody /etc/group 2>&1 >/dev/null; then
           echo "checking for nobody group ... found"
           NGX_GROUP=nobody
       else
           echo "checking for nobody group ... not found"

           if grep nogroup /etc/group 2>&1 >/dev/null; then
               echo "checking for nogroup group ... found"
               NGX_GROUP=nogroup
           else 
               echo "checking for nogroup group ... not found"
               NGX_GROUP=nobody
           fi
       fi

    else
        NGX_GROUP=$NGX_USER
    fi


    ngx_feature="/dev/poll"
    ngx_feature_name="NGX_HAVE_DEVPOLL"
    ngx_feature_run=no
    ngx_feature_incs="#include <sys/devpoll.h>"
    ngx_feature_libs=
    ngx_feature_test="int  n, dp; struct dvpoll  dvp;
                      dp = 0;
                      dvp.dp_fds = NULL;
                      dvp.dp_nfds = 0;
                      dvp.dp_timeout = 0;
                      n = ioctl(dp, DP_POLL, &dvp)"
    . auto/feature

    if [ $ngx_found = yes ]; then
        CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"
        EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"
        EVENT_FOUND=YES
    fi


    if test -z "$NGX_KQUEUE_CHECKED"; then
        ngx_feature="kqueue"
        ngx_feature_name="NGX_HAVE_KQUEUE"
        ngx_feature_run=no
        ngx_feature_incs="#include <sys/event.h>"
        ngx_feature_libs=
        ngx_feature_test="int kq; kq = kqueue()"
        . auto/feature

        if [ $ngx_found = yes ]; then

            have=NGX_HAVE_CLEAR_EVENT . auto/have
            EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"
            CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"
            EVENT_FOUND=YES

            ngx_feature="kqueue's NOTE_LOWAT"
            ngx_feature_name="NGX_HAVE_LOWAT_EVENT"
            ngx_feature_run=no
            ngx_feature_incs="#include <sys/event.h>"
            ngx_feature_libs=
            ngx_feature_test="struct kevent  kev;
                              kev.fflags = NOTE_LOWAT;"
            . auto/feature
        fi
    fi

    if [ NGX_SYSTEM != "NetBSD" ]; then

        # NetBSD 2.0 incompatibly defines kevent.udata as "intptr_t"
        cat << END >> $NGX_AUTO_CONFIG_H

#define NGX_KQUEUE_UDATA_T  (void *)

END

     fi
fi
