+ so = fp->f_socket;
+ m = m_getclr(M_WAIT, MT_SONAME);
+ u.u_error =
+ (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0);
+ if (u.u_error)
+ goto bad;
+ u.u_error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa,
+ sizeof (struct sockaddr));
+bad:
+ m_freem(m);
+}
+
+sockname(aname, name, namelen)
+ struct mbuf **aname;
+ caddr_t name;
+ int namelen;
+{
+ register struct mbuf *m;
+ int error;
+
+ if (namelen > MLEN)
+ return (EINVAL);
+ m = m_get(M_WAIT, MT_SONAME);
+ m->m_len = namelen;
+ error = copyin(name, mtod(m, caddr_t), (u_int)namelen);
+ if (error)
+ (void) m_free(m);
+ else
+ *aname = m;
+ return (error);
+}
+
+sockopt(so, opt)
+ register struct socketopt *so;
+ caddr_t opt;
+{
+ register struct mbuf *m;
+ int error;
+
+ if (opt == 0) {
+ so->so_optlen = 0;
+ so->so_optdata = 0;
+ return (0);
+ }
+ error = copyin((caddr_t)opt, (caddr_t)so, sizeof (struct socketopt));
+ if (error)
+ return (error);
+ if (so->so_optlen < 0 || so->so_optlen > MLEN)
+ return (EINVAL);
+ m = m_get(M_WAIT, MT_SOOPTS);
+ m->m_len = so->so_optlen;
+ error = copyin(so->so_optdata, mtod(m, caddr_t), (u_int)m->m_len);
+ if (error) {
+ (void) m_free(m);
+ return (error);