+ if (m == NULL)
+ return (ENOBUFS);
+ if (error = (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0))
+ goto bad;
+ if (len > m->m_len)
+ len = m->m_len;
+#ifdef COMPAT_43
+ if (uap->compat_43)
+ mtod(m, struct osockaddr *)->sa_family =
+ mtod(m, struct sockaddr *)->sa_family;
+#endif
+ error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa, (u_int)len);
+ if (error == 0)
+ error = copyout((caddr_t)&len, (caddr_t)uap->alen,
+ sizeof (len));
+bad:
+ m_freem(m);
+ return (error);
+}
+
+/*
+ * Get name of peer for connected socket.
+ */
+#ifdef COMPAT_43
+getpeername()
+{
+ register struct a {
+ int fdes;
+ caddr_t asa;
+ int *alen;
+ int compat_43;
+ } *uap = (struct a *)u.u_ap;
+
+ ((struct a *)u.u_ap)->compat_43 = 0;
+ getpeername1();
+}
+
+ogetpeername()
+{
+ register struct a {
+ int fdes;
+ caddr_t asa;
+ int *alen;
+ int compat_43;
+ } *uap = (struct a *)u.u_ap;
+
+ ((struct a *)u.u_ap)->compat_43 = 1;
+ getpeername1();
+}
+#else /* COMPAT_43 */
+
+#define getpeername1 getpeername
+#endif
+
+getpeername1()
+{
+ register struct a {
+ int fdes;
+ caddr_t asa;
+ int *alen;
+#ifdef COMPAT_43
+ int compat_43;
+#endif
+ } *uap = (struct a *)u.u_ap;
+ register struct file *fp;
+ register struct socket *so;
+ struct mbuf *m;
+ int len, error;
+
+ fp = getsock(uap->fdes, &error);
+ if (fp == 0)
+ return (error);
+ so = (struct socket *)fp->f_data;
+ if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0)
+ return (ENOTCONN);
+ m = m_getclr(M_WAIT, MT_SONAME);
+ if (m == NULL)
+ return (ENOBUFS);
+ if (error = copyin((caddr_t)uap->alen, (caddr_t)&len, sizeof (len)))
+ return (error);
+ if (error = (*so->so_proto->pr_usrreq)(so, PRU_PEERADDR, 0, m, 0))