diff src/os/unix/ngx_freebsd_init.c @ 97:70d2345a903f

nginx-0.0.1-2003-05-29-17:02:09 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 29 May 2003 13:02:09 +0000
parents 8220378432a8
children a059e1aa65d4
line wrap: on
line diff
--- a/src/os/unix/ngx_freebsd_init.c
+++ b/src/os/unix/ngx_freebsd_init.c
@@ -2,6 +2,7 @@
 #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;
@@ -9,6 +10,9 @@ int ngx_freebsd_hw_ncpu;
 int ngx_freebsd_net_inet_tcp_sendspace;
 int ngx_freebsd_sendfile_nbytes_bug;
 
+/* FreeBSD 5.0 */
+int ngx_freebsd_kern_ipc_zero_copy_send;
+
 
 ngx_os_io_t ngx_os_io = {
     ngx_unix_recv,
@@ -19,9 +23,35 @@ ngx_os_io_t ngx_os_io = {
 };
 
 
+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)},
+
+    {"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)
 {
-    size_t  size;
+    int        i;
+    size_t     size;
+    ngx_err_t  err;
 
     size = 20;
     if (sysctlbyname("kern.ostype",
@@ -85,28 +115,23 @@ int ngx_os_init(ngx_log_t *log)
 #endif /* HAVE_FREEBSD_SENDFILE */
 
 
-    size = 4;
-    if (sysctlbyname("hw.ncpu", &ngx_freebsd_hw_ncpu, &size, NULL, 0) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, log, errno,
-                      "sysctlbyname(hw.ncpu) failed");
-        return NGX_ERROR;
-    }
-
-    ngx_log_error(NGX_LOG_INFO, log, 0, "hw.ncpu: %d", ngx_freebsd_hw_ncpu);
-
+    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;
+            }
 
-    size = 4;
-    if (sysctlbyname("net.inet.tcp.sendspace",
-                     &ngx_freebsd_net_inet_tcp_sendspace,
-                     &size, NULL, 0) == -1)
-    {
-        ngx_log_error(NGX_LOG_ALERT, log, errno,
-                      "sysctlbyname(net.inet.tcp.sendspace) failed");
-        return NGX_ERROR;
+        } else {
+            ngx_log_error(NGX_LOG_INFO, log, 0, "%s: %d",
+                          sysctls[i].name, *sysctls[i].value);
+        }
     }
 
-    ngx_log_error(NGX_LOG_INFO, log, 0, "net.inet.tcp.sendspace: %d",
-                  ngx_freebsd_net_inet_tcp_sendspace);
-
     return ngx_posix_init(log);
 }