changeset 1605:379ee44a4456

use uname(2) instead of /proc/, this allows to run nginx in chroot
author Igor Sysoev <igor@sysoev.ru>
date Fri, 26 Oct 2007 16:38:53 +0000
parents e27930ae2b8f
children 158aa4e8cc46
files src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux_init.c
diffstat 2 files changed, 13 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/src/os/unix/ngx_linux_config.h
+++ b/src/os/unix/ngx_linux_config.h
@@ -50,6 +50,7 @@
 #include <sys/ioctl.h>
 #include <sys/sysctl.h>
 #include <crypt.h>
+#include <sys/utsname.h>        /* uname() */
 
 
 #include <ngx_auto_config.h>
--- a/src/os/unix/ngx_linux_init.c
+++ b/src/os/unix/ngx_linux_init.c
@@ -8,12 +8,8 @@
 #include <ngx_core.h>
 
 
-static ngx_int_t ngx_linux_procfs(char *name, char *buf, size_t len,
-    ngx_log_t *log);
-
-
-char  ngx_linux_kern_ostype[50];
-char  ngx_linux_kern_osrelease[50];
+u_char  ngx_linux_kern_ostype[50];
+u_char  ngx_linux_kern_osrelease[50];
 
 int   ngx_linux_rtsig_max;
 
@@ -35,26 +31,21 @@ static ngx_os_io_t ngx_linux_io = {
 ngx_int_t
 ngx_os_specific_init(ngx_log_t *log)
 {
-    int        name[2];
-    size_t     len;
-    ngx_err_t  err;
+    int             name[2];
+    size_t          len;
+    ngx_err_t       err;
+    struct utsname  u;
 
-    if (ngx_linux_procfs("/proc/sys/kernel/ostype",
-                         ngx_linux_kern_ostype,
-                         sizeof(ngx_linux_kern_ostype), log)
-        == -1)
-    {
+    if (uname(&u) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed");
         return NGX_ERROR;
     }
 
-    if (ngx_linux_procfs("/proc/sys/kernel/osrelease",
-                         ngx_linux_kern_osrelease,
-                         sizeof(ngx_linux_kern_osrelease), log)
-        == -1)
-    {
-        return NGX_ERROR;
-    }
+    (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname,
+                       sizeof(ngx_linux_kern_ostype));
 
+    (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release,
+                       sizeof(ngx_linux_kern_osrelease));
 
     name[0] = CTL_KERN;
     name[1] = KERN_RTSIGMAX;
@@ -89,36 +80,3 @@ 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;
-}