
#include <ngx_freebsd_init.h>


/* FreeBSD 3.4 at least */
char ngx_freebsd_kern_ostype[20];
char ngx_freebsd_kern_osrelease[20];
int ngx_freebsd_kern_osreldate;
int ngx_freebsd_hw_ncpu;
int ngx_freebsd_net_inet_tcp_sendspace;
int ngx_freebsd_sendfile_nbytes_bug;
int ngx_freebsd_use_tcp_nopush;

/* FreeBSD 5.0 */
int ngx_freebsd_kern_ipc_zero_copy_send;


ngx_os_io_t ngx_os_io = {
    ngx_unix_recv,
    ngx_readv_chain,
    NULL,
#if (HAVE_FREEBSD_SENDFILE)
    ngx_freebsd_sendfile_chain,
    NGX_HAVE_SENDFILE|NGX_HAVE_ZEROCOPY
#else
    ngx_writev_chain,
    NULL
#endif
};


typedef struct {
    char    *name;
    int     *value;
    size_t   size;
} sysctl_t;


sysctl_t sysctls[] = {
    {"hw.ncpu",
     &ngx_freebsd_hw_ncpu,
     sizeof(int)},

    {"net.inet.tcp.sendspace",
     &ngx_freebsd_net_inet_tcp_sendspace,
     sizeof(int)},

     /* FreeBSD 5.0 */

    {"kern.ipc.zero_copy.send",
     &ngx_freebsd_kern_ipc_zero_copy_send,
     sizeof(int)},

    {NULL, NULL, 0}
};


int ngx_os_init(ngx_log_t *log)
{
    int        i, version;
    size_t     size;
    ngx_err_t  err;

    size = sizeof(ngx_freebsd_kern_ostype);
    if (sysctlbyname("kern.ostype",
                     ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) {
        ngx_log_error(NGX_LOG_ALERT, log, errno,
                      "sysctlbyname(kern.ostype) failed");
        return NGX_ERROR;
    }

    size = sizeof(ngx_freebsd_kern_osrelease);
    if (sysctlbyname("kern.osrelease",
                     ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) {
        ngx_log_error(NGX_LOG_ALERT, log, errno,
                      "sysctlbyname(kern.osrelease) failed");
        return NGX_ERROR;
    }

    ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %s %s",
                  ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease);


    size = sizeof(int);
    if (sysctlbyname("kern.osreldate",
                     &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) {
        ngx_log_error(NGX_LOG_ALERT, log, errno,
                      "sysctlbyname(kern.osreldate) failed");
        return NGX_ERROR;
    }

    version = ngx_freebsd_kern_osreldate;

    ngx_log_error(NGX_LOG_INFO, log, 0,
                  "kern.osreldate: %d, built on %d",
                  version, __FreeBSD_version);


#if (HAVE_FREEBSD_SENDFILE)

    /*
     * The determination of the sendfile() nbytes bug is complex enough.
     * There're two sendfile() syscalls: a new 393 has no bug while
     * an old 336 has the bug in some versions and has not in others.
     * Besides libc_r wrapper also emulates the bug in some versions.
     * There's no way to say exactly if a given FreeBSD version has the bug.
     * Here is the algorithm that works at least for RELEASEs
     * and for syscalls only (not libc_r wrapper).
     *
     * We detect the new sendfile() version available at the compile time
     * to allow an old binary to run correctly on an updated FreeBSD system.
     */

#if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \
    || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039

    /* a new syscall without the bug */

    ngx_freebsd_sendfile_nbytes_bug = 0;

#else

    /* an old syscall that can have the bug */

    ngx_freebsd_sendfile_nbytes_bug = 1;

#endif

#endif /* HAVE_FREEBSD_SENDFILE */


    if ((version < 500000 && version >= 440003) || version >= 500017) {
        ngx_freebsd_use_tcp_nopush = 1;
    }


    for (i = 0; sysctls[i].name; i++) {
        *sysctls[i].value = 0;
        size = sysctls[i].size;
        if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
                                                                       == -1) {
            err = errno;
            if (err != NGX_ENOENT) {
                ngx_log_error(NGX_LOG_ALERT, log, err,
                              "sysctlbyname(%s) failed", sysctls[i].name);
                return NGX_ERROR;
            }

        } else {
            ngx_log_error(NGX_LOG_INFO, log, 0, "%s: %d",
                          sysctls[i].name, *sysctls[i].value);
        }
    }

    return ngx_posix_init(log);
}
