+in_setsockaddr(inp, nam)
+ register struct inpcb *inp;
+ struct mbuf *nam;
+{
+ register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *);
+
+ nam->m_len = sizeof (*sin);
+ sin = mtod(nam, struct sockaddr_in *);
+ bzero((caddr_t)sin, sizeof (*sin));
+ sin->sin_family = AF_INET;
+ sin->sin_port = inp->inp_lport;
+ sin->sin_addr = inp->inp_laddr;
+}
+
+in_setpeeraddr(inp, nam)
+ register struct inpcb *inp;
+ struct mbuf *nam;
+{
+ register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *);
+
+ nam->m_len = sizeof (*sin);
+ sin = mtod(nam, struct sockaddr_in *);
+ bzero((caddr_t)sin, sizeof (*sin));
+ sin->sin_family = AF_INET;
+ sin->sin_port = inp->inp_fport;
+ sin->sin_addr = inp->inp_faddr;
+}
+
+/*
+ * Pass an error to all internet connections
+ * associated with address sin. Call the
+ * protocol specific routine to clean up the
+ * mess afterwards.
+ */
+in_pcbnotify(head, dst, errno, abort)
+ struct inpcb *head;
+ register struct in_addr *dst;
+ int errno, (*abort)();
+{
+ register struct inpcb *inp, *oinp;
+ int s = splimp();
+
+ for (inp = head->inp_next; inp != head;) {
+ if (inp->inp_faddr.s_addr != dst->s_addr) {
+ next:
+ inp = inp->inp_next;
+ continue;
+ }
+ if (inp->inp_socket == 0)
+ goto next;
+ inp->inp_socket->so_error = errno;
+ oinp = inp;
+ inp = inp->inp_next;
+ (*abort)(oinp);
+ }
+ splx(s);
+}
+