diff src/os/unix/ngx_linux_init.c @ 222:dd6c66b5b0e2 NGINX_0_3_58

nginx 0.3.58 *) Feature: the "error_page" directive supports the variables. *) Change: now the procfs interface instead of sysctl is used on Linux. *) Change: now the "Content-Type" header line is inherited from first response when the "X-Accel-Redirect" was used. *) Bugfix: the "error_page" directive did not redirect the 413 error. *) Bugfix: the trailing "?" did not remove old arguments if no new arguments were added to a rewritten URI. *) Bugfix: nginx could not run on 64-bit FreeBSD 7.0-CURRENT.
author Igor Sysoev <http://sysoev.ru>
date Mon, 14 Aug 2006 00:00:00 +0400
parents e916a291e9aa
children 29a6403156b0
line wrap: on
line diff
--- a/src/os/unix/ngx_linux_init.c
+++ b/src/os/unix/ngx_linux_init.c
@@ -8,10 +8,14 @@
 #include <ngx_core.h>
 
 
-char ngx_linux_kern_ostype[50];
-char ngx_linux_kern_osrelease[20];
+static ngx_int_t ngx_linux_procfs(char *name, char *buf, size_t len,
+    ngx_log_t *log);
+
 
-int ngx_linux_rtsig_max;
+char  ngx_linux_kern_ostype[50];
+char  ngx_linux_kern_osrelease[20];
+
+int   ngx_linux_rtsig_max;
 
 
 static ngx_os_io_t ngx_linux_io = {
@@ -35,35 +39,31 @@ ngx_os_specific_init(ngx_log_t *log)
     size_t     len;
     ngx_err_t  err;
 
-    name[0] = CTL_KERN;
-    name[1] = KERN_OSTYPE;
-    len = sizeof(ngx_linux_kern_ostype);
-
-    if (sysctl(name, 2, ngx_linux_kern_ostype, &len, NULL, 0) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
-                      "sysctl(KERN_OSTYPE) failed");
+    if (ngx_linux_procfs("/proc/sys/kernel/ostype",
+                         ngx_linux_kern_ostype,
+                         sizeof(ngx_linux_kern_ostype), log)
+        == -1)
+    {
         return NGX_ERROR;
     }
 
-    /* name[0] = CTL_KERN; */
-    name[1] = KERN_OSRELEASE;
-    len = sizeof(ngx_linux_kern_osrelease);
-
-    if (sysctl(name, 2, ngx_linux_kern_osrelease, &len, NULL, 0) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
-                      "sysctl(KERN_OSRELEASE) failed");
+    if (ngx_linux_procfs("/proc/sys/kernel/osrelease",
+                         ngx_linux_kern_osrelease,
+                         sizeof(ngx_linux_kern_osrelease), log)
+        == -1)
+    {
         return NGX_ERROR;
     }
 
 
-    /* name[0] = CTL_KERN; */
+    name[0] = CTL_KERN;
     name[1] = KERN_RTSIGMAX;
     len = sizeof(ngx_linux_rtsig_max);
 
     if (sysctl(name, 2, &ngx_linux_rtsig_max, &len, NULL, 0) == -1) {
         err = ngx_errno;
 
-        if (err != NGX_ENOTDIR) {
+        if (err != NGX_ENOTDIR && err != NGX_ENOSYS) {
             ngx_log_error(NGX_LOG_ALERT, log, err,
                           "sysctl(KERN_RTSIGMAX) failed");
 
@@ -89,3 +89,36 @@ ngx_os_specific_status(ngx_log_t *log)
     ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d",
                   ngx_linux_rtsig_max);
 }
+
+
+static ngx_int_t
+ngx_linux_procfs(char *name, char *buf, size_t len, ngx_log_t *log)
+{
+    int       n;
+    ngx_fd_t  fd;
+
+    fd = open(name, O_RDONLY);
+
+    if (fd == NGX_INVALID_FILE) {
+        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+                      "open(\"%s\") failed", name);
+
+        return NGX_ERROR;
+    }
+
+    n = read(fd, buf, len);
+
+    if (n == -1) {
+        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+                      "read(\"%s\") failed", name);
+
+    } else {
+        if (buf[n - 1] == '\n') {
+            buf[--n] = '\0';
+        }
+    }
+
+    ngx_close_file(fd);
+
+    return n;
+}