+ msg.msg_iov = aiov;
+#ifdef notdef
+printf("sendmsg name %x namelen %d iov %x iovlen %d accrights %x &len %d\n",
+msg.msg_name, msg.msg_namelen, msg.msg_iov, msg.msg_iovlen,
+msg.msg_accrights, msg.msg_accrightslen);
+#endif
+ sendit(uap->s, &msg, uap->flags);
+}
+
+sendit(s, mp, flags)
+ int s;
+ register struct msghdr *mp;
+ int flags;
+{
+ register struct file *fp;
+ struct uio auio;
+ register struct iovec *iov;
+ register int i;
+ struct mbuf *to, *rights;
+ int len;
+
+ fp = getsock(s);
+ if (fp == 0)
+ return;
+ auio.uio_iov = mp->msg_iov;
+ auio.uio_iovcnt = mp->msg_iovlen;
+ auio.uio_segflg = UIO_USERSPACE;
+ auio.uio_offset = 0; /* XXX */
+ auio.uio_resid = 0;
+ iov = mp->msg_iov;
+ for (i = 0; i < mp->msg_iovlen; i++) {
+ if (iov->iov_len < 0) {
+ u.u_error = EINVAL;
+ return;
+ }
+ if (iov->iov_len == 0)
+ continue;
+ if (useracc(iov->iov_base, (u_int)iov->iov_len, B_READ) == 0) {
+ u.u_error = EFAULT;
+ return;
+ }
+ auio.uio_resid += iov->iov_len;
+ iov++;
+ }
+ if (mp->msg_name) {
+ u.u_error =
+ sockargs(&to, mp->msg_name, mp->msg_namelen);
+ if (u.u_error)
+ return;
+ } else
+ to = 0;
+ if (mp->msg_accrights) {
+ u.u_error =
+ sockargs(&rights, mp->msg_accrights, mp->msg_accrightslen);
+ if (u.u_error)
+ goto bad;
+ } else
+ rights = 0;
+ len = auio.uio_resid;
+ u.u_error =
+ sosend((struct socket *)fp->f_data, to, &auio, flags, rights);
+ u.u_r.r_val1 = len - auio.uio_resid;
+ if (rights)
+ m_freem(rights);
+bad:
+ if (to)
+ m_freem(to);