+ if (m == 0)
+ return (ENOBUFS);
+ if (sbreserve(&so->so_snd, sndcc) == 0)
+ goto bad;
+ if (sbreserve(&so->so_rcv, rcvcc) == 0)
+ goto bad2;
+ inp = mtod(m, struct inpcb *);
+ inp->inp_laddr = ifp->if_addr;
+ if (lport)
+ goto gotport;
+again:
+ if (head->inp_lport++ < 1024)
+ head->inp_lport = 1024;
+ for (xp = head->inp_next; xp != head; xp = xp->inp_next)
+ if (xp->inp_lport == head->inp_lport)
+ goto again;
+ lport = head->inp_lport;
+gotport:
+ inp->inp_socket = so;
+ inp->inp_lport = lport;
+ insque(inp, head);
+ so->so_pcb = (caddr_t)inp;
+ sin = (struct sockaddr_in *)&so->so_addr;
+ sin->sin_family = AF_INET;
+ sin->sin_addr = inp->inp_laddr;
+ sin->sin_port = inp->inp_lport;
+ return (0);
+bad2:
+ sbrelease(&so->so_snd);
+bad:
+ (void) m_free(m);
+ return (ENOBUFS);