This source file includes following definitions.
- pipe_read
- pipe_write
- pipe_lseek
- bad_pipe_r
- bad_pipe_w
- pipe_ioctl
- pipe_select
- fifo_select
- connect_read
- connect_select
- pipe_read_release
- pipe_write_release
- pipe_rdwr_release
- pipe_read_open
- pipe_write_open
- pipe_rdwr_open
- do_pipe
1
2
3
4
5
6
7 #include <asm/segment.h>
8
9 #include <linux/sched.h>
10 #include <linux/kernel.h>
11 #include <linux/errno.h>
12 #include <linux/signal.h>
13 #include <linux/fcntl.h>
14 #include <linux/termios.h>
15 #include <linux/mm.h>
16
17
18
19
20
21
22
23
24
25 static int pipe_read(struct inode * inode, struct file * filp, char * buf, int count)
26 {
27 int chars = 0, size = 0, read = 0;
28 char *pipebuf;
29
30 if (filp->f_flags & O_NONBLOCK) {
31 if (PIPE_LOCK(*inode))
32 return -EAGAIN;
33 if (PIPE_EMPTY(*inode))
34 if (PIPE_WRITERS(*inode))
35 return -EAGAIN;
36 else
37 return 0;
38 } else while (PIPE_EMPTY(*inode) || PIPE_LOCK(*inode)) {
39 if (PIPE_EMPTY(*inode)) {
40 if (!PIPE_WRITERS(*inode))
41 return 0;
42 }
43 if (current->signal & ~current->blocked)
44 return -ERESTARTSYS;
45 interruptible_sleep_on(&PIPE_WAIT(*inode));
46 }
47 PIPE_LOCK(*inode)++;
48 while (count>0 && (size = PIPE_SIZE(*inode))) {
49 chars = PIPE_MAX_RCHUNK(*inode);
50 if (chars > count)
51 chars = count;
52 if (chars > size)
53 chars = size;
54 read += chars;
55 pipebuf = PIPE_BASE(*inode)+PIPE_START(*inode);
56 PIPE_START(*inode) += chars;
57 PIPE_START(*inode) &= (PIPE_BUF-1);
58 PIPE_LEN(*inode) -= chars;
59 count -= chars;
60 memcpy_tofs(buf, pipebuf, chars );
61 buf += chars;
62 }
63 PIPE_LOCK(*inode)--;
64 wake_up_interruptible(&PIPE_WAIT(*inode));
65 if (read)
66 return read;
67 if (PIPE_WRITERS(*inode))
68 return -EAGAIN;
69 return 0;
70 }
71
72 static int pipe_write(struct inode * inode, struct file * filp, const char * buf, int count)
73 {
74 int chars = 0, free = 0, written = 0;
75 char *pipebuf;
76
77 if (!PIPE_READERS(*inode)) {
78 send_sig(SIGPIPE,current,0);
79 return -EPIPE;
80 }
81
82 if (count <= PIPE_BUF)
83 free = count;
84 else
85 free = 1;
86 while (count>0) {
87 while ((PIPE_FREE(*inode) < free) || PIPE_LOCK(*inode)) {
88 if (!PIPE_READERS(*inode)) {
89 send_sig(SIGPIPE,current,0);
90 return written? :-EPIPE;
91 }
92 if (current->signal & ~current->blocked)
93 return written? :-ERESTARTSYS;
94 if (filp->f_flags & O_NONBLOCK)
95 return written? :-EAGAIN;
96 interruptible_sleep_on(&PIPE_WAIT(*inode));
97 }
98 PIPE_LOCK(*inode)++;
99 while (count>0 && (free = PIPE_FREE(*inode))) {
100 chars = PIPE_MAX_WCHUNK(*inode);
101 if (chars > count)
102 chars = count;
103 if (chars > free)
104 chars = free;
105 pipebuf = PIPE_BASE(*inode)+PIPE_END(*inode);
106 written += chars;
107 PIPE_LEN(*inode) += chars;
108 count -= chars;
109 memcpy_fromfs(pipebuf, buf, chars );
110 buf += chars;
111 }
112 PIPE_LOCK(*inode)--;
113 wake_up_interruptible(&PIPE_WAIT(*inode));
114 free = 1;
115 }
116 return written;
117 }
118
119 static int pipe_lseek(struct inode * inode, struct file * file, off_t offset, int orig)
120 {
121 return -ESPIPE;
122 }
123
124 static int bad_pipe_r(struct inode * inode, struct file * filp, char * buf, int count)
125 {
126 return -EBADF;
127 }
128
129 static int bad_pipe_w(struct inode * inode, struct file * filp, const char * buf, int count)
130 {
131 return -EBADF;
132 }
133
134 static int pipe_ioctl(struct inode *pino, struct file * filp,
135 unsigned int cmd, unsigned long arg)
136 {
137 int error;
138
139 switch (cmd) {
140 case FIONREAD:
141 error = verify_area(VERIFY_WRITE, (void *) arg, sizeof(int));
142 if (!error)
143 put_user(PIPE_SIZE(*pino),(int *) arg);
144 return error;
145 default:
146 return -EINVAL;
147 }
148 }
149
150 static int pipe_select(struct inode * inode, struct file * filp, int sel_type, select_table * wait)
151 {
152 switch (sel_type) {
153 case SEL_IN:
154 if (!PIPE_EMPTY(*inode) || !PIPE_WRITERS(*inode))
155 return 1;
156 select_wait(&PIPE_WAIT(*inode), wait);
157 return 0;
158 case SEL_OUT:
159 if (!PIPE_FULL(*inode) || !PIPE_READERS(*inode))
160 return 1;
161 select_wait(&PIPE_WAIT(*inode), wait);
162 return 0;
163 case SEL_EX:
164 if (!PIPE_READERS(*inode) || !PIPE_WRITERS(*inode))
165 return 1;
166 select_wait(&inode->i_wait,wait);
167 return 0;
168 }
169 return 0;
170 }
171
172
173
174
175
176 static int fifo_select(struct inode * inode, struct file * filp, int sel_type, select_table * wait)
177 {
178 switch (sel_type) {
179 case SEL_IN:
180 if (!PIPE_EMPTY(*inode))
181 return 1;
182 select_wait(&PIPE_WAIT(*inode), wait);
183 return 0;
184 case SEL_OUT:
185 if (!PIPE_FULL(*inode) || !PIPE_READERS(*inode))
186 return 1;
187 select_wait(&PIPE_WAIT(*inode), wait);
188 return 0;
189 case SEL_EX:
190 if (!PIPE_READERS(*inode) || !PIPE_WRITERS(*inode))
191 return 1;
192 select_wait(&inode->i_wait,wait);
193 return 0;
194 }
195 return 0;
196 }
197
198
199
200
201
202
203 static int connect_read(struct inode * inode, struct file * filp, char * buf, int count)
204 {
205 while (!PIPE_SIZE(*inode)) {
206 if (PIPE_WRITERS(*inode))
207 break;
208 if (filp->f_flags & O_NONBLOCK)
209 return -EAGAIN;
210 wake_up_interruptible(& PIPE_WAIT(*inode));
211 if (current->signal & ~current->blocked)
212 return -ERESTARTSYS;
213 interruptible_sleep_on(& PIPE_WAIT(*inode));
214 }
215 filp->f_op = &read_fifo_fops;
216 return pipe_read(inode,filp,buf,count);
217 }
218
219 static int connect_select(struct inode * inode, struct file * filp, int sel_type, select_table * wait)
220 {
221 switch (sel_type) {
222 case SEL_IN:
223 if (!PIPE_EMPTY(*inode)) {
224 filp->f_op = &read_fifo_fops;
225 return 1;
226 }
227 select_wait(&PIPE_WAIT(*inode), wait);
228 return 0;
229 case SEL_OUT:
230 if (!PIPE_FULL(*inode))
231 return 1;
232 select_wait(&PIPE_WAIT(*inode), wait);
233 return 0;
234 case SEL_EX:
235 if (!PIPE_READERS(*inode) || !PIPE_WRITERS(*inode))
236 return 1;
237 select_wait(&inode->i_wait,wait);
238 return 0;
239 }
240 return 0;
241 }
242
243 static void pipe_read_release(struct inode * inode, struct file * filp)
244 {
245 PIPE_READERS(*inode)--;
246 wake_up_interruptible(&PIPE_WAIT(*inode));
247 }
248
249 static void pipe_write_release(struct inode * inode, struct file * filp)
250 {
251 PIPE_WRITERS(*inode)--;
252 wake_up_interruptible(&PIPE_WAIT(*inode));
253 }
254
255 static void pipe_rdwr_release(struct inode * inode, struct file * filp)
256 {
257 PIPE_READERS(*inode)--;
258 PIPE_WRITERS(*inode)--;
259 wake_up_interruptible(&PIPE_WAIT(*inode));
260 }
261
262 static int pipe_read_open(struct inode * inode, struct file * filp)
263 {
264 PIPE_READERS(*inode)++;
265 return 0;
266 }
267
268 static int pipe_write_open(struct inode * inode, struct file * filp)
269 {
270 PIPE_WRITERS(*inode)++;
271 return 0;
272 }
273
274 static int pipe_rdwr_open(struct inode * inode, struct file * filp)
275 {
276 PIPE_READERS(*inode)++;
277 PIPE_WRITERS(*inode)++;
278 return 0;
279 }
280
281
282
283
284
285 struct file_operations connecting_fifo_fops = {
286 pipe_lseek,
287 connect_read,
288 bad_pipe_w,
289 NULL,
290 connect_select,
291 pipe_ioctl,
292 NULL,
293 pipe_read_open,
294 pipe_read_release,
295 NULL
296 };
297
298 struct file_operations read_fifo_fops = {
299 pipe_lseek,
300 pipe_read,
301 bad_pipe_w,
302 NULL,
303 fifo_select,
304 pipe_ioctl,
305 NULL,
306 pipe_read_open,
307 pipe_read_release,
308 NULL
309 };
310
311 struct file_operations write_fifo_fops = {
312 pipe_lseek,
313 bad_pipe_r,
314 pipe_write,
315 NULL,
316 fifo_select,
317 pipe_ioctl,
318 NULL,
319 pipe_write_open,
320 pipe_write_release,
321 NULL
322 };
323
324 struct file_operations rdwr_fifo_fops = {
325 pipe_lseek,
326 pipe_read,
327 pipe_write,
328 NULL,
329 fifo_select,
330 pipe_ioctl,
331 NULL,
332 pipe_rdwr_open,
333 pipe_rdwr_release,
334 NULL
335 };
336
337 struct file_operations read_pipe_fops = {
338 pipe_lseek,
339 pipe_read,
340 bad_pipe_w,
341 NULL,
342 pipe_select,
343 pipe_ioctl,
344 NULL,
345 pipe_read_open,
346 pipe_read_release,
347 NULL
348 };
349
350 struct file_operations write_pipe_fops = {
351 pipe_lseek,
352 bad_pipe_r,
353 pipe_write,
354 NULL,
355 pipe_select,
356 pipe_ioctl,
357 NULL,
358 pipe_write_open,
359 pipe_write_release,
360 NULL
361 };
362
363 struct file_operations rdwr_pipe_fops = {
364 pipe_lseek,
365 pipe_read,
366 pipe_write,
367 NULL,
368 pipe_select,
369 pipe_ioctl,
370 NULL,
371 pipe_rdwr_open,
372 pipe_rdwr_release,
373 NULL
374 };
375
376 struct inode_operations pipe_inode_operations = {
377 &rdwr_pipe_fops,
378 NULL,
379 NULL,
380 NULL,
381 NULL,
382 NULL,
383 NULL,
384 NULL,
385 NULL,
386 NULL,
387 NULL,
388 NULL,
389 NULL,
390 NULL,
391 NULL,
392 NULL,
393 NULL
394 };
395
396 int do_pipe(int *fd)
397 {
398 struct inode * inode;
399 struct file *f[2];
400 int i,j;
401
402 inode = get_pipe_inode();
403 if (!inode)
404 return -ENFILE;
405
406 for(j=0 ; j<2 ; j++)
407 if (!(f[j] = get_empty_filp()))
408 break;
409 if (j < 2) {
410 iput(inode);
411 if (j)
412 f[0]->f_count--;
413 return -ENFILE;
414 }
415 j=0;
416 for(i=0;j<2 && i<NR_OPEN && i<current->rlim[RLIMIT_NOFILE].rlim_cur;i++)
417 if (!current->files->fd[i]) {
418 current->files->fd[ fd[j]=i ] = f[j];
419 j++;
420 }
421 if (j<2) {
422 iput(inode);
423 f[0]->f_count--;
424 f[1]->f_count--;
425 if (j)
426 current->files->fd[fd[0]] = NULL;
427 return -EMFILE;
428 }
429 f[0]->f_inode = f[1]->f_inode = inode;
430 f[0]->f_pos = f[1]->f_pos = 0;
431 f[0]->f_flags = O_RDONLY;
432 f[0]->f_op = &read_pipe_fops;
433 f[0]->f_mode = 1;
434 f[1]->f_flags = O_WRONLY;
435 f[1]->f_op = &write_pipe_fops;
436 f[1]->f_mode = 2;
437 return 0;
438 }