From 683b593c838db1fc2c2e303bb3811a4503e98a9b Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Wed, 22 Apr 2015 21:20:40 +0100 Subject: mingw: additional networking support --- include/mingw.h | 15 +++++++++++++-- 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, ...); */ #define hstrerror strerror +#define SHUT_WR SD_SEND + int mingw_socket(int domain, int type, int protocol); int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); +int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz); +int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen); +int mingw_shutdown(int sockfd, int how); +int mingw_listen(int sockfd, int backlog); +int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz); +int mingw_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds, + struct timeval *timeout); 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); -NOIMPL(mingw_listen,SOCKET s UNUSED_PARAM,int backlog UNUSED_PARAM); -NOIMPL(mingw_bind,SOCKET s UNUSED_PARAM,const struct sockaddr* sa UNUSED_PARAM,int salen UNUSED_PARAM); #define socket mingw_socket #define connect mingw_connect #define sendto mingw_sendto #define listen mingw_listen #define bind mingw_bind +#define setsockopt mingw_setsockopt +#define shutdown mingw_shutdown +#define accept mingw_accept +#define select mingw_select /* * 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) SOCKET s = (SOCKET)_get_osfhandle(sockfd); return connect(s, sa, sz); } + +#undef bind +int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz) +{ + SOCKET s = (SOCKET)_get_osfhandle(sockfd); + return bind(s, sa, sz); +} + +#undef setsockopt +int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen) +{ + SOCKET s = (SOCKET)_get_osfhandle(sockfd); + return setsockopt(s, lvl, optname, (const char*)optval, optlen); +} + +#undef shutdown +int mingw_shutdown(int sockfd, int how) +{ + SOCKET s = (SOCKET)_get_osfhandle(sockfd); + return shutdown(s, how); +} + +#undef listen +int mingw_listen(int sockfd, int backlog) +{ + SOCKET s = (SOCKET)_get_osfhandle(sockfd); + return listen(s, backlog); +} + +#undef accept +int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz) +{ + int sockfd2; + + SOCKET s1 = (SOCKET)_get_osfhandle(sockfd1); + SOCKET s2 = accept(s1, sa, sz); + + /* convert into a file descriptor */ + if ((sockfd2 = _open_osfhandle(s2, O_RDWR|O_BINARY)) < 0) { + int err = errno; + closesocket(s2); + bb_error_msg("unable to make a socket file descriptor: %s", + strerror(err)); + return -1; + } + return sockfd2; +} -- cgit v1.2.3-55-g6feb