recv(...,MSG_TRUNC)

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

 




Hello,

man recv says, about flags :

       MSG_TRUNC
              Return  the real length of the packet, even when it
              was longer than the passed buffer. Only  valid  for
              packet sockets.

But it is neither implemented in ipv4/udp.c, nor in ipv6/udp.c, although
it is in tcp.c, for instance !

By searching with google, I could read old manpages where it didn't exist,
but I find it very useful, especially in conjunction with MSG_PEEK, for
trying to read a packet with a little buffer, and then really get it with
an appropriate buffer.

So here's a patch which cures 2.4.18, and also works on 2.5 kernels.

Best regards,

Samuel Thibault
diff -urN linux-2.4.18/net/ipv4/udp.c linux-2.4.18-cor/net/ipv4/udp.c
--- linux-2.4.18/net/ipv4/udp.c	Mon Jun 10 23:34:59 2002
+++ linux-2.4.18-cor/net/ipv4/udp.c	Mon Jun 10 23:35:31 2002
@@ -680,7 +680,7 @@
   	}
 	if (sk->protinfo.af_inet.cmsg_flags)
 		ip_cmsg_recv(msg, skb);
-	err = copied;
+	err = (flags&MSG_TRUNC) ? skb->len - sizeof(struct udphdr) : copied;
   
 out_free:
   	skb_free_datagram(sk, skb);
diff -urN linux-2.4.18/net/ipv6/udp.c linux-2.4.18-cor/net/ipv6/udp.c
--- linux-2.4.18/net/ipv6/udp.c	Mon Jun 10 23:35:07 2002
+++ linux-2.4.18-cor/net/ipv6/udp.c	Mon Jun 10 23:35:36 2002
@@ -432,7 +432,7 @@
 			}
 		}
   	}
-	err = copied;
+	err = (flags&MSG_TRUNC) ? skb->len - sizeof(struct udphdr) : copied;
 
 out_free:
 	skb_free_datagram(sk, skb);

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux