+ 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(p, uap, retval)
+ struct proc *p;
+ struct args {
+ int fdes;
+ caddr_t asa;
+ int *alen;
+ int compat_43;
+ } *uap;
+ int *retval;
+{
+
+ uap->compat_43 = 0;
+ RETURN (getpeername1(p, uap, retval));
+}
+
+ogetpeername(p, uap, retval)
+ struct proc *p;
+ struct args {
+ int fdes;
+ caddr_t asa;
+ int *alen;
+ int compat_43;
+ } *uap;
+ int *retval;
+{
+
+ uap->compat_43 = 1;
+ RETURN (getpeername1(p, uap, retval));
+}
+#else /* COMPAT_43 */
+
+#define getpeername1 getpeername
+#endif
+
+/* ARGSUSED */
+getpeername1(p, uap, retval)
+ struct proc *p;
+ register struct args {
+ int fdes;
+ caddr_t asa;
+ int *alen;
+#ifdef COMPAT_43
+ int compat_43;
+#endif
+ } *uap;
+ int *retval;
+{
+ 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))