comparison 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
comparison
equal deleted inserted replaced
221:52ac9a089ea5 222:dd6c66b5b0e2
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 char ngx_linux_kern_ostype[50]; 11 static ngx_int_t ngx_linux_procfs(char *name, char *buf, size_t len,
12 char ngx_linux_kern_osrelease[20]; 12 ngx_log_t *log);
13 13
14 int ngx_linux_rtsig_max; 14
15 char ngx_linux_kern_ostype[50];
16 char ngx_linux_kern_osrelease[20];
17
18 int ngx_linux_rtsig_max;
15 19
16 20
17 static ngx_os_io_t ngx_linux_io = { 21 static ngx_os_io_t ngx_linux_io = {
18 ngx_unix_recv, 22 ngx_unix_recv,
19 ngx_readv_chain, 23 ngx_readv_chain,
33 { 37 {
34 int name[2]; 38 int name[2];
35 size_t len; 39 size_t len;
36 ngx_err_t err; 40 ngx_err_t err;
37 41
38 name[0] = CTL_KERN; 42 if (ngx_linux_procfs("/proc/sys/kernel/ostype",
39 name[1] = KERN_OSTYPE; 43 ngx_linux_kern_ostype,
40 len = sizeof(ngx_linux_kern_ostype); 44 sizeof(ngx_linux_kern_ostype), log)
41 45 == -1)
42 if (sysctl(name, 2, ngx_linux_kern_ostype, &len, NULL, 0) == -1) { 46 {
43 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
44 "sysctl(KERN_OSTYPE) failed");
45 return NGX_ERROR; 47 return NGX_ERROR;
46 } 48 }
47 49
48 /* name[0] = CTL_KERN; */ 50 if (ngx_linux_procfs("/proc/sys/kernel/osrelease",
49 name[1] = KERN_OSRELEASE; 51 ngx_linux_kern_osrelease,
50 len = sizeof(ngx_linux_kern_osrelease); 52 sizeof(ngx_linux_kern_osrelease), log)
51 53 == -1)
52 if (sysctl(name, 2, ngx_linux_kern_osrelease, &len, NULL, 0) == -1) { 54 {
53 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
54 "sysctl(KERN_OSRELEASE) failed");
55 return NGX_ERROR; 55 return NGX_ERROR;
56 } 56 }
57 57
58 58
59 /* name[0] = CTL_KERN; */ 59 name[0] = CTL_KERN;
60 name[1] = KERN_RTSIGMAX; 60 name[1] = KERN_RTSIGMAX;
61 len = sizeof(ngx_linux_rtsig_max); 61 len = sizeof(ngx_linux_rtsig_max);
62 62
63 if (sysctl(name, 2, &ngx_linux_rtsig_max, &len, NULL, 0) == -1) { 63 if (sysctl(name, 2, &ngx_linux_rtsig_max, &len, NULL, 0) == -1) {
64 err = ngx_errno; 64 err = ngx_errno;
65 65
66 if (err != NGX_ENOTDIR) { 66 if (err != NGX_ENOTDIR && err != NGX_ENOSYS) {
67 ngx_log_error(NGX_LOG_ALERT, log, err, 67 ngx_log_error(NGX_LOG_ALERT, log, err,
68 "sysctl(KERN_RTSIGMAX) failed"); 68 "sysctl(KERN_RTSIGMAX) failed");
69 69
70 return NGX_ERROR; 70 return NGX_ERROR;
71 } 71 }
87 ngx_linux_kern_ostype, ngx_linux_kern_osrelease); 87 ngx_linux_kern_ostype, ngx_linux_kern_osrelease);
88 88
89 ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d", 89 ngx_log_error(NGX_LOG_NOTICE, log, 0, "sysctl(KERN_RTSIGMAX): %d",
90 ngx_linux_rtsig_max); 90 ngx_linux_rtsig_max);
91 } 91 }
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 }