diff options
| author | Ron Yorston <rmy@pobox.com> | 2020-06-01 08:46:17 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2020-06-01 08:46:17 +0100 |
| commit | 5ea460a32a9882906c7ee3656b8fb0dcdbce2abc (patch) | |
| tree | 3b6598f7f908ade15b3f61a815563e2c43502ac1 | |
| parent | 8fdbb0564ddaf0361dff8a194a0329f86738343c (diff) | |
| download | busybox-w32-5ea460a32a9882906c7ee3656b8fb0dcdbce2abc.tar.gz busybox-w32-5ea460a32a9882906c7ee3656b8fb0dcdbce2abc.tar.bz2 busybox-w32-5ea460a32a9882906c7ee3656b8fb0dcdbce2abc.zip | |
win32: only initialise networking if necessary
A call to initialise networking is made during start up even if
the applet doesn't need it. Instead, only initialise networking
when a call is made to a function that definitely requires it.
| -rw-r--r-- | include/mingw.h | 8 | ||||
| -rw-r--r-- | libbb/appletlib.c | 4 | ||||
| -rw-r--r-- | win32/net.c | 41 |
3 files changed, 43 insertions, 10 deletions
diff --git a/include/mingw.h b/include/mingw.h index 26f0688d7..fa8f705b0 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
| @@ -229,6 +229,10 @@ int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz); | |||
| 229 | int mingw_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, | 229 | int mingw_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, |
| 230 | struct timeval *timeout); | 230 | struct timeval *timeout); |
| 231 | int mingw_getpeername(int fd, struct sockaddr *sa, socklen_t *sz); | 231 | int mingw_getpeername(int fd, struct sockaddr *sa, socklen_t *sz); |
| 232 | int mingw_gethostname(char *host, int namelen); | ||
| 233 | int mingw_getaddrinfo(const char *node, const char *service, | ||
| 234 | const struct addrinfo *hints, struct addrinfo **res); | ||
| 235 | struct hostent *mingw_gethostbyaddr(const void *addr, socklen_t len, int type); | ||
| 232 | 236 | ||
| 233 | NOIMPL(mingw_sendto,SOCKET s UNUSED_PARAM, const char *buf UNUSED_PARAM, int len UNUSED_PARAM, int flags UNUSED_PARAM, const struct sockaddr *sa UNUSED_PARAM, int salen UNUSED_PARAM); | 237 | NOIMPL(mingw_sendto,SOCKET s UNUSED_PARAM, const char *buf UNUSED_PARAM, int len UNUSED_PARAM, int flags UNUSED_PARAM, const struct sockaddr *sa UNUSED_PARAM, int salen UNUSED_PARAM); |
| 234 | 238 | ||
| @@ -242,6 +246,9 @@ NOIMPL(mingw_sendto,SOCKET s UNUSED_PARAM, const char *buf UNUSED_PARAM, int len | |||
| 242 | #define accept mingw_accept | 246 | #define accept mingw_accept |
| 243 | #define select mingw_select | 247 | #define select mingw_select |
| 244 | #define getpeername mingw_getpeername | 248 | #define getpeername mingw_getpeername |
| 249 | #define gethostname mingw_gethostname | ||
| 250 | #define getaddrinfo mingw_getaddrinfo | ||
| 251 | #define gethostbyaddr mingw_gethostbyaddr | ||
| 245 | 252 | ||
| 246 | /* | 253 | /* |
| 247 | * sys/time.h | 254 | * sys/time.h |
| @@ -502,7 +509,6 @@ void qsort_string_vector_case(char **sv, unsigned count) FAST_FUNC; | |||
| 502 | */ | 509 | */ |
| 503 | 510 | ||
| 504 | const char *get_busybox_exec_path(void); | 511 | const char *get_busybox_exec_path(void); |
| 505 | void init_winsock(void); | ||
| 506 | void init_codepage(void); | 512 | void init_codepage(void); |
| 507 | 513 | ||
| 508 | int has_bat_suffix(const char *p); | 514 | int has_bat_suffix(const char *p); |
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index 6e1947228..b2c85905c 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
| @@ -327,10 +327,6 @@ void lbb_prepare(const char *applet | |||
| 327 | if (ENABLE_LOCALE_SUPPORT) | 327 | if (ENABLE_LOCALE_SUPPORT) |
| 328 | setlocale(LC_ALL, ""); | 328 | setlocale(LC_ALL, ""); |
| 329 | 329 | ||
| 330 | #if ENABLE_PLATFORM_MINGW32 | ||
| 331 | init_winsock(); | ||
| 332 | #endif | ||
| 333 | |||
| 334 | #if ENABLE_FEATURE_INDIVIDUAL | 330 | #if ENABLE_FEATURE_INDIVIDUAL |
| 335 | /* Redundant for busybox (run_applet_and_exit covers that case) | 331 | /* Redundant for busybox (run_applet_and_exit covers that case) |
| 336 | * but needed for "individual applet" mode */ | 332 | * but needed for "individual applet" mode */ |
diff --git a/win32/net.c b/win32/net.c index 01fa16a4e..880b807b7 100644 --- a/win32/net.c +++ b/win32/net.c | |||
| @@ -10,19 +10,50 @@ int inet_aton(const char *cp, struct in_addr *inp) | |||
| 10 | return 1; | 10 | return 1; |
| 11 | } | 11 | } |
| 12 | 12 | ||
| 13 | void init_winsock(void) | 13 | static void init_winsock(void) |
| 14 | { | 14 | { |
| 15 | WSADATA wsa; | 15 | WSADATA wsa; |
| 16 | static int initialized = 0; | ||
| 17 | |||
| 18 | if (initialized) | ||
| 19 | return; | ||
| 20 | |||
| 16 | if (WSAStartup(MAKEWORD(2,2), &wsa)) | 21 | if (WSAStartup(MAKEWORD(2,2), &wsa)) |
| 17 | bb_error_msg_and_die("unable to initialize winsock subsystem, error %d", | 22 | bb_error_msg_and_die("WSAStartup failed, error %d", WSAGetLastError()); |
| 18 | WSAGetLastError()); | 23 | |
| 19 | atexit((void(*)(void)) WSACleanup); /* may conflict with other atexit? */ | 24 | atexit((void(*)(void)) WSACleanup); |
| 25 | initialized = 1; | ||
| 26 | } | ||
| 27 | |||
| 28 | #undef gethostname | ||
| 29 | int mingw_gethostname(char *name, int namelen) | ||
| 30 | { | ||
| 31 | init_winsock(); | ||
| 32 | return gethostname(name, namelen); | ||
| 33 | } | ||
| 34 | |||
| 35 | #undef gethostbyaddr | ||
| 36 | struct hostent *mingw_gethostbyaddr(const void *addr, socklen_t len, int type) | ||
| 37 | { | ||
| 38 | init_winsock(); | ||
| 39 | return gethostbyaddr(addr, len, type); | ||
| 40 | } | ||
| 41 | |||
| 42 | #undef getaddrinfo | ||
| 43 | int mingw_getaddrinfo(const char *node, const char *service, | ||
| 44 | const struct addrinfo *hints, struct addrinfo **res) | ||
| 45 | { | ||
| 46 | init_winsock(); | ||
| 47 | return getaddrinfo(node, service, hints, res); | ||
| 20 | } | 48 | } |
| 21 | 49 | ||
| 22 | int mingw_socket(int domain, int type, int protocol) | 50 | int mingw_socket(int domain, int type, int protocol) |
| 23 | { | 51 | { |
| 24 | int sockfd; | 52 | int sockfd; |
| 25 | SOCKET s = WSASocket(domain, type, protocol, NULL, 0, 0); | 53 | SOCKET s; |
| 54 | |||
| 55 | init_winsock(); | ||
| 56 | s = WSASocket(domain, type, protocol, NULL, 0, 0); | ||
| 26 | if (s == INVALID_SOCKET) { | 57 | if (s == INVALID_SOCKET) { |
| 27 | /* | 58 | /* |
| 28 | * WSAGetLastError() values are regular BSD error codes | 59 | * WSAGetLastError() values are regular BSD error codes |
