1/*
2 * Copyright (c) 1996 John S. Dyson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice immediately at the beginning of the file, without modification,
10 * this list of conditions, and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Absolutely no warranty of function or purpose is made by the author
15 * John S. Dyson.
16 * 4. Modifications may be freely made to this file if the above conditions
17 * are met.
18 *
19 * $Id: sys_pipe.c,v 1.52 1999/06/05 03:53:57 alc Exp $
20 */
21
22/*
23 * This file contains a high-performance replacement for the socket-based
24 * pipes scheme originally used in FreeBSD/4.4Lite. It does not support
25 * all features of sockets, but does do everything that pipes normally
26 * do.
27 */
--- 143 unchanged lines hidden (view full) ---
171 wpipe->pipe_state |= PIPE_DIRECTOK;
172
173 error = falloc(p, &rf, &fd);
174 if (error)
175 goto free2;
176 p->p_retval[0] = fd;
177 rf->f_flag = FREAD | FWRITE;
178 rf->f_type = DTYPE_PIPE;
179 rf->f_data = (caddr_t)rpipe;
180 rf->f_ops = &pipeops;
181 error = falloc(p, &wf, &fd);
182 if (error)
183 goto free3;
184 wf->f_flag = FREAD | FWRITE;
185 wf->f_type = DTYPE_PIPE;
186 wf->f_data = (caddr_t)wpipe;
187 wf->f_ops = &pipeops;
188 p->p_retval[1] = fd;
189
190 rpipe->pipe_peer = wpipe;
191 wpipe->pipe_peer = rpipe;
192
193 return (0);
194free3:
195 fdp->fd_ofiles[p->p_retval[0]] = 0;
196 ffree(rf);
197free2:
198 (void)pipeclose(wpipe);
199 (void)pipeclose(rpipe);
200 return (error);
201}
202
203/*
204 * Allocate kva for pipe circular buffer, the space is pageable
--- 829 unchanged lines hidden (view full) ---
1034/* ARGSUSED */
1035static int
1036pipe_close(fp, p)
1037 struct file *fp;
1038 struct proc *p;
1039{
1040 struct pipe *cpipe = (struct pipe *)fp->f_data;
1041
1042 fp->f_ops = &badfileops;
1043 fp->f_data = NULL;
1044 funsetown(cpipe->pipe_sigio);
1045 pipeclose(cpipe);
1046 return 0;
1047}
1048
1049/*
1050 * shutdown the pipe
1051 */
1052static void
1053pipeclose(cpipe)
--- 50 unchanged lines hidden ---
2 * Copyright (c) 1996 John S. Dyson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice immediately at the beginning of the file, without modification,
10 * this list of conditions, and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Absolutely no warranty of function or purpose is made by the author
15 * John S. Dyson.
16 * 4. Modifications may be freely made to this file if the above conditions
17 * are met.
18 *
19 * $Id: sys_pipe.c,v 1.52 1999/06/05 03:53:57 alc Exp $
20 */
21
22/*
23 * This file contains a high-performance replacement for the socket-based
24 * pipes scheme originally used in FreeBSD/4.4Lite. It does not support
25 * all features of sockets, but does do everything that pipes normally
26 * do.
27 */
--- 143 unchanged lines hidden (view full) ---
171 wpipe->pipe_state |= PIPE_DIRECTOK;
172
173 error = falloc(p, &rf, &fd);
174 if (error)
175 goto free2;
176 p->p_retval[0] = fd;
177 rf->f_flag = FREAD | FWRITE;
178 rf->f_type = DTYPE_PIPE;
179 rf->f_data = (caddr_t)rpipe;
180 rf->f_ops = &pipeops;
181 error = falloc(p, &wf, &fd);
182 if (error)
183 goto free3;
184 wf->f_flag = FREAD | FWRITE;
185 wf->f_type = DTYPE_PIPE;
186 wf->f_data = (caddr_t)wpipe;
187 wf->f_ops = &pipeops;
188 p->p_retval[1] = fd;
189
190 rpipe->pipe_peer = wpipe;
191 wpipe->pipe_peer = rpipe;
192
193 return (0);
194free3:
195 fdp->fd_ofiles[p->p_retval[0]] = 0;
196 ffree(rf);
197free2:
198 (void)pipeclose(wpipe);
199 (void)pipeclose(rpipe);
200 return (error);
201}
202
203/*
204 * Allocate kva for pipe circular buffer, the space is pageable
--- 829 unchanged lines hidden (view full) ---
1034/* ARGSUSED */
1035static int
1036pipe_close(fp, p)
1037 struct file *fp;
1038 struct proc *p;
1039{
1040 struct pipe *cpipe = (struct pipe *)fp->f_data;
1041
1042 fp->f_ops = &badfileops;
1043 fp->f_data = NULL;
1044 funsetown(cpipe->pipe_sigio);
1045 pipeclose(cpipe);
1046 return 0;
1047}
1048
1049/*
1050 * shutdown the pipe
1051 */
1052static void
1053pipeclose(cpipe)
--- 50 unchanged lines hidden ---