Mercurial > hg > nginx-vendor-0-6
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; +}