1 #ifndef _WINSOCK_DEPRECATED_NO_WARNINGS
2 #define _WINSOCK_DEPRECATED_NO_WARNINGS
4 #include "private-lib-core.h"
8 lws_send_pipe_choked(struct lws *wsi)
11 #if defined(LWS_WITH_HTTP2)
12 wsi_eff = lws_get_network_wsi(wsi);
16 /* the fact we checked implies we avoided back-to-back writes */
17 wsi_eff->could_have_pending = 0;
19 /* treat the fact we got a truncated send pending as if we're choked */
20 if (lws_has_buffered_out(wsi_eff)
21 #if defined(LWS_WITH_HTTP_STREAM_COMPRESSION)
22 ||wsi->http.comp_ctx.buflist_comp ||
23 wsi->http.comp_ctx.may_have_more
28 return (int)wsi_eff->sock_send_blocking;
32 lws_poll_listen_fd(struct lws_pollfd *fd)
35 struct timeval tv = { 0, 0 };
37 assert((fd->events & LWS_POLLIN) == LWS_POLLIN);
40 FD_SET(fd->fd, &readfds);
42 return select(((int)fd->fd) + 1, &readfds, NULL, NULL, &tv);
46 lws_plat_set_nonblocking(int fd)
50 return !!ioctlsocket(fd, FIONBIO, &optl);
54 lws_plat_set_socket_options(struct lws_vhost *vhost, lws_sockfd_type fd,
58 int optlen = sizeof(optval);
60 struct tcp_keepalive alive;
63 struct protoent *tcp_proto;
67 /* enable keepalive on this socket */
69 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
70 (const char *)&optval, optlen) < 0)
74 alive.keepalivetime = vhost->ka_time * 1000;
75 alive.keepaliveinterval = vhost->ka_interval * 1000;
77 if (WSAIoctl(fd, SIO_KEEPALIVE_VALS, &alive, sizeof(alive),
78 NULL, 0, &dwBytesRet, NULL, NULL))
85 tcp_proto = getprotobyname("TCP");
87 lwsl_err("getprotobyname() failed with error %d\n", LWS_ERRNO);
90 protonbr = tcp_proto->p_proto;
95 setsockopt(fd, protonbr, TCP_NODELAY, (const char *)&optval, optlen);
97 return lws_plat_set_nonblocking(fd);
102 lws_interface_to_sa(int ipv6,
103 const char *ifname, struct sockaddr_in *addr, size_t addrlen)
106 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
109 if (lws_plat_inet_pton(AF_INET6, ifname, &addr6->sin6_addr) == 1) {
110 return LWS_ITOSA_USABLE;
115 long long address = inet_addr(ifname);
117 if (address == INADDR_NONE) {
118 struct hostent *entry = gethostbyname(ifname);
120 address = ((struct in_addr *)entry->h_addr_list[0])->s_addr;
123 if (address == INADDR_NONE)
124 return LWS_ITOSA_NOT_EXIST;
126 addr->sin_addr.s_addr = (unsigned long)(lws_intptr_t)address;
128 return LWS_ITOSA_USABLE;
132 lws_plat_insert_socket_into_fds(struct lws_context *context, struct lws *wsi)
134 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
135 int n = LWS_POLLIN | LWS_POLLHUP | FD_CONNECT;
138 lwsl_info("%s: UDP\n", __func__);
142 pt->fds[pt->fds_count++].revents = 0;
143 WSAEventSelect(wsi->desc.sockfd, pt->events, n);
147 lws_plat_delete_socket_from_fds(struct lws_context *context,
148 struct lws *wsi, int m)
150 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
157 lws_plat_check_connection_error(struct lws *wsi)
160 int optLen = sizeof(int);
162 if (getsockopt(wsi->desc.sockfd, SOL_SOCKET, SO_ERROR,
163 (char*)&optVal, &optLen) != SOCKET_ERROR && optVal &&
164 optVal != LWS_EALREADY && optVal != LWS_EINPROGRESS &&
165 optVal != LWS_EWOULDBLOCK && optVal != WSAEINVAL) {
166 lwsl_debug("Connect failed SO_ERROR=%d\n", optVal);
174 lws_plat_change_pollfd(struct lws_context *context,
175 struct lws *wsi, struct lws_pollfd *pfd)
177 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
178 long e = LWS_POLLHUP | FD_CONNECT;
180 if ((pfd->events & LWS_POLLIN))
183 if ((pfd->events & LWS_POLLOUT))
186 if (WSAEventSelect(wsi->desc.sockfd, pt->events, e) != SOCKET_ERROR)
189 lwsl_err("WSAEventSelect() failed with error %d\n", LWS_ERRNO);
195 lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt)
198 DWORD bufferlen = cnt;
201 buffer = lws_malloc(bufferlen * 2, "inet_ntop");
203 lwsl_err("Out of memory\n");
208 struct sockaddr_in srcaddr;
209 memset(&srcaddr, 0, sizeof(srcaddr));
210 srcaddr.sin_family = AF_INET;
211 memcpy(&(srcaddr.sin_addr), src, sizeof(srcaddr.sin_addr));
213 if (!WSAAddressToStringW((struct sockaddr*)&srcaddr, sizeof(srcaddr), 0, buffer, &bufferlen))
216 } else if (af == AF_INET6) {
217 struct sockaddr_in6 srcaddr;
218 memset(&srcaddr, 0, sizeof(srcaddr));
219 srcaddr.sin6_family = AF_INET6;
220 memcpy(&(srcaddr.sin6_addr), src, sizeof(srcaddr.sin6_addr));
222 if (!WSAAddressToStringW((struct sockaddr*)&srcaddr, sizeof(srcaddr), 0, buffer, &bufferlen))
226 lwsl_err("Unsupported type\n");
229 int rv = WSAGetLastError();
230 lwsl_err("WSAAddressToString() : %d\n", rv);
232 if (WideCharToMultiByte(CP_ACP, 0, buffer, bufferlen, dst, cnt, 0, NULL) <= 0)
237 return ok ? dst : NULL;
241 lws_plat_inet_pton(int af, const char *src, void *dst)
244 DWORD bufferlen = (int)strlen(src) + 1;
247 buffer = lws_malloc(bufferlen * 2, "inet_pton");
249 lwsl_err("Out of memory\n");
253 if (MultiByteToWideChar(CP_ACP, 0, src, bufferlen, buffer, bufferlen) <= 0) {
254 lwsl_err("Failed to convert multi byte to wide char\n");
260 struct sockaddr_in dstaddr;
261 int dstaddrlen = sizeof(dstaddr);
263 memset(&dstaddr, 0, sizeof(dstaddr));
264 dstaddr.sin_family = AF_INET;
266 if (!WSAStringToAddressW(buffer, af, 0, (struct sockaddr *) &dstaddr, &dstaddrlen)) {
268 memcpy(dst, &dstaddr.sin_addr, sizeof(dstaddr.sin_addr));
271 } else if (af == AF_INET6) {
272 struct sockaddr_in6 dstaddr;
273 int dstaddrlen = sizeof(dstaddr);
275 memset(&dstaddr, 0, sizeof(dstaddr));
276 dstaddr.sin6_family = AF_INET6;
278 if (!WSAStringToAddressW(buffer, af, 0, (struct sockaddr *) &dstaddr, &dstaddrlen)) {
280 memcpy(dst, &dstaddr.sin6_addr, sizeof(dstaddr.sin6_addr));
284 lwsl_err("Unsupported type\n");
287 int rv = WSAGetLastError();
288 lwsl_err("WSAAddressToString() : %d\n", rv);