Mercurial > hg > nginx-vendor-0-6
comparison src/os/unix/ngx_linux_init.c @ 344:eae74a780a84 NGINX_0_6_16
nginx 0.6.16
*) Change: now the uname(2) is used on Linux instead of procfs.
Thanks to Ilya Novikov.
*) Bugfix: if the "?" character was in a "error_page" directive, then
it was escaped in a proxied request; bug appeared in 0.6.11.
*) Bugfix: compatibility with mget.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 29 Oct 2007 00:00:00 +0300 |
parents | 29a6403156b0 |
children | 583decdb82a4 |
comparison
equal
deleted
inserted
replaced
343:81bf600d64d5 | 344:eae74a780a84 |
---|---|
6 | 6 |
7 #include <ngx_config.h> | 7 #include <ngx_config.h> |
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 | 9 |
10 | 10 |
11 static ngx_int_t ngx_linux_procfs(char *name, char *buf, size_t len, | 11 u_char ngx_linux_kern_ostype[50]; |
12 ngx_log_t *log); | 12 u_char ngx_linux_kern_osrelease[50]; |
13 | |
14 | |
15 char ngx_linux_kern_ostype[50]; | |
16 char ngx_linux_kern_osrelease[50]; | |
17 | 13 |
18 int ngx_linux_rtsig_max; | 14 int ngx_linux_rtsig_max; |
19 | 15 |
20 | 16 |
21 static ngx_os_io_t ngx_linux_io = { | 17 static ngx_os_io_t ngx_linux_io = { |
33 | 29 |
34 | 30 |
35 ngx_int_t | 31 ngx_int_t |
36 ngx_os_specific_init(ngx_log_t *log) | 32 ngx_os_specific_init(ngx_log_t *log) |
37 { | 33 { |
38 int name[2]; | 34 int name[2]; |
39 size_t len; | 35 size_t len; |
40 ngx_err_t err; | 36 ngx_err_t err; |
37 struct utsname u; | |
41 | 38 |
42 if (ngx_linux_procfs("/proc/sys/kernel/ostype", | 39 if (uname(&u) == -1) { |
43 ngx_linux_kern_ostype, | 40 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed"); |
44 sizeof(ngx_linux_kern_ostype), log) | |
45 == -1) | |
46 { | |
47 return NGX_ERROR; | 41 return NGX_ERROR; |
48 } | 42 } |
49 | 43 |
50 if (ngx_linux_procfs("/proc/sys/kernel/osrelease", | 44 (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname, |
51 ngx_linux_kern_osrelease, | 45 sizeof(ngx_linux_kern_ostype)); |
52 sizeof(ngx_linux_kern_osrelease), log) | |
53 == -1) | |
54 { | |
55 return NGX_ERROR; | |
56 } | |
57 | 46 |
47 (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release, | |
48 sizeof(ngx_linux_kern_osrelease)); | |
58 | 49 |
59 name[0] = CTL_KERN; | 50 name[0] = CTL_KERN; |
60 name[1] = KERN_RTSIGMAX; | 51 name[1] = KERN_RTSIGMAX; |
61 len = sizeof(ngx_linux_rtsig_max); | 52 len = sizeof(ngx_linux_rtsig_max); |
62 | 53 |
87 ngx_linux_kern_ostype, ngx_linux_kern_osrelease); | 78 ngx_linux_kern_ostype, ngx_linux_kern_osrelease); |
88 | 79 |
89 ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d", | 80 ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d", |
90 ngx_linux_rtsig_max); | 81 ngx_linux_rtsig_max); |
91 } | 82 } |
92 | |
93 | |
94 static ngx_int_t | |
95 ngx_linux_procfs(char *name, char *buf, size_t len, ngx_log_t *log) | |
96 { | |
97 int n; | |
98 ngx_fd_t fd; | |
99 | |
100 fd = open(name, O_RDONLY); | |
101 | |
102 if (fd == NGX_INVALID_FILE) { | |
103 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | |
104 "open(\"%s\") failed", name); | |
105 | |
106 return NGX_ERROR; | |
107 } | |
108 | |
109 n = read(fd, buf, len); | |
110 | |
111 if (n == -1) { | |
112 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | |
113 "read(\"%s\") failed", name); | |
114 | |
115 } else { | |
116 if (buf[n - 1] == '\n') { | |
117 buf[--n] = '\0'; | |
118 } | |
119 } | |
120 | |
121 ngx_close_file(fd); | |
122 | |
123 return n; | |
124 } |