diff options
-rw-r--r-- | lib/connect.c | 5 | ||||
-rw-r--r-- | lib/vquic/ngtcp2.c | 14 | ||||
-rw-r--r-- | lib/vquic/quiche.c | 4 |
3 files changed, 14 insertions, 9 deletions
diff --git a/lib/connect.c b/lib/connect.c index 4c8c956a4..3b88a5962 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -1516,6 +1516,11 @@ CURLcode Curl_socket(struct connectdata *conn, /* no socket, no connection */ return CURLE_COULDNT_CONNECT; + if(conn->transport == TRNSPRT_QUIC) { + /* QUIC sockets need to be nonblocking */ + (void)curlx_nonblock(*sockfd, TRUE); + } + #if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) if(conn->scope_id && (addr->family == AF_INET6)) { struct sockaddr_in6 * const sa6 = (void *)&addr->sa_addr; diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c index 29a84d1c3..864751101 100644 --- a/lib/vquic/ngtcp2.c +++ b/lib/vquic/ngtcp2.c @@ -550,7 +550,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn, if(!Curl_addr2string((struct sockaddr*)addr, addrlen, ipbuf, &port)) { char buffer[STRERROR_LEN]; failf(data, "ssrem inet_ntop() failed with errno %d: %s", - errno, Curl_strerror(errno, buffer, sizeof(buffer))); + SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer))); return CURLE_BAD_FUNCTION_ARGUMENT; } @@ -1404,13 +1404,13 @@ static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd, for(;;) { remote_addrlen = sizeof(remote_addr); - while((recvd = recvfrom(sockfd, buf, bufsize, MSG_DONTWAIT, + while((recvd = recvfrom(sockfd, buf, bufsize, 0, (struct sockaddr *)&remote_addr, &remote_addrlen)) == -1 && - errno == EINTR) + SOCKERRNO == EINTR) ; if(recvd == -1) { - if(errno == EAGAIN || errno == EWOULDBLOCK) + if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) break; failf(conn->data, "ngtcp2: recvfrom() unexpectedly returned %d", recvd); @@ -1544,14 +1544,14 @@ static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd, } memcpy(&remote_addr, ps.path.remote.addr, ps.path.remote.addrlen); - while((sent = sendto(sockfd, out, outlen, MSG_DONTWAIT, + while((sent = sendto(sockfd, out, outlen, 0, (struct sockaddr *)&remote_addr, (socklen_t)ps.path.remote.addrlen)) == -1 && - errno == EINTR) + SOCKERRNO == EINTR) ; if(sent == -1) { - if(errno == EAGAIN || errno == EWOULDBLOCK) { + if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) { /* TODO Cache packet */ break; } diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c index 28eba8bbd..0ee360d07 100644 --- a/lib/vquic/quiche.c +++ b/lib/vquic/quiche.c @@ -208,7 +208,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd, conn->primary_ip, &conn->primary_port)) { char buffer[STRERROR_LEN]; failf(data, "ssrem inet_ntop() failed with errno %d: %s", - errno, Curl_strerror(errno, buffer, sizeof(buffer))); + SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer))); return CURLE_BAD_FUNCTION_ARGUMENT; } memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN); @@ -301,7 +301,7 @@ static CURLcode process_ingress(struct connectdata *conn, int sockfd, do { recvd = recv(sockfd, buf, bufsize, 0); - if((recvd < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) + if((recvd < 0) && ((SOCKERRNO == EAGAIN) || (SOCKERRNO == EWOULDBLOCK))) break; if(recvd < 0) { |