]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
ngtcp2: build without sendmsg
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Fri, 10 Jun 2022 07:09:39 +0000 (09:09 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 10 Jun 2022 07:10:54 +0000 (09:10 +0200)
Closes #8981

configure.ac
lib/vquic/ngtcp2.c

index ce66b5592fc980ef5cd1c604219cb7d4433fd370..c74d7df2fadd24b86e65050b8c4e652aee98eef8 100644 (file)
@@ -3446,6 +3446,7 @@ AC_CHECK_FUNCS([fnmatch \
   mach_absolute_time \
   pipe \
   sched_yield \
+  sendmsg \
   setlocale \
   setmode \
   setrlimit \
index 54600488585c205a31b4278d06c9789eb6982bf9..60912044a1c3c90cac0bd80a58b7d09cec0e552e 100644 (file)
@@ -728,7 +728,7 @@ CURLcode Curl_quic_connect(struct Curl_easy *data,
 
   ngtcp2_connection_close_error_default(&qs->last_error);
 
-#if defined(__linux__) && defined(UDP_SEGMENT)
+#if defined(__linux__) && defined(UDP_SEGMENT) & defined(HAVE_SENDMSG)
   qs->no_gso = FALSE;
 #else
   qs->no_gso = TRUE;
@@ -1647,9 +1647,10 @@ static CURLcode do_sendmsg(size_t *psent, struct Curl_easy *data, int sockfd,
                            struct quicsocket *qs, const uint8_t *pkt,
                            size_t pktlen, size_t gsolen)
 {
+#ifdef HAVE_SENDMSG
   struct iovec msg_iov = {(void *)pkt, pktlen};
   struct msghdr msg = {0};
-  uint8_t msg_ctrl[CMSG_SPACE(sizeof(uint16_t))] = {0};
+  uint8_t msg_ctrl[32];
   size_t ctrllen = 0;
   ssize_t sent;
 #if defined(__linux__) && defined(UDP_SEGMENT)
@@ -1658,6 +1659,8 @@ static CURLcode do_sendmsg(size_t *psent, struct Curl_easy *data, int sockfd,
 
   *psent = 0;
 
+  assert(sizeof(msg_ctrl) >= CMSG_SPACE(sizeof(uint16_t)));
+
   msg.msg_iov = &msg_iov;
   msg.msg_iovlen = 1;
 
@@ -1708,6 +1711,31 @@ static CURLcode do_sendmsg(size_t *psent, struct Curl_easy *data, int sockfd,
   else {
     assert(pktlen == (size_t)sent);
   }
+#else
+  ssize_t sent;
+  (void)qs;
+  (void)gsolen;
+
+  *psent = 0;
+
+  while((sent = send(sockfd, (const char *)pkt, pktlen, 0)) == -1 &&
+        SOCKERRNO == EINTR)
+    ;
+
+  if(sent == -1) {
+    if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK) {
+      return CURLE_AGAIN;
+    }
+    else {
+      failf(data, "send() returned %zd (errno %d)", sent, SOCKERRNO);
+      if(SOCKERRNO != EMSGSIZE) {
+        return CURLE_SEND_ERROR;
+      }
+      /* UDP datagram is too large; caused by PMTUD. Just let it be
+         lost. */
+    }
+  }
+#endif
 
   *psent = pktlen;