+ len = auio.uio_resid;
+ if (setjmp(&u.u_qsave)) { /* XXX */
+ if (auio.uio_resid == len) {
+ if ((u.u_sigintr & sigmask(u.u_procp->p_cursig)) != 0)
+ u.u_error = EINTR;
+ else
+ u.u_eosys = RESTARTSYS;
+ }
+ } else
+ u.u_error = soreceive((struct socket *)fp->f_data, &from, &auio,
+ &mp->msg_flags, &rights, &control);
+ u.u_r.r_val1 = len - auio.uio_resid;
+ if (mp->msg_name) {
+ len = mp->msg_namelen;
+ if (len <= 0 || from == 0)
+ len = 0;
+ else {
+#ifdef COMPAT_43
+ if (compat_43)
+ mtod(from, struct osockaddr *)->sa_family =
+ mtod(from, struct sockaddr *)->sa_family;
+#endif
+ if (len > from->m_len) /* ??? */
+ len = from->m_len;
+ (void) copyout(mtod(from, caddr_t),
+ (caddr_t)mp->msg_name, (unsigned)len);
+ }
+ mp->msg_namelen = len;
+ if (namelenp)
+ (void) copyout((caddr_t)&len, namelenp, sizeof (int));
+ }
+ if (mp->msg_accrights) {
+ len = mp->msg_accrightslen;
+ if (len <= 0 || rights == 0)
+ len = 0;
+ else {
+ if (len > rights->m_len)
+ len = rights->m_len;
+ (void) copyout((caddr_t)mtod(rights, caddr_t),
+ (caddr_t)mp->msg_accrights, (unsigned)len);
+ }
+ mp->msg_accrightslen = len;
+ if (rightslenp)
+ (void) copyout((caddr_t)&len, rightslenp, sizeof (int));
+ }
+ if (mp->msg_control) {
+ len = mp->msg_controllen;
+ if (len <= 0 || control == 0)
+ len = 0;
+ else {
+ if (len >= control->m_len)
+ len = control->m_len;
+ else
+ mp->msg_flags |= MSG_CTRUNC;
+ (void) copyout((caddr_t)mtod(control, caddr_t),
+ (caddr_t)mp->msg_control, (unsigned)len);
+ }
+ mp->msg_controllen = len;
+ }
+ if (rights)
+ m_freem(rights);
+ if (from)
+ m_freem(from);
+ if (control)
+ m_freem(control);