URI: 
       ttry to do better with headers - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 857072dc11b02d7edc4892613b8d176dc273e92f
   DIR parent fc11cb4bbba44a375852ff7652ec740819b5cca9
  HTML Author: rsc <devnull@localhost>
       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(-)
       ---
   DIR diff --git a/src/libip/udp.c b/src/libip/udp.c
       t@@ -6,17 +6,6 @@
        #include <sys/socket.h>
        #include <netinet/in.h>
        
       -/*
       - *  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;
        }