+ if (fp->f_type != DTYPE_SOCKET) {
+ u.u_error = ENOTSOCK;
+ return;
+ }
+ auio.uio_iov = &aiov;
+ auio.uio_iovcnt = 1;
+ aiov.iov_base = uap->buf;
+ aiov.iov_len = uap->len;
+ auio.uio_resid = uap->len;
+ auio.uio_segflg = 0;
+ auio.uio_offset = 0; /* XXX */
+ if (useracc(uap->buf, uap->len, B_WRITE) == 0) {
+ u.u_error = EFAULT;
+ return;
+ }
+ u.u_error = soreceive(fp->f_socket, (struct mbuf *)0, &auio, uap->flags);
+ u.u_r.r_val1 = uap->len - auio.uio_resid;
+}
+
+sendmsg()
+{
+
+ u.u_error = EINVAL;
+}
+
+recvmsg()
+{
+
+ u.u_error = EINVAL;
+}
+
+shutdown()
+{
+
+ u.u_error = EINVAL;
+}
+
+pipe()
+{
+ register struct file *rf, *wf;
+ struct socket *rso, *wso;
+ int r;
+
+ u.u_error = socreate(1, &rso, SOCK_STREAM, 0, 0);
+ if (u.u_error)
+ return;
+ u.u_error = socreate(1, &wso, SOCK_STREAM, 0, 0);
+ if (u.u_error)
+ goto free;
+ rf = falloc();
+ if (rf == NULL)
+ goto free2;
+ r = u.u_r.r_val1;
+ rf->f_flag = FREAD;
+ rf->f_type = DTYPE_SOCKET;
+ rf->f_socket = rso;
+ wf = falloc();
+ if (wf == NULL)
+ goto free3;
+ wf->f_flag = FWRITE;
+ wf->f_type = DTYPE_SOCKET;
+ wf->f_socket = wso;
+ u.u_r.r_val2 = u.u_r.r_val1;
+ u.u_r.r_val1 = r;
+ if (piconnect(wso, rso) == 0)
+ goto free4;
+ return;
+free4:
+ wf->f_count = 0;
+ u.u_ofile[u.u_r.r_val2] = 0;
+free3:
+ rf->f_count = 0;
+ u.u_ofile[r] = 0;
+free2:
+ wso->so_state |= SS_NOFDREF;
+ sofree(wso);
+free:
+ rso->so_state |= SS_NOFDREF;
+ sofree(rso);