Under Windows, call WSAStartup before using the network

This commit is contained in:
Steven Murdoch 2011-07-21 14:14:57 +01:00
parent 8db98c13b5
commit 2002d4acdf

View File

@ -13,6 +13,7 @@
* later date. * later date.
*/ */
#include "orconfig.h"
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
@ -20,7 +21,10 @@
#include <time.h> #include <time.h>
#include <string.h> #include <string.h>
#include "orconfig.h" #ifdef MS_WINDOWS
#include <winsock2.h>
#endif
#include "tor-fw-helper.h" #include "tor-fw-helper.h"
#ifdef NAT_PMP #ifdef NAT_PMP
#include "tor-fw-helper-natpmp.h" #include "tor-fw-helper-natpmp.h"
@ -219,6 +223,29 @@ tor_fw_add_dir_port(tor_fw_options_t *tor_fw_options,
} }
} }
/** Called before we make any calls to network-related functions.
* (Some operating systems require their network libraries to be
* initialized.) (from common/compat.c) */
static int
network_init(void)
{
#ifdef MS_WINDOWS
/* This silly exercise is necessary before windows will allow
* gethostbyname to work. */
WSADATA WSAData;
int r;
r = WSAStartup(0x101, &WSAData);
if (r) {
fprintf(stderr, "E: Error initializing Windows network layer - code was %d", r);
return -1;
}
/* WSAData.iMaxSockets might show the max sockets we're allowed to use.
* We might use it to complain if we're trying to be a server but have
* too few sockets available. */
#endif
return 0;
}
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
@ -329,6 +356,10 @@ main(int argc, char **argv)
tor_fw_options.public_dir_port); tor_fw_options.public_dir_port);
} }
// Initialize networking
if (network_init())
exit(1);
// Initalize the various fw-helper backend helpers // Initalize the various fw-helper backend helpers
r = init_backends(&tor_fw_options, &backend_state); r = init_backends(&tor_fw_options, &backend_state);
if (r) if (r)