Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/unix/ngx_linux_init.c')
-rw-r--r--src/os/unix/ngx_linux_init.c71
1 files changed, 52 insertions, 19 deletions
diff --git a/src/os/unix/ngx_linux_init.c b/src/os/unix/ngx_linux_init.c
index 8d2f7915e..195d64d81 100644
--- 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;
+}