symbolic links
[unix-history] / usr / src / sys / netinet / in_pcb.c
index c79eea0..b62bc78 100644 (file)
@@ -1,4 +1,4 @@
-/* in_pcb.c 4.13 81/12/11 */
+/*     in_pcb.c        4.16    82/02/15        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -66,18 +66,20 @@ COUNT(IN_PCBATTACH);
        if (sin) {
                if (sin->sin_family != AF_INET)
                        return (EAFNOSUPPORT);
        if (sin) {
                if (sin->sin_family != AF_INET)
                        return (EAFNOSUPPORT);
+               if (ifnet && sin->sin_addr.s_addr == 0)
+                       sin->sin_addr = ifnet->if_addr;
                ifp = if_ifwithaddr(sin->sin_addr);
                ifp = if_ifwithaddr(sin->sin_addr);
-               if (ifp == 0)
-                       return (EADDRNOTAVAIL);
                lport = sin->sin_port;
                if (lport &&
                    in_pcblookup(head, zeroin_addr, 0, sin->sin_addr, lport))
                        return (EADDRINUSE);
        } else {
                lport = sin->sin_port;
                if (lport &&
                    in_pcblookup(head, zeroin_addr, 0, sin->sin_addr, lport))
                        return (EADDRINUSE);
        } else {
-               ifp = if_ifwithaddr(ifnet->if_addr);
+               ifp = ifnet;
                lport = 0;
        }
                lport = 0;
        }
-       m = m_getclr(0);
+       if (ifp == 0)
+               return (EADDRNOTAVAIL);
+       m = m_getclr(M_DONTWAIT);
        if (m == 0)
                return (ENOBUFS);
        if (sbreserve(&so->so_snd, sndcc) == 0)
        if (m == 0)
                return (ENOBUFS);
        if (sbreserve(&so->so_snd, sndcc) == 0)
@@ -128,6 +130,17 @@ COUNT(IN_PCBCONNECT);
        return (0);
 }
 
        return (0);
 }
 
+in_pcbconnaddr(inp, sp)
+       struct inpcb *inp;
+       struct sockaddr *sp;
+{
+       register struct sockaddr_in *sin = (struct sockaddr_in *)sp;
+
+       sin->sin_family = AF_INET;
+       sin->sin_port = inp->inp_fport;
+       sin->sin_addr = inp->inp_faddr;
+}
+
 in_pcbdisconnect(inp)
        struct inpcb *inp;
 {
 in_pcbdisconnect(inp)
        struct inpcb *inp;
 {