- return (error);
-}
-
-
-
-struct pipe_args {
- int dummy;
-};
-/* ARGSUSED */
-int
-pipe(p, uap, retval)
- struct proc *p;
- struct pipe_args *uap;
- register_t *retval;
-{
- struct file *rf, *wf;
- struct socket *rso, *wso;
- int fd, error;
-
- thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
- if (error = socreate(AF_UNIX, &rso, SOCK_STREAM, 0)) {
- thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
- return (error);
- }
- if (error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0)) {
- goto free1;
- }
- thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
- error = falloc(p, &rf, &fd);
- if (error)
- goto free2;
- retval[0] = fd;
- rf->f_flag = FREAD;
- rf->f_type = DTYPE_SOCKET;
- rf->f_ops = &socketops;
- rf->f_data = (caddr_t)rso;
- if (error = falloc(p, &wf, &fd))
- goto free3;
- wf->f_flag = FWRITE;
- wf->f_type = DTYPE_SOCKET;
- wf->f_ops = &socketops;
- wf->f_data = (caddr_t)wso;
- retval[1] = fd;
-
- thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
- error = unp_connect2(wso, rso);
- thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
- if (error)
- goto free4;
- *fdflags(p, retval[0]) &= ~UF_RESERVED;
- *fdflags(p, retval[1]) &= ~UF_RESERVED;
- return (0);
-free4:
- fdrelse(p, retval[1]);
- ffree(wf);
-free3:
- fdrelse(p, retval[0]);
- ffree(rf);
-free2:
- thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
- (void)soclose(wso);
-free1:
- (void)soclose(rso);
-
- thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);