Lines Matching +full:curl +full:- +full:for +full:- +full:win
12 * are also available at https://curl.se/docs/copyright.html.
21 * SPDX-License-Identifier: curl
31 #include <sys/un.h> /* for sockaddr_un */
60 /* Required for __DragonFly_version */
70 #include "cf-socket.h"
73 #include "url.h" /* for Curl_safefree() */
75 #include "sockaddr.h" /* required for Curl_sockaddr_storage */
94 /* It makes support for IPv4-mapped IPv6 addresses.
151 /* Win 10, v 1709 (10.0.16299) and later can use SetSockOpt TCP_KEEP____
180 int optval = data->set.tcp_keepalive ? 1 : 0; in tcpkeepalive()
193 optval = curlx_sltosi(data->set.tcp_keepidle); in tcpkeepalive()
201 optval = curlx_sltosi(data->set.tcp_keepintvl); in tcpkeepalive()
209 optval = curlx_sltosi(data->set.tcp_keepcnt); in tcpkeepalive()
220 optval = curlx_sltosi(data->set.tcp_keepidle); in tcpkeepalive()
223 optval = curlx_sltosi(data->set.tcp_keepintvl); in tcpkeepalive()
234 optval = curlx_sltosi(data->set.tcp_keepidle); in tcpkeepalive()
244 optval = curlx_sltosi(data->set.tcp_keepidle); in tcpkeepalive()
254 optval = curlx_sltosi(data->set.tcp_keepidle); in tcpkeepalive()
264 optval = curlx_sltosi(data->set.tcp_keepintvl); in tcpkeepalive()
278 * default config for Solaris <11.4 because there is in tcpkeepalive()
279 * no default value for TCP_KEEPCNT on Solaris 11.4. in tcpkeepalive()
284 optval = curlx_sltosi(data->set.tcp_keepcnt) * in tcpkeepalive()
285 curlx_sltosi(data->set.tcp_keepintvl); in tcpkeepalive()
294 optval = curlx_sltosi(data->set.tcp_keepcnt); in tcpkeepalive()
316 * any protocol-specific address structures. The variable declared here in Curl_sock_assign_addr()
320 dest->family = ai->ai_family; in Curl_sock_assign_addr()
323 dest->socktype = SOCK_STREAM; in Curl_sock_assign_addr()
324 dest->protocol = IPPROTO_TCP; in Curl_sock_assign_addr()
327 dest->socktype = SOCK_STREAM; in Curl_sock_assign_addr()
328 dest->protocol = IPPROTO_IP; in Curl_sock_assign_addr()
331 dest->socktype = SOCK_DGRAM; in Curl_sock_assign_addr()
332 dest->protocol = IPPROTO_UDP; in Curl_sock_assign_addr()
335 dest->addrlen = (unsigned int)ai->ai_addrlen; in Curl_sock_assign_addr()
337 if(dest->addrlen > sizeof(struct Curl_sockaddr_storage)) { in Curl_sock_assign_addr()
342 memcpy(&dest->curl_sa_addr, ai->ai_addr, dest->addrlen); in Curl_sock_assign_addr()
351 DEBUGASSERT(data->conn); in socket_open()
352 if(data->set.fopensocket) { in socket_open()
357 * CURL_SOCKET_BAD; otherwise it will return a not-connected socket. When in socket_open()
363 *sockfd = data->set.fopensocket(data->set.opensocket_client, in socket_open()
370 *sockfd = socket(addr->family, addr->socktype, addr->protocol); in socket_open()
378 if(data->conn->scope_id && (addr->family == AF_INET6)) { in socket_open()
379 struct sockaddr_in6 * const sa6 = (void *)&addr->curl_sa_addr; in socket_open()
380 sa6->sin6_scope_id = data->conn->scope_id; in socket_open()
421 if(use_callback && conn && conn->fclosesocket) { in socket_close()
425 rc = conn->fclosesocket(conn->closesocket_client, sock); in socket_close()
431 /* tell the multi-socket code about this */ in socket_close()
456 Work-around: Make the Socket Send Buffer Size Larger Than the Program Send
459 The problem described in this knowledge-base is applied only to pre-Vista
461 SO_SNDBUF adjustment for Windows Vista and above.
500 * <iface_or_host> - can be either an interface name or a host.
501 * if!<iface> - interface name.
502 * host!<host> - hostname.
503 * ifhost!<iface>!<host> - interface name and hostname.
507 * input [in] - input string.
508 * len [in] - length of the input string.
509 * dev [in/out] - address where a pointer to newly allocated memory
510 * holding the interface-or-host will be stored upon
512 * iface [in/out] - address where a pointer to newly allocated memory
514 * host [in/out] - address where a pointer to newly allocated memory
539 *iface = Curl_memdup0(input, len - strlen(if_prefix)); in Curl_parse_interface()
546 *host = Curl_memdup0(input, len - strlen(host_prefix)); in Curl_parse_interface()
552 len -= strlen(if_host_prefix); in Curl_parse_interface()
556 *iface = Curl_memdup0(input, host_part - input); in Curl_parse_interface()
560 *host = Curl_memdup0(host_part, len - (host_part - input)); in Curl_parse_interface()
588 unsigned short port = data->set.localport; /* use this port number, 0 for in bindlocal()
591 int portnum = data->set.localportrange; in bindlocal()
592 const char *dev = data->set.str[STRING_DEVICE]; in bindlocal()
593 const char *iface_input = data->set.str[STRING_INTERFACE]; in bindlocal()
594 const char *host_input = data->set.str[STRING_BINDHOST]; in bindlocal()
618 int done = 0; /* -1 for error, 1 for address found */ in bindlocal()
629 * The interface might be a VRF, eg: vrf-blue, which means it cannot be in bindlocal()
651 scope, conn->scope_id, in bindlocal()
660 data->state.os_errno = error = SOCKERRNO; in bindlocal()
688 unsigned char ipver = conn->ip_version; in bindlocal()
692 conn->ip_version = CURL_IPRESOLVE_V4; in bindlocal()
695 conn->ip_version = CURL_IPRESOLVE_V6; in bindlocal()
701 conn->ip_version = ipver; in bindlocal()
704 int h_af = h->addr->ai_family; in bindlocal()
706 Curl_printable_address(h->addr, myhost, sizeof(myhost)); in bindlocal()
722 done = -1; in bindlocal()
735 if(Curl_inet_pton(AF_INET6, myhost, &si6->sin6_addr) > 0) { in bindlocal()
736 si6->sin6_family = AF_INET6; in bindlocal()
737 si6->sin6_port = htons(port); in bindlocal()
748 si6->sin6_scope_id = (unsigned int)scope_id; in bindlocal()
758 (Curl_inet_pton(AF_INET, myhost, &si4->sin_addr) > 0)) { in bindlocal()
759 si4->sin_family = AF_INET; in bindlocal()
760 si4->sin_port = htons(port); in bindlocal()
770 data->state.errorbuf = FALSE; in bindlocal()
771 data->state.os_errno = error = SOCKERRNO; in bindlocal()
781 si6->sin6_family = AF_INET6; in bindlocal()
782 si6->sin6_port = htons(port); in bindlocal()
788 si4->sin_family = AF_INET; in bindlocal()
789 si4->sin_port = htons(port); in bindlocal()
796 for(;;) { in bindlocal()
800 conn->bits.bound = TRUE; in bindlocal()
804 if(--portnum > 0) { in bindlocal()
808 infof(data, "Bind to local port %d failed, trying next", port - 1); in bindlocal()
810 if(sock->sa_family == AF_INET) in bindlocal()
811 si4->sin_port = ntohs(port); in bindlocal()
814 si6->sin6_port = ntohs(port); in bindlocal()
822 data->state.os_errno = error = SOCKERRNO; in bindlocal()
844 * problems with it using all CPU in multi-threaded cases. in verifyconnect()
853 * mutex/critical-section the ntdll call is waiting on. in verifyconnect()
855 * Someone got to verify this on Win-NT 4.0, 2000." in verifyconnect()
899 * Determine the curl code for a socket connect() == -1 with errno.
925 infof(data, "Immediate connect fail for %s: %s", in socket_connect_result()
929 data->state.os_errno = error; in socket_connect_result()
938 * full record and then make a subsequent read for that.
977 ctx->sock = CURL_SOCKET_BAD; in cf_socket_ctx_init()
978 ctx->transport = transport; in cf_socket_ctx_init()
980 result = Curl_sock_assign_addr(&ctx->addr, ai, transport); in cf_socket_ctx_init()
990 ctx->wblock_percent = (int)l; in cf_socket_ctx_init()
996 ctx->wpartial_percent = (int)l; in cf_socket_ctx_init()
1002 ctx->rblock_percent = (int)l; in cf_socket_ctx_init()
1008 ctx->recv_max = (size_t)l; in cf_socket_ctx_init()
1018 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_close()
1020 if(ctx && CURL_SOCKET_BAD != ctx->sock) { in cf_socket_close()
1021 CURL_TRC_CF(data, cf, "cf_socket_close(%" FMT_SOCKET_T ")", ctx->sock); in cf_socket_close()
1022 if(ctx->sock == cf->conn->sock[cf->sockindex]) in cf_socket_close()
1023 cf->conn->sock[cf->sockindex] = CURL_SOCKET_BAD; in cf_socket_close()
1024 socket_close(data, cf->conn, !ctx->accepted, ctx->sock); in cf_socket_close()
1025 ctx->sock = CURL_SOCKET_BAD; in cf_socket_close()
1026 if(ctx->active && cf->sockindex == FIRSTSOCKET) in cf_socket_close()
1027 cf->conn->remote_addr = NULL; in cf_socket_close()
1028 ctx->active = FALSE; in cf_socket_close()
1029 memset(&ctx->started_at, 0, sizeof(ctx->started_at)); in cf_socket_close()
1030 memset(&ctx->connected_at, 0, sizeof(ctx->connected_at)); in cf_socket_close()
1033 cf->connected = FALSE; in cf_socket_close()
1040 if(cf->connected) { in cf_socket_shutdown()
1041 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_shutdown()
1043 CURL_TRC_CF(data, cf, "cf_socket_shutdown(%" FMT_SOCKET_T ")", ctx->sock); in cf_socket_shutdown()
1044 /* On TCP, and when the socket looks well and non-blocking mode in cf_socket_shutdown()
1047 if(ctx->sock != CURL_SOCKET_BAD && in cf_socket_shutdown()
1048 ctx->transport == TRNSPRT_TCP && in cf_socket_shutdown()
1049 (curlx_nonblock(ctx->sock, TRUE) >= 0)) { in cf_socket_shutdown()
1051 (void)sread(ctx->sock, buf, sizeof(buf)); in cf_socket_shutdown()
1060 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_destroy()
1065 cf->ctx = NULL; in cf_socket_destroy()
1071 struct cf_socket_ctx *ctx = cf->ctx; in set_local_ip()
1074 if((ctx->sock != CURL_SOCKET_BAD) && in set_local_ip()
1075 !(data->conn->handler->protocol & CURLPROTO_TFTP)) { in set_local_ip()
1083 if(getsockname(ctx->sock, (struct sockaddr*) &ssloc, &slen)) { in set_local_ip()
1090 ctx->ip.local_ip, &ctx->ip.local_port)) { in set_local_ip()
1098 ctx->ip.local_ip[0] = 0; in set_local_ip()
1099 ctx->ip.local_port = -1; in set_local_ip()
1107 struct cf_socket_ctx *ctx = cf->ctx; in set_remote_ip()
1110 if(!Curl_addr2string(&ctx->addr.curl_sa_addr, in set_remote_ip()
1111 (curl_socklen_t)ctx->addr.addrlen, in set_remote_ip()
1112 ctx->ip.remote_ip, &ctx->ip.remote_port)) { in set_remote_ip()
1115 ctx->error = errno; in set_remote_ip()
1127 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_open()
1134 DEBUGASSERT(ctx->sock == CURL_SOCKET_BAD); in cf_socket_open()
1135 ctx->started_at = Curl_now(); in cf_socket_open()
1141 if(!data->set.fopensocket) in cf_socket_open()
1142 ctx->addr.socktype |= SOCK_NONBLOCK; in cf_socket_open()
1144 result = socket_open(data, &ctx->addr, &ctx->sock); in cf_socket_open()
1147 if(!data->set.fopensocket) in cf_socket_open()
1148 ctx->addr.socktype &= ~SOCK_NONBLOCK; in cf_socket_open()
1158 if(ctx->addr.family == AF_INET6) { in cf_socket_open()
1159 set_ipv6_v6only(ctx->sock, 0); in cf_socket_open()
1160 infof(data, " Trying [%s]:%d...", ctx->ip.remote_ip, ctx->ip.remote_port); in cf_socket_open()
1164 infof(data, " Trying %s:%d...", ctx->ip.remote_ip, ctx->ip.remote_port); in cf_socket_open()
1167 is_tcp = (ctx->addr.family == AF_INET in cf_socket_open()
1168 || ctx->addr.family == AF_INET6) && in cf_socket_open()
1169 ctx->addr.socktype == SOCK_STREAM; in cf_socket_open()
1171 is_tcp = (ctx->addr.family == AF_INET) && in cf_socket_open()
1172 ctx->addr.socktype == SOCK_STREAM; in cf_socket_open()
1174 if(is_tcp && data->set.tcp_nodelay) in cf_socket_open()
1175 tcpnodelay(data, ctx->sock); in cf_socket_open()
1177 nosigpipe(data, ctx->sock); in cf_socket_open()
1179 Curl_sndbuf_init(ctx->sock); in cf_socket_open()
1181 if(is_tcp && data->set.tcp_keepalive) in cf_socket_open()
1182 tcpkeepalive(data, ctx->sock); in cf_socket_open()
1184 if(data->set.fsockopt) { in cf_socket_open()
1185 /* activate callback for setting socket options */ in cf_socket_open()
1187 error = data->set.fsockopt(data->set.sockopt_client, in cf_socket_open()
1188 ctx->sock, in cf_socket_open()
1202 if(ctx->addr.family == AF_INET in cf_socket_open()
1204 || ctx->addr.family == AF_INET6 in cf_socket_open()
1207 result = bindlocal(data, cf->conn, ctx->sock, ctx->addr.family, in cf_socket_open()
1208 Curl_ipv6_scope(&ctx->addr.curl_sa_addr)); in cf_socket_open()
1221 /* Set socket non-blocking, must be a non-blocking socket for in cf_socket_open()
1222 * a non-blocking connect. */ in cf_socket_open()
1223 error = curlx_nonblock(ctx->sock, TRUE); in cf_socket_open()
1226 ctx->error = SOCKERRNO; in cf_socket_open()
1230 if(data->set.fopensocket) { in cf_socket_open()
1231 /* Set socket non-blocking, must be a non-blocking socket for in cf_socket_open()
1232 * a non-blocking connect. */ in cf_socket_open()
1233 error = curlx_nonblock(ctx->sock, TRUE); in cf_socket_open()
1236 ctx->error = SOCKERRNO; in cf_socket_open()
1241 ctx->sock_connected = (ctx->addr.socktype != SOCK_DGRAM); in cf_socket_open()
1244 if(ctx->sock != CURL_SOCKET_BAD) { in cf_socket_open()
1245 socket_close(data, cf->conn, TRUE, ctx->sock); in cf_socket_open()
1246 ctx->sock = CURL_SOCKET_BAD; in cf_socket_open()
1251 ctx->connected_at = Curl_now(); in cf_socket_open()
1252 cf->connected = TRUE; in cf_socket_open()
1254 CURL_TRC_CF(data, cf, "cf_socket_open() -> %d, fd=%" FMT_SOCKET_T, in cf_socket_open()
1255 result, ctx->sock); in cf_socket_open()
1262 struct cf_socket_ctx *ctx = cf->ctx; in do_connect()
1266 int rc = -1; in do_connect()
1280 endpoints.sae_dstaddr = &ctx->addr.curl_sa_addr; in do_connect()
1281 endpoints.sae_dstaddrlen = ctx->addr.addrlen; in do_connect()
1283 rc = connectx(ctx->sock, &endpoints, SAE_ASSOCID_ANY, in do_connect()
1288 rc = connect(ctx->sock, &ctx->addr.curl_sa_addr, ctx->addr.addrlen); in do_connect()
1291 rc = connect(ctx->sock, &ctx->addr.curl_sa_addr, ctx->addr.addrlen); in do_connect()
1294 if(setsockopt(ctx->sock, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, in do_connect()
1297 ctx->sock); in do_connect()
1299 rc = connect(ctx->sock, &ctx->addr.curl_sa_addr, ctx->addr.addrlen); in do_connect()
1301 if(Curl_conn_is_ssl(cf->conn, cf->sockindex)) in do_connect()
1302 rc = connect(ctx->sock, &ctx->addr.curl_sa_addr, ctx->addr.addrlen); in do_connect()
1308 rc = connect(ctx->sock, &ctx->addr.curl_sa_addr, in do_connect()
1309 (curl_socklen_t)ctx->addr.addrlen); in do_connect()
1318 struct cf_socket_ctx *ctx = cf->ctx; in cf_tcp_connect()
1323 if(cf->connected) { in cf_tcp_connect()
1333 if(ctx->sock == CURL_SOCKET_BAD) { in cf_tcp_connect()
1340 if(cf->connected) { in cf_tcp_connect()
1346 rc = do_connect(cf, data, cf->conn->bits.tcp_fastopen); in cf_tcp_connect()
1350 ctx->ip.local_ip, ctx->ip.local_port); in cf_tcp_connect()
1351 if(-1 == rc) { in cf_tcp_connect()
1352 result = socket_connect_result(data, ctx->ip.remote_ip, error); in cf_tcp_connect()
1362 (void)verifyconnect(ctx->sock, NULL); in cf_tcp_connect()
1364 /* check socket for connect */ in cf_tcp_connect()
1365 rc = SOCKET_WRITABLE(ctx->sock, 0); in cf_tcp_connect()
1371 else if(rc == CURL_CSELECT_OUT || cf->conn->bits.tcp_fastopen) { in cf_tcp_connect()
1372 if(verifyconnect(ctx->sock, &ctx->error)) { in cf_tcp_connect()
1374 ctx->connected_at = Curl_now(); in cf_tcp_connect()
1377 cf->connected = TRUE; in cf_tcp_connect()
1383 (void)verifyconnect(ctx->sock, &ctx->error); in cf_tcp_connect()
1389 if(ctx->error) { in cf_tcp_connect()
1391 data->state.os_errno = ctx->error; in cf_tcp_connect()
1392 SET_SOCKERRNO(ctx->error); in cf_tcp_connect()
1397 ctx->ip.remote_ip, ctx->ip.remote_port, in cf_tcp_connect()
1398 ctx->ip.local_ip, ctx->ip.local_port, in cf_tcp_connect()
1399 Curl_strerror(ctx->error, buffer, sizeof(buffer))); in cf_tcp_connect()
1403 if(ctx->sock != CURL_SOCKET_BAD) { in cf_tcp_connect()
1404 socket_close(data, cf->conn, TRUE, ctx->sock); in cf_tcp_connect()
1405 ctx->sock = CURL_SOCKET_BAD; in cf_tcp_connect()
1418 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_get_host()
1420 *phost = cf->conn->host.name; in cf_socket_get_host()
1421 *pdisplay_host = cf->conn->host.dispname; in cf_socket_get_host()
1422 *pport = ctx->ip.remote_port; in cf_socket_get_host()
1429 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_adjust_pollset()
1431 if(ctx->sock != CURL_SOCKET_BAD) { in cf_socket_adjust_pollset()
1433 * for some weird FTP interaction. This should be rewritten, so that in cf_socket_adjust_pollset()
1436 if(ctx->listening) { in cf_socket_adjust_pollset()
1437 Curl_pollset_set_in_only(data, ps, ctx->sock); in cf_socket_adjust_pollset()
1439 FMT_SOCKET_T, ctx->sock); in cf_socket_adjust_pollset()
1441 else if(!cf->connected) { in cf_socket_adjust_pollset()
1442 Curl_pollset_set_out_only(data, ps, ctx->sock); in cf_socket_adjust_pollset()
1444 FMT_SOCKET_T, ctx->sock); in cf_socket_adjust_pollset()
1446 else if(!ctx->active) { in cf_socket_adjust_pollset()
1447 Curl_pollset_add_in(data, ps, ctx->sock); in cf_socket_adjust_pollset()
1449 FMT_SOCKET_T, ctx->sock); in cf_socket_adjust_pollset()
1457 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_data_pending()
1461 readable = SOCKET_READABLE(ctx->sock, 0); in cf_socket_data_pending()
1477 if(Curl_timediff(n, ctx->last_sndbuf_query_at) > 1000) { in win_update_sndbuf_size()
1478 if(!WSAIoctl(ctx->sock, SIO_IDEAL_SEND_BACKLOG_QUERY, 0, 0, in win_update_sndbuf_size()
1480 ideal != ctx->sndbuf_size && in win_update_sndbuf_size()
1481 !setsockopt(ctx->sock, SOL_SOCKET, SO_SNDBUF, in win_update_sndbuf_size()
1483 ctx->sndbuf_size = ideal; in win_update_sndbuf_size()
1485 ctx->last_sndbuf_query_at = n; in win_update_sndbuf_size()
1495 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_send()
1502 fdsave = cf->conn->sock[cf->sockindex]; in cf_socket_send()
1503 cf->conn->sock[cf->sockindex] = ctx->sock; in cf_socket_send()
1507 if(ctx->wblock_percent > 0) { in cf_socket_send()
1510 if(c >= ((100-ctx->wblock_percent)*256/100)) { in cf_socket_send()
1513 nwritten = -1; in cf_socket_send()
1514 cf->conn->sock[cf->sockindex] = fdsave; in cf_socket_send()
1518 if(cf->cft != &Curl_cft_udp && ctx->wpartial_percent > 0 && len > 8) { in cf_socket_send()
1519 len = len * ctx->wpartial_percent / 100; in cf_socket_send()
1528 if(cf->conn->bits.tcp_fastopen) { in cf_socket_send()
1529 nwritten = sendto(ctx->sock, buf, len, MSG_FASTOPEN, in cf_socket_send()
1530 &cf->conn->remote_addr->curl_sa_addr, in cf_socket_send()
1531 cf->conn->remote_addr->addrlen); in cf_socket_send()
1532 cf->conn->bits.tcp_fastopen = FALSE; in cf_socket_send()
1536 nwritten = swrite(ctx->sock, buf, len); in cf_socket_send()
1538 if(-1 == nwritten) { in cf_socket_send()
1560 data->state.os_errno = sockerr; in cf_socket_send()
1570 CURL_TRC_CF(data, cf, "send(len=%zu) -> %d, err=%d", in cf_socket_send()
1572 cf->conn->sock[cf->sockindex] = fdsave; in cf_socket_send()
1579 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_recv()
1586 if(cf->cft != &Curl_cft_udp && ctx->rblock_percent > 0) { in cf_socket_recv()
1589 if(c >= ((100-ctx->rblock_percent)*256/100)) { in cf_socket_recv()
1592 return -1; in cf_socket_recv()
1595 if(cf->cft != &Curl_cft_udp && ctx->recv_max && ctx->recv_max < len) { in cf_socket_recv()
1597 len = ctx->recv_max; in cf_socket_recv()
1604 nread = sread(ctx->sock, buf, len); in cf_socket_recv()
1606 if(-1 == nread) { in cf_socket_recv()
1628 data->state.os_errno = sockerr; in cf_socket_recv()
1633 CURL_TRC_CF(data, cf, "recv(len=%zu) -> %d, err=%d", len, (int)nread, in cf_socket_recv()
1635 if(nread > 0 && !ctx->got_first_byte) { in cf_socket_recv()
1636 ctx->first_byte_at = Curl_now(); in cf_socket_recv()
1637 ctx->got_first_byte = TRUE; in cf_socket_recv()
1646 if(cf->connected && (cf->sockindex == FIRSTSOCKET)) { in cf_socket_update_data()
1647 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_update_data()
1648 data->info.primary = ctx->ip; in cf_socket_update_data()
1650 data->info.conn_remote_port = cf->conn->remote_port; in cf_socket_update_data()
1656 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_active()
1659 cf->conn->sock[cf->sockindex] = ctx->sock; in cf_socket_active()
1661 if(cf->sockindex == FIRSTSOCKET) { in cf_socket_active()
1662 cf->conn->primary = ctx->ip; in cf_socket_active()
1663 cf->conn->remote_addr = &ctx->addr; in cf_socket_active()
1665 cf->conn->bits.ipv6 = (ctx->addr.family == AF_INET6); in cf_socket_active()
1669 cf->conn->secondary = ctx->ip; in cf_socket_active()
1671 ctx->active = TRUE; in cf_socket_active()
1678 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_cntrl()
1691 ctx->sock = CURL_SOCKET_BAD; in cf_socket_cntrl()
1701 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_conn_is_alive()
1707 if(!ctx || ctx->sock == CURL_SOCKET_BAD) in cf_socket_conn_is_alive()
1711 pfd[0].fd = ctx->sock; in cf_socket_conn_is_alive()
1738 struct cf_socket_ctx *ctx = cf->ctx; in cf_socket_query()
1743 *((curl_socket_t *)pres2) = ctx->sock; in cf_socket_query()
1746 if(ctx->got_first_byte) { in cf_socket_query()
1747 timediff_t ms = Curl_timediff(ctx->first_byte_at, ctx->started_at); in cf_socket_query()
1751 *pres1 = -1; in cf_socket_query()
1755 switch(ctx->transport) { in cf_socket_query()
1760 if(ctx->got_first_byte) { in cf_socket_query()
1761 *when = ctx->first_byte_at; in cf_socket_query()
1766 *when = ctx->connected_at; in cf_socket_query()
1773 *pres1 = (ctx->addr.family == AF_INET6); in cf_socket_query()
1777 *(struct ip_quadruple *)pres2 = ctx->ip; in cf_socket_query()
1782 return cf->next ? in cf_socket_query()
1783 cf->next->cft->query(cf->next, data, query, pres1, pres2) : in cf_socket_query()
1844 struct cf_socket_ctx *ctx = cf->ctx; in cf_udp_setup_quic()
1851 DEBUGASSERT(ctx->sock != CURL_SOCKET_BAD); in cf_udp_setup_quic()
1853 rc = connect(ctx->sock, &ctx->addr.curl_sa_addr, /* NOLINT FIXME */ in cf_udp_setup_quic()
1854 (curl_socklen_t)ctx->addr.addrlen); in cf_udp_setup_quic()
1855 if(-1 == rc) { in cf_udp_setup_quic()
1856 return socket_connect_result(data, ctx->ip.remote_ip, SOCKERRNO); in cf_udp_setup_quic()
1858 ctx->sock_connected = TRUE; in cf_udp_setup_quic()
1861 " connected: [%s:%d] -> [%s:%d]", in cf_udp_setup_quic()
1862 (ctx->transport == TRNSPRT_QUIC) ? "QUIC" : "UDP", in cf_udp_setup_quic()
1863 ctx->sock, ctx->ip.local_ip, ctx->ip.local_port, in cf_udp_setup_quic()
1864 ctx->ip.remote_ip, ctx->ip.remote_port); in cf_udp_setup_quic()
1866 /* Currently, cf->ctx->sock is always non-blocking because the only in cf_udp_setup_quic()
1868 * non-blocking socket created by cf_socket_open() to it. Thus, we in cf_udp_setup_quic()
1871 switch(ctx->addr.family) { in cf_udp_setup_quic()
1875 (void)setsockopt(ctx->sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, in cf_udp_setup_quic()
1883 (void)setsockopt(ctx->sock, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &val, in cf_udp_setup_quic()
1893 (void)setsockopt(ctx->sock, IPPROTO_UDP, UDP_GRO, &one, in cf_udp_setup_quic()
1904 struct cf_socket_ctx *ctx = cf->ctx; in cf_udp_connect()
1908 if(cf->connected) { in cf_udp_connect()
1913 if(ctx->sock == CURL_SOCKET_BAD) { in cf_udp_connect()
1916 CURL_TRC_CF(data, cf, "cf_udp_connect(), open failed -> %d", result); in cf_udp_connect()
1920 if(ctx->transport == TRNSPRT_QUIC) { in cf_udp_connect()
1926 ctx->sock, ctx->ip.local_ip, ctx->ip.local_port); in cf_udp_connect()
1930 FMT_SOCKET_T " (unconnected)", ctx->sock); in cf_udp_connect()
1933 cf->connected = TRUE; in cf_udp_connect()
2051 struct cf_socket_ctx *ctx = cf->ctx; in cf_tcp_accept_timeleft()
2057 if(data->set.accepttimeout > 0) in cf_tcp_accept_timeleft()
2058 timeout_ms = data->set.accepttimeout; in cf_tcp_accept_timeleft()
2065 /* note that this also works fine for when other happens to be negative in cf_tcp_accept_timeleft()
2070 timeout_ms -= Curl_timediff(now, ctx->started_at); in cf_tcp_accept_timeleft()
2073 timeout_ms = -1; in cf_tcp_accept_timeleft()
2081 struct cf_socket_ctx *ctx = cf->ctx; in cf_tcp_set_accepted_remote_ip()
2087 ctx->ip.remote_ip[0] = 0; in cf_tcp_set_accepted_remote_ip()
2088 ctx->ip.remote_port = 0; in cf_tcp_set_accepted_remote_ip()
2091 if(getpeername(ctx->sock, (struct sockaddr*) &ssrem, &plen)) { in cf_tcp_set_accepted_remote_ip()
2098 ctx->ip.remote_ip, &ctx->ip.remote_port)) { in cf_tcp_set_accepted_remote_ip()
2104 ctx->ip.remote_ip[0] = 0; in cf_tcp_set_accepted_remote_ip()
2105 ctx->ip.remote_port = 0; in cf_tcp_set_accepted_remote_ip()
2114 struct cf_socket_ctx *ctx = cf->ctx; in cf_tcp_accept_connect()
2129 if(cf->connected) { in cf_tcp_accept_connect()
2141 CURL_TRC_CF(data, cf, "Checking for incoming on fd=%" FMT_SOCKET_T in cf_tcp_accept_connect()
2142 " ip=%s:%d", ctx->sock, ctx->ip.local_ip, ctx->ip.local_port); in cf_tcp_accept_connect()
2143 socketstate = Curl_socket_check(ctx->sock, CURL_SOCKET_BAD, in cf_tcp_accept_connect()
2145 CURL_TRC_CF(data, cf, "socket_check -> %x", socketstate); in cf_tcp_accept_connect()
2147 case -1: /* error */ in cf_tcp_accept_connect()
2149 failf(data, "Error while waiting for server connect"); in cf_tcp_accept_connect()
2165 if(0 == getsockname(ctx->sock, (struct sockaddr *) &add, &size)) { in cf_tcp_accept_connect()
2167 s_accepted = accept(ctx->sock, (struct sockaddr *) &add, &size); in cf_tcp_accept_connect()
2176 (void)curlx_nonblock(s_accepted, TRUE); /* enable non-blocking */ in cf_tcp_accept_connect()
2178 ctx->listening = FALSE; in cf_tcp_accept_connect()
2179 ctx->accepted = TRUE; in cf_tcp_accept_connect()
2180 socket_close(data, cf->conn, TRUE, ctx->sock); in cf_tcp_accept_connect()
2181 ctx->sock = s_accepted; in cf_tcp_accept_connect()
2183 cf->conn->sock[cf->sockindex] = ctx->sock; in cf_tcp_accept_connect()
2186 ctx->active = TRUE; in cf_tcp_accept_connect()
2187 ctx->connected_at = Curl_now(); in cf_tcp_accept_connect()
2188 cf->connected = TRUE; in cf_tcp_accept_connect()
2191 ctx->sock, ctx->ip.remote_ip, ctx->ip.remote_port); in cf_tcp_accept_connect()
2193 if(data->set.fsockopt) { in cf_tcp_accept_connect()
2196 /* activate callback for setting socket options */ in cf_tcp_accept_connect()
2198 error = data->set.fsockopt(data->set.sockopt_client, in cf_tcp_accept_connect()
2199 ctx->sock, CURLSOCKTYPE_ACCEPT); in cf_tcp_accept_connect()
2209 "TCP-ACCEPT",
2237 DEBUGASSERT(conn->sock[sockindex] == CURL_SOCKET_BAD); in Curl_conn_tcp_listen_set()
2244 ctx->transport = conn->transport; in Curl_conn_tcp_listen_set()
2245 ctx->sock = *s; in Curl_conn_tcp_listen_set()
2246 ctx->listening = TRUE; in Curl_conn_tcp_listen_set()
2247 ctx->accepted = FALSE; in Curl_conn_tcp_listen_set()
2253 ctx->started_at = Curl_now(); in Curl_conn_tcp_listen_set()
2254 conn->sock[sockindex] = ctx->sock; in Curl_conn_tcp_listen_set()
2256 CURL_TRC_CF(data, cf, "set filter for listen socket fd=%" FMT_SOCKET_T in Curl_conn_tcp_listen_set()
2257 " ip=%s:%d", ctx->sock, in Curl_conn_tcp_listen_set()
2258 ctx->ip.local_ip, ctx->ip.local_port); in Curl_conn_tcp_listen_set()
2271 struct Curl_cfilter *cf = data->conn->cfilter[sockindex]; in Curl_conn_is_tcp_listen()
2273 if(cf->cft == &Curl_cft_tcp_accept) in Curl_conn_is_tcp_listen()
2275 cf = cf->next; in Curl_conn_is_tcp_listen()
2285 return cf && (cf->cft == &Curl_cft_tcp || in cf_is_socket()
2286 cf->cft == &Curl_cft_udp || in cf_is_socket()
2287 cf->cft == &Curl_cft_unix || in cf_is_socket()
2288 cf->cft == &Curl_cft_tcp_accept); in cf_is_socket()
2298 if(cf_is_socket(cf) && cf->ctx) { in Curl_cf_socket_peek()
2299 struct cf_socket_ctx *ctx = cf->ctx; in Curl_cf_socket_peek()
2302 *psock = ctx->sock; in Curl_cf_socket_peek()
2304 *paddr = &ctx->addr; in Curl_cf_socket_peek()
2306 *pip = ctx->ip; in Curl_cf_socket_peek()