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