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 }