ttry to do better with headers - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 857072dc11b02d7edc4892613b8d176dc273e92f
parent fc11cb4bbba44a375852ff7652ec740819b5cca9
Author: rsc 
Date:   Sat,  7 May 2005 22:37:26 +0000

ttry to do better with headers

Diffstat:
  M src/libip/udp.c                     |      25 +++++++++++++------------

1 file changed, 13 insertions(+), 12 deletions(-)
---
diff --git a/src/libip/udp.c b/src/libip/udp.c
t@@ -6,17 +6,6 @@
 #include 
 #include 
 
-/*
- *  prefix of all v4 addresses
- *  copied from libip because libc cannot depend on libip
- */
-static uchar v4prefix[IPaddrlen] = {
-        0, 0, 0, 0,
-        0, 0, 0, 0,
-        0, 0, 0xff, 0xff,
-        0, 0, 0, 0
-};
-
 long
 udpread(int fd, Udphdr *hdr, void *buf, long n)
 {
t@@ -24,6 +13,18 @@ udpread(int fd, Udphdr *hdr, void *buf, long n)
         socklen_t len;
 
         len = sizeof sin;
+        if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0)
+                return -1;
+        if(len != sizeof sin){
+                werrstr("getsockname acting weird");
+                return -1;
+        }
+        memset(hdr, 0, sizeof *hdr);
+        memmove(hdr->laddr, v4prefix, IPaddrlen);
+        *(u32int*)(hdr->laddr+12) = *(u32int*)&sin.sin_addr;
+        *(u16int*)hdr->lport = *(u16int*)&sin.sin_port;
+
+        len = sizeof sin;
         n = recvfrom(fd, buf, n, 0, (struct sockaddr*)&sin, &len);
         if(n < 0)
                 return -1;
t@@ -31,10 +32,10 @@ udpread(int fd, Udphdr *hdr, void *buf, long n)
                 werrstr("recvfrom acting weird");
                 return -1;
         }
-        memset(hdr, 0, sizeof *hdr);
         memmove(hdr->raddr, v4prefix, IPaddrlen);
         *(u32int*)(hdr->raddr+12) = *(u32int*)&sin.sin_addr;
         *(u16int*)hdr->rport = *(u16int*)&sin.sin_port;
+
         return n;
 }