diff options
author | Igor Sysoev <igor@sysoev.ru> | 2007-10-26 16:38:53 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2007-10-26 16:38:53 +0000 |
commit | 4724f2b17c79a60104402139b4b64b11c7cccb01 (patch) | |
tree | f2b43551afe26659a39ce506749ce565ad9fb5d7 | |
parent | e430ab4d5540259bb864745b0aa04ffe2ec8a0e9 (diff) | |
download | nginx-4724f2b17c79a60104402139b4b64b11c7cccb01.tar.gz nginx-4724f2b17c79a60104402139b4b64b11c7cccb01.zip |
use uname(2) instead of /proc/, this allows to run nginx in chroot
-rw-r--r-- | src/os/unix/ngx_linux_config.h | 1 | ||||
-rw-r--r-- | src/os/unix/ngx_linux_init.c | 68 |
2 files changed, 14 insertions, 55 deletions
diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index 3e0475ffc..c584ff885 100644 --- 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> diff --git a/src/os/unix/ngx_linux_init.c b/src/os/unix/ngx_linux_init.c index 3a013a0bf..f372e82a3 100644 --- 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; - - if (ngx_linux_procfs("/proc/sys/kernel/ostype", - ngx_linux_kern_ostype, - sizeof(ngx_linux_kern_ostype), log) - == -1) - { - return NGX_ERROR; - } + int name[2]; + size_t len; + ngx_err_t err; + struct utsname u; - if (ngx_linux_procfs("/proc/sys/kernel/osrelease", - ngx_linux_kern_osrelease, - sizeof(ngx_linux_kern_osrelease), log) - == -1) - { + if (uname(&u) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed"); 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; -} |