bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/4] lwip: Set output flags when calling recv()


From: Joan Lledó
Subject: [PATCH 2/4] lwip: Set output flags when calling recv()
Date: Thu, 2 May 2019 11:55:00 +0200

    Lwip 2.1.2 added a new function lwip_recvmsg() which writes out flags
    for the recv() operation.

    * lwip/socket-ops.c: Call lwip_recvmsg() instead of lwip_recvfrom().
---
 lwip/socket-ops.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/lwip/socket-ops.c b/lwip/socket-ops.c
index 82a2fe30..9780e7e3 100644
--- a/lwip/socket-ops.c
+++ b/lwip/socket-ops.c
@@ -395,10 +395,13 @@ lwip_S_socket_recv (struct sock_user * user,
                    int *outflags, mach_msg_type_number_t amount)
 {
   error_t err;
-  struct sockaddr_storage addr;
-  socklen_t addrlen = sizeof (addr);
+  union { struct sockaddr_storage storage; struct sockaddr sa; } addr;
   int alloced = 0;
   int sockflags;
+  struct iovec iov;
+  struct msghdr m = { msg_name: &addr.sa, msg_namelen:sizeof addr,
+    msg_controllen: 0, msg_iov: &iov, msg_iovlen:1
+    };
 
   if (!user)
     return EOPNOTSUPP;
@@ -416,13 +419,16 @@ lwip_S_socket_recv (struct sock_user * user,
       alloced = 1;
     }
 
+  iov.iov_base = *data;
+  iov.iov_len = amount;
+
   sockflags = lwip_fcntl (user->sock->sockno, F_GETFL, 0);
+  /* Remove unsupported flags */
+  flags &= MSG_DONTWAIT | MSG_PEEK;
   if (sockflags & O_NONBLOCK)
     flags |= MSG_DONTWAIT;
 
-  /* TODO: use recvmsg instead */
-  err = lwip_recvfrom (user->sock->sockno, *data, amount,
-                      flags, (struct sockaddr *) &addr, &addrlen);
+  err = lwip_recvmsg (user->sock->sockno, &m, flags);
 
   if (err < 0)
     {
@@ -438,13 +444,14 @@ lwip_S_socket_recv (struct sock_user * user,
 
       /* Set the peer's address for the caller */
       err =
-       lwip_S_socket_create_address (0, addr.ss_family, (void *) &addr,
-                                     addrlen, addrport, addrporttype);
+       lwip_S_socket_create_address (0, addr.sa.sa_family,
+                                     (void *) &addr.sa, m.msg_namelen,
+                                     addrport, addrporttype);
 
       if (err && alloced)
        munmap (*data, *datalen);
 
-      *outflags = 0;           /* FIXME */
+      *outflags = m.msg_flags;
       *nports = 0;
       *portstype = MACH_MSG_TYPE_COPY_SEND;
       *controllen = 0;
-- 
2.17.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]