Mercurial > hg > nginx
comparison src/os/win32/ngx_win32_init.c @ 461:a88a3e4e158f release-0.1.5
nginx-0.1.5-RELEASE import
*) Bugfix: on Solaris and Linux there may be too many "recvmsg()
returned not enough data" alerts.
*) Bugfix: there were the "writev() failed (22: Invalid argument)"
errors on Solaris in proxy mode without sendfile. On other platforms
that do not support sendfile at all the process got caught in an
endless loop.
*) Bugfix: segmentation fault on Solaris in proxy mode and using
sendfile.
*) Bugfix: segmentation fault on Solaris.
*) Bugfix: on-line upgrade did not work on Linux.
*) Bugfix: the ngx_http_autoindex_module module did not escape the
spaces, the quotes, and the percent signs in the directory listing.
*) Change: the decrease of the copy operations.
*) Feature: the userid_p3p directive.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 11 Nov 2004 14:07:14 +0000 |
parents | 3b1e8c9df9ad |
children | 8e8f3af115b5 |
comparison
equal
deleted
inserted
replaced
460:5f8319142dfc | 461:a88a3e4e158f |
---|---|
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 | 9 |
10 | 10 |
11 ngx_uint_t ngx_win32_version; | 11 ngx_uint_t ngx_win32_version; |
12 ngx_uint_t ngx_ncpu; | 12 ngx_uint_t ngx_ncpu; |
13 ngx_uint_t ngx_max_wsabufs; | |
13 ngx_int_t ngx_max_sockets; | 14 ngx_int_t ngx_max_sockets; |
14 ngx_uint_t ngx_inherited_nonblocking = 1; | 15 ngx_uint_t ngx_inherited_nonblocking = 1; |
15 ngx_fd_t ngx_stderr_fileno; | 16 ngx_fd_t ngx_stderr_fileno; |
16 | 17 |
17 | 18 |
29 WORD wSuiteMask; | 30 WORD wSuiteMask; |
30 BYTE wProductType; | 31 BYTE wProductType; |
31 } ngx_osviex_stub_t; | 32 } ngx_osviex_stub_t; |
32 | 33 |
33 | 34 |
35 static u_int osviex; | |
36 static OSVERSIONINFOEX osvi; | |
37 | |
34 /* Should these pointers be per protocol ? */ | 38 /* Should these pointers be per protocol ? */ |
35 LPFN_ACCEPTEX acceptex; | 39 LPFN_ACCEPTEX acceptex; |
36 LPFN_GETACCEPTEXSOCKADDRS getacceptexsockaddrs; | 40 LPFN_GETACCEPTEXSOCKADDRS getacceptexsockaddrs; |
37 LPFN_TRANSMITFILE transmitfile; | 41 LPFN_TRANSMITFILE transmitfile; |
38 | 42 |
41 static GUID tf_guid = WSAID_TRANSMITFILE; | 45 static GUID tf_guid = WSAID_TRANSMITFILE; |
42 | 46 |
43 | 47 |
44 ngx_int_t ngx_os_init(ngx_log_t *log) | 48 ngx_int_t ngx_os_init(ngx_log_t *log) |
45 { | 49 { |
46 u_int osviex; | 50 DWORD bytes; |
47 DWORD bytes; | 51 SOCKET s; |
48 SOCKET s; | 52 WSADATA wsd; |
49 WSADATA wsd; | 53 SYSTEM_INFO si; |
50 SYSTEM_INFO si; | |
51 OSVERSIONINFOEX osvi; | |
52 ngx_osviex_stub_t *osviex_stub; | |
53 | 54 |
54 /* get Windows version */ | 55 /* get Windows version */ |
55 | 56 |
56 ngx_memzero(&osvi, sizeof(OSVERSIONINFOEX)); | 57 ngx_memzero(&osvi, sizeof(OSVERSIONINFOEX)); |
57 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); | 58 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); |
88 + osvi.dwMinorVersion * 100; | 89 + osvi.dwMinorVersion * 100; |
89 | 90 |
90 if (osviex) { | 91 if (osviex) { |
91 ngx_win32_version += osvi.wServicePackMajor * 10 | 92 ngx_win32_version += osvi.wServicePackMajor * 10 |
92 + osvi.wServicePackMinor; | 93 + osvi.wServicePackMinor; |
94 } | |
95 | |
96 GetSystemInfo(&si); | |
97 ngx_pagesize = si.dwPageSize; | |
98 ngx_ncpu = si.dwNumberOfProcessors; | |
99 | |
100 | |
101 /* init Winsock */ | |
102 | |
103 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { | |
104 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
105 "WSAStartup() failed"); | |
106 return NGX_ERROR; | |
107 } | |
108 | |
109 if (ngx_win32_version < NGX_WIN_NT) { | |
110 ngx_max_wsabufs = 16; | |
111 return NGX_OK; | |
112 } | |
113 | |
114 /* STUB: ngx_uint_t max */ | |
115 ngx_max_wsabufs = 1024 * 1024; | |
116 | |
117 /* get AcceptEx(), GetAcceptExSockAddrs() and TransmitFile() addresses */ | |
118 | |
119 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); | |
120 if (s == -1) { | |
121 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
122 ngx_socket_n " falied"); | |
123 return NGX_ERROR; | |
124 } | |
125 | |
126 if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ae_guid, sizeof(GUID), | |
127 &acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL) == -1) { | |
128 | |
129 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
130 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " | |
131 "WSAID_ACCEPTEX) failed"); | |
132 return NGX_ERROR; | |
133 } | |
134 | |
135 if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID), | |
136 &getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS), | |
137 &bytes, NULL, NULL) == -1) { | |
138 | |
139 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
140 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " | |
141 "WSAID_ACCEPTEX) failed"); | |
142 return NGX_ERROR; | |
143 } | |
144 | |
145 if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID), | |
146 &transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes, | |
147 NULL, NULL) == -1) { | |
148 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
149 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " | |
150 "WSAID_TRANSMITFILE) failed"); | |
151 return NGX_ERROR; | |
152 } | |
153 | |
154 if (ngx_close_socket(s) == -1) { | |
155 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, | |
156 ngx_close_socket_n " failed"); | |
157 } | |
158 | |
159 return NGX_OK; | |
160 } | |
161 | |
162 | |
163 void ngx_os_status(ngx_log_t *log) | |
164 { | |
165 ngx_osviex_stub_t *osviex_stub; | |
166 | |
167 if (osviex) { | |
93 | 168 |
94 /* | 169 /* |
95 * the MSVC 6.0 SP2 defines wSuiteMask and wProductType | 170 * the MSVC 6.0 SP2 defines wSuiteMask and wProductType |
96 * as WORD wReserved[2] | 171 * as WORD wReserved[2] |
97 */ | 172 */ |
98 osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor; | 173 osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor; |
99 | 174 |
100 ngx_log_error(NGX_LOG_INFO, log, 0, | 175 ngx_log_error(NGX_LOG_INFO, log, 0, |
101 "OS: %u build:%u, \"%s\", suite:%x, type:%u", | 176 "OS: %ud build:%ud, \"%s\", suite:%Xd, type:%ud", |
102 ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion, | 177 ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion, |
103 osviex_stub->wSuiteMask, osviex_stub->wProductType); | 178 osviex_stub->wSuiteMask, osviex_stub->wProductType); |
104 | 179 |
105 } else { | 180 } else { |
106 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { | 181 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { |
107 | 182 |
108 /* Win9x build */ | 183 /* Win9x build */ |
109 | 184 |
110 ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u.%u.%u, \"%s\"", | 185 ngx_log_error(NGX_LOG_INFO, log, 0, |
186 "OS: %u build:%ud.%ud.%ud, \"%s\"", | |
111 ngx_win32_version, | 187 ngx_win32_version, |
112 osvi.dwBuildNumber >> 24, | 188 osvi.dwBuildNumber >> 24, |
113 (osvi.dwBuildNumber >> 16) & 0xff, | 189 (osvi.dwBuildNumber >> 16) & 0xff, |
114 osvi.dwBuildNumber & 0xffff, | 190 osvi.dwBuildNumber & 0xffff, |
115 osvi.szCSDVersion); | 191 osvi.szCSDVersion); |
121 * | 197 * |
122 * we do not currently support VER_PLATFORM_WIN32_CE | 198 * we do not currently support VER_PLATFORM_WIN32_CE |
123 * and we do not support VER_PLATFORM_WIN32s at all | 199 * and we do not support VER_PLATFORM_WIN32s at all |
124 */ | 200 */ |
125 | 201 |
126 ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u, \"%s\"", | 202 ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %ud build:%ud, \"%s\"", |
127 ngx_win32_version, osvi.dwBuildNumber, | 203 ngx_win32_version, osvi.dwBuildNumber, |
128 osvi.szCSDVersion); | 204 osvi.szCSDVersion); |
129 } | 205 } |
130 } | 206 } |
131 | |
132 GetSystemInfo(&si); | |
133 ngx_pagesize = si.dwPageSize; | |
134 ngx_ncpu = si.dwNumberOfProcessors; | |
135 | |
136 | |
137 /* init Winsock */ | |
138 | |
139 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { | |
140 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
141 "WSAStartup() failed"); | |
142 return NGX_ERROR; | |
143 } | |
144 | |
145 if (ngx_win32_version < NGX_WIN_NT) { | |
146 return NGX_OK; | |
147 } | |
148 | |
149 /* get AcceptEx(), GetAcceptExSockAddrs() and TransmitFile() addresses */ | |
150 | |
151 s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); | |
152 if (s == -1) { | |
153 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
154 ngx_socket_n " %s falied"); | |
155 return NGX_ERROR; | |
156 } | |
157 | |
158 if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ae_guid, sizeof(GUID), | |
159 &acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL) == -1) { | |
160 | |
161 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
162 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " | |
163 "WSAID_ACCEPTEX) failed"); | |
164 return NGX_ERROR; | |
165 } | |
166 | |
167 if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID), | |
168 &getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS), | |
169 &bytes, NULL, NULL) == -1) { | |
170 | |
171 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
172 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " | |
173 "WSAID_ACCEPTEX) failed"); | |
174 return NGX_ERROR; | |
175 } | |
176 | |
177 if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID), | |
178 &transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes, | |
179 NULL, NULL) == -1) { | |
180 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, | |
181 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " | |
182 "WSAID_TRANSMITFILE) failed"); | |
183 return NGX_ERROR; | |
184 } | |
185 | |
186 if (ngx_close_socket(s) == -1) { | |
187 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, | |
188 ngx_close_socket_n " failed"); | |
189 } | |
190 | |
191 return NGX_OK; | |
192 } | 207 } |
193 | |
194 | |
195 void ngx_os_status(ngx_log_t *log) | |
196 { | |
197 } |