nginx/src/os/win32/ngx_win32_init.c

283 lines
8.1 KiB
C
Raw Normal View History

2003-05-20 00:39:14 +08:00
/*
* Copyright (C) Igor Sysoev
2012-01-18 23:07:43 +08:00
* Copyright (C) Nginx, Inc.
*/
2003-05-20 23:37:55 +08:00
#include <ngx_config.h>
#include <ngx_core.h>
#include <nginx.h>
2003-05-20 23:37:55 +08:00
2003-06-11 23:28:34 +08:00
2004-10-04 04:02:06 +08:00
ngx_uint_t ngx_win32_version;
ngx_uint_t ngx_ncpu;
ngx_uint_t ngx_max_wsabufs;
2004-10-04 04:02:06 +08:00
ngx_int_t ngx_max_sockets;
ngx_uint_t ngx_inherited_nonblocking = 1;
ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush;
char ngx_unique[NGX_INT32_LEN + 1];
2003-05-20 23:37:55 +08:00
ngx_os_io_t ngx_os_io = {
2003-05-21 21:28:21 +08:00
ngx_wsarecv,
2003-11-17 05:49:42 +08:00
ngx_wsarecv_chain,
2007-12-04 00:46:46 +08:00
ngx_udp_wsarecv,
2009-04-20 14:08:47 +08:00
ngx_wsasend,
2003-06-11 23:28:34 +08:00
ngx_wsasend_chain,
0
2003-05-20 23:37:55 +08:00
};
2003-05-20 00:39:14 +08:00
2004-03-10 03:47:07 +08:00
typedef struct {
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
} ngx_osviex_stub_t;
static u_int osviex;
static OSVERSIONINFOEX osvi;
2003-06-03 23:42:58 +08:00
/* Should these pointers be per protocol ? */
LPFN_ACCEPTEX ngx_acceptex;
LPFN_GETACCEPTEXSOCKADDRS ngx_getacceptexsockaddrs;
LPFN_TRANSMITFILE ngx_transmitfile;
LPFN_TRANSMITPACKETS ngx_transmitpackets;
LPFN_CONNECTEX ngx_connectex;
LPFN_DISCONNECTEX ngx_disconnectex;
static GUID ax_guid = WSAID_ACCEPTEX;
2003-06-03 23:42:58 +08:00
static GUID as_guid = WSAID_GETACCEPTEXSOCKADDRS;
static GUID tf_guid = WSAID_TRANSMITFILE;
static GUID tp_guid = WSAID_TRANSMITPACKETS;
static GUID cx_guid = WSAID_CONNECTEX;
static GUID dx_guid = WSAID_DISCONNECTEX;
2003-06-03 23:42:58 +08:00
2009-04-20 14:08:47 +08:00
ngx_int_t
ngx_os_init(ngx_log_t *log)
2003-05-20 00:39:14 +08:00
{
DWORD bytes;
SOCKET s;
WSADATA wsd;
ngx_err_t err;
2006-11-20 16:51:45 +08:00
ngx_uint_t n;
SYSTEM_INFO si;
2003-06-06 22:59:20 +08:00
/* get Windows version */
2003-06-11 23:28:34 +08:00
ngx_memzero(&osvi, sizeof(OSVERSIONINFOEX));
2003-06-06 22:59:20 +08:00
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osviex = GetVersionEx((OSVERSIONINFO *) &osvi);
if (osviex == 0) {
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
2003-06-11 23:28:34 +08:00
if (GetVersionEx((OSVERSIONINFO *) &osvi) == 0) {
2003-06-06 22:59:20 +08:00
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"GetVersionEx() failed");
return NGX_ERROR;
}
}
/*
2003-12-15 04:10:27 +08:00
* Windows 3.1 Win32s 0xxxxx
*
2003-06-11 23:28:34 +08:00
* Windows 95 140000
* Windows 98 141000
* Windows ME 149000
* Windows NT 3.51 235100
* Windows NT 4.0 240000
* Windows NT 4.0 SP5 240050
* Windows 2000 250000
* Windows XP 250100
* Windows 2003 250200
* Windows Vista/2008 260000
2003-12-15 04:10:27 +08:00
*
* Windows CE x.x 3xxxxx
2003-06-06 22:59:20 +08:00
*/
2003-06-11 23:28:34 +08:00
ngx_win32_version = osvi.dwPlatformId * 100000
+ osvi.dwMajorVersion * 10000
+ osvi.dwMinorVersion * 100;
2003-06-06 22:59:20 +08:00
if (osviex) {
2003-06-11 23:28:34 +08:00
ngx_win32_version += osvi.wServicePackMajor * 10
+ osvi.wServicePackMinor;
2003-06-06 22:59:20 +08:00
}
2004-06-07 03:49:18 +08:00
GetSystemInfo(&si);
ngx_pagesize = si.dwPageSize;
2004-06-30 23:30:41 +08:00
ngx_ncpu = si.dwNumberOfProcessors;
ngx_cacheline_size = NGX_CPU_CACHE_LINE;
2004-06-07 03:49:18 +08:00
2006-11-20 16:51:45 +08:00
for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }
/* delete default "C" locale for _wcsicmp() */
setlocale(LC_ALL, "");
2003-06-03 23:42:58 +08:00
/* init Winsock */
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
2003-06-06 22:59:20 +08:00
"WSAStartup() failed");
2003-06-03 23:42:58 +08:00
return NGX_ERROR;
}
2004-03-10 03:47:07 +08:00
if (ngx_win32_version < NGX_WIN_NT) {
ngx_max_wsabufs = 16;
2004-03-10 03:47:07 +08:00
return NGX_OK;
}
/* STUB: ngx_uint_t max */
ngx_max_wsabufs = 1024 * 1024;
/*
* get AcceptEx(), GetAcceptExSockAddrs(), TransmitFile(),
* TransmitPackets(), ConnectEx(), and DisconnectEx() addresses
*/
2003-06-03 23:42:58 +08:00
s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
2003-06-03 23:42:58 +08:00
if (s == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
ngx_socket_n " falied");
2003-05-20 00:39:14 +08:00
return NGX_ERROR;
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ax_guid, sizeof(GUID),
&ngx_acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL)
== -1)
{
ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,
2003-06-03 23:42:58 +08:00
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_ACCEPTEX) failed");
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID),
&ngx_getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS),
&bytes, NULL, NULL)
== -1)
{
ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,
2003-06-03 23:42:58 +08:00
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_GETACCEPTEXSOCKADDRS) failed");
2003-06-03 23:42:58 +08:00
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID),
&ngx_transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes,
NULL, NULL)
== -1)
{
ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,
2003-06-03 23:42:58 +08:00
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_TRANSMITFILE) failed");
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tp_guid, sizeof(GUID),
&ngx_transmitpackets, sizeof(LPFN_TRANSMITPACKETS), &bytes,
NULL, NULL)
== -1)
{
ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_TRANSMITPACKETS) failed");
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &cx_guid, sizeof(GUID),
&ngx_connectex, sizeof(LPFN_CONNECTEX), &bytes,
NULL, NULL)
== -1)
{
ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_CONNECTEX) failed");
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &dx_guid, sizeof(GUID),
&ngx_disconnectex, sizeof(LPFN_DISCONNECTEX), &bytes,
NULL, NULL)
== -1)
{
ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno,
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_DISCONNECTEX) failed");
2003-06-03 23:42:58 +08:00
}
if (ngx_close_socket(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
ngx_close_socket_n " failed");
}
2009-04-20 14:08:47 +08:00
if (GetEnvironmentVariable("ngx_unique", ngx_unique, NGX_INT32_LEN + 1)
!= 0)
{
ngx_process = NGX_PROCESS_WORKER;
} else {
err = ngx_errno;
if (err != ERROR_ENVVAR_NOT_FOUND) {
ngx_log_error(NGX_LOG_EMERG, log, err,
2009-04-20 14:08:47 +08:00
"GetEnvironmentVariable(\"ngx_unique\") failed");
return NGX_ERROR;
}
ngx_sprintf((u_char *) ngx_unique, "%P%Z", ngx_pid);
}
2003-05-20 00:39:14 +08:00
return NGX_OK;
}
2004-10-04 04:02:06 +08:00
2009-04-20 14:08:47 +08:00
void
ngx_os_status(ngx_log_t *log)
2004-10-04 04:02:06 +08:00
{
ngx_osviex_stub_t *osviex_stub;
ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER);
if (osviex) {
/*
* the MSVC 6.0 SP2 defines wSuiteMask and wProductType
* as WORD wReserved[2]
*/
osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor;
ngx_log_error(NGX_LOG_INFO, log, 0,
"OS: %ud build:%ud, \"%s\", suite:%Xd, type:%ud",
ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion,
osviex_stub->wSuiteMask, osviex_stub->wProductType);
} else {
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
/* Win9x build */
ngx_log_error(NGX_LOG_INFO, log, 0,
"OS: %u build:%ud.%ud.%ud, \"%s\"",
ngx_win32_version,
osvi.dwBuildNumber >> 24,
(osvi.dwBuildNumber >> 16) & 0xff,
osvi.dwBuildNumber & 0xffff,
osvi.szCSDVersion);
} else {
/*
* VER_PLATFORM_WIN32_NT
*
* we do not currently support VER_PLATFORM_WIN32_CE
* and we do not support VER_PLATFORM_WIN32s at all
*/
ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %ud build:%ud, \"%s\"",
ngx_win32_version, osvi.dwBuildNumber,
osvi.szCSDVersion);
}
}
2004-10-04 04:02:06 +08:00
}