diff options
author | Ron Yorston <rmy@pobox.com> | 2015-04-22 21:20:40 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2015-04-22 21:20:40 +0100 |
commit | 683b593c838db1fc2c2e303bb3811a4503e98a9b (patch) | |
tree | 61ac8cc87c3fd6c9c3faa1a0970986fa5429a443 | |
parent | f40a7116939fce9574c8095a83026a0d68a20a27 (diff) | |
download | busybox-w32-683b593c838db1fc2c2e303bb3811a4503e98a9b.tar.gz busybox-w32-683b593c838db1fc2c2e303bb3811a4503e98a9b.tar.bz2 busybox-w32-683b593c838db1fc2c2e303bb3811a4503e98a9b.zip |
mingw: additional networking support
-rw-r--r-- | include/mingw.h | 15 | ||||
-rw-r--r-- | win32/net.c | 47 |
2 files changed, 60 insertions, 2 deletions
diff --git a/include/mingw.h b/include/mingw.h index 247aae587..86259f2d1 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -217,18 +217,29 @@ int ioctl(int fd, int code, ...); | |||
217 | */ | 217 | */ |
218 | #define hstrerror strerror | 218 | #define hstrerror strerror |
219 | 219 | ||
220 | #define SHUT_WR SD_SEND | ||
221 | |||
220 | int mingw_socket(int domain, int type, int protocol); | 222 | int mingw_socket(int domain, int type, int protocol); |
221 | int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); | 223 | int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); |
224 | int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz); | ||
225 | int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen); | ||
226 | int mingw_shutdown(int sockfd, int how); | ||
227 | int mingw_listen(int sockfd, int backlog); | ||
228 | 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, | ||
230 | struct timeval *timeout); | ||
222 | 231 | ||
223 | 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); | 232 | 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); |
224 | NOIMPL(mingw_listen,SOCKET s UNUSED_PARAM,int backlog UNUSED_PARAM); | ||
225 | NOIMPL(mingw_bind,SOCKET s UNUSED_PARAM,const struct sockaddr* sa UNUSED_PARAM,int salen UNUSED_PARAM); | ||
226 | 233 | ||
227 | #define socket mingw_socket | 234 | #define socket mingw_socket |
228 | #define connect mingw_connect | 235 | #define connect mingw_connect |
229 | #define sendto mingw_sendto | 236 | #define sendto mingw_sendto |
230 | #define listen mingw_listen | 237 | #define listen mingw_listen |
231 | #define bind mingw_bind | 238 | #define bind mingw_bind |
239 | #define setsockopt mingw_setsockopt | ||
240 | #define shutdown mingw_shutdown | ||
241 | #define accept mingw_accept | ||
242 | #define select mingw_select | ||
232 | 243 | ||
233 | /* | 244 | /* |
234 | * sys/stat.h | 245 | * sys/stat.h |
diff --git a/win32/net.c b/win32/net.c index eadda6b69..a44d91abb 100644 --- a/win32/net.c +++ b/win32/net.c | |||
@@ -52,3 +52,50 @@ int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz) | |||
52 | SOCKET s = (SOCKET)_get_osfhandle(sockfd); | 52 | SOCKET s = (SOCKET)_get_osfhandle(sockfd); |
53 | return connect(s, sa, sz); | 53 | return connect(s, sa, sz); |
54 | } | 54 | } |
55 | |||
56 | #undef bind | ||
57 | int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz) | ||
58 | { | ||
59 | SOCKET s = (SOCKET)_get_osfhandle(sockfd); | ||
60 | return bind(s, sa, sz); | ||
61 | } | ||
62 | |||
63 | #undef setsockopt | ||
64 | int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen) | ||
65 | { | ||
66 | SOCKET s = (SOCKET)_get_osfhandle(sockfd); | ||
67 | return setsockopt(s, lvl, optname, (const char*)optval, optlen); | ||
68 | } | ||
69 | |||
70 | #undef shutdown | ||
71 | int mingw_shutdown(int sockfd, int how) | ||
72 | { | ||
73 | SOCKET s = (SOCKET)_get_osfhandle(sockfd); | ||
74 | return shutdown(s, how); | ||
75 | } | ||
76 | |||
77 | #undef listen | ||
78 | int mingw_listen(int sockfd, int backlog) | ||
79 | { | ||
80 | SOCKET s = (SOCKET)_get_osfhandle(sockfd); | ||
81 | return listen(s, backlog); | ||
82 | } | ||
83 | |||
84 | #undef accept | ||
85 | int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz) | ||
86 | { | ||
87 | int sockfd2; | ||
88 | |||
89 | SOCKET s1 = (SOCKET)_get_osfhandle(sockfd1); | ||
90 | SOCKET s2 = accept(s1, sa, sz); | ||
91 | |||
92 | /* convert into a file descriptor */ | ||
93 | if ((sockfd2 = _open_osfhandle(s2, O_RDWR|O_BINARY)) < 0) { | ||
94 | int err = errno; | ||
95 | closesocket(s2); | ||
96 | bb_error_msg("unable to make a socket file descriptor: %s", | ||
97 | strerror(err)); | ||
98 | return -1; | ||
99 | } | ||
100 | return sockfd2; | ||
101 | } | ||