blob: 5c3f00513878ecb220c01da5c39b4d9d3e068eda [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit586acc5fe2008-07-26 22:42:524
5#include <winsock2.h>
6
7#include "net/base/winsock_init.h"
8
[email protected]6b0c5e6c2009-04-14 18:02:569#include "base/logging.h"
initial.commit586acc5fe2008-07-26 22:42:5210#include "base/singleton.h"
11
[email protected]14d5cfb2008-10-06 10:41:3512namespace {
13
14class WinsockInitSingleton {
15 public:
16 WinsockInitSingleton() : did_init_(false) {
[email protected]6b0c5e6c2009-04-14 18:02:5617 WORD winsock_ver = MAKEWORD(2, 2);
[email protected]14d5cfb2008-10-06 10:41:3518 WSAData wsa_data;
19 did_init_ = (WSAStartup(winsock_ver, &wsa_data) == 0);
[email protected]6b0c5e6c2009-04-14 18:02:5620 if (did_init_) {
21 DCHECK(wsa_data.wVersion == winsock_ver);
[email protected]14d5cfb2008-10-06 10:41:3522
[email protected]6b0c5e6c2009-04-14 18:02:5623 // The first time WSAGetLastError is called, the delay load helper will
24 // resolve the address with GetProcAddress and fixup the import. If a
25 // third party application hooks system functions without correctly
26 // restoring the error code, it is possible that the error code will be
27 // overwritten during delay load resolution. The result of the first
28 // call may be incorrect, so make sure the function is bound and future
29 // results will be correct.
30 WSAGetLastError();
31 }
[email protected]14d5cfb2008-10-06 10:41:3532 }
33
34 ~WinsockInitSingleton() {
35 if (did_init_)
36 WSACleanup();
37 }
38
39 private:
40 bool did_init_;
41};
42
43} // namespace
44
[email protected]8ac1a752008-07-31 19:40:3745namespace net {
46
initial.commit586acc5fe2008-07-26 22:42:5247void EnsureWinsockInit() {
[email protected]14d5cfb2008-10-06 10:41:3548 Singleton<WinsockInitSingleton>::get();
initial.commit586acc5fe2008-07-26 22:42:5249}
[email protected]8ac1a752008-07-31 19:40:3750
51} // namespace net