fifo_vnops.c (64819) | fifo_vnops.c (72521) |
---|---|
1/* 2 * Copyright (c) 1990, 1993, 1995 3 * The Regents of the University of California. 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 --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)fifo_vnops.c 8.10 (Berkeley) 5/27/95 | 1/* 2 * Copyright (c) 1990, 1993, 1995 3 * The Regents of the University of California. 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 --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)fifo_vnops.c 8.10 (Berkeley) 5/27/95 |
34 * $FreeBSD: head/sys/fs/fifofs/fifo_vnops.c 64819 2000-08-18 10:01:02Z phk $ | 34 * $FreeBSD: head/sys/fs/fifofs/fifo_vnops.c 72521 2001-02-15 16:34:11Z jlemon $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/unistd.h> 40#include <sys/kernel.h> 41#include <sys/lock.h> 42#include <sys/malloc.h> --- 23 unchanged lines hidden (view full) --- 66static int fifo_print __P((struct vop_print_args *)); 67static int fifo_lookup __P((struct vop_lookup_args *)); 68static int fifo_open __P((struct vop_open_args *)); 69static int fifo_close __P((struct vop_close_args *)); 70static int fifo_read __P((struct vop_read_args *)); 71static int fifo_write __P((struct vop_write_args *)); 72static int fifo_ioctl __P((struct vop_ioctl_args *)); 73static int fifo_poll __P((struct vop_poll_args *)); | 35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/unistd.h> 40#include <sys/kernel.h> 41#include <sys/lock.h> 42#include <sys/malloc.h> --- 23 unchanged lines hidden (view full) --- 66static int fifo_print __P((struct vop_print_args *)); 67static int fifo_lookup __P((struct vop_lookup_args *)); 68static int fifo_open __P((struct vop_open_args *)); 69static int fifo_close __P((struct vop_close_args *)); 70static int fifo_read __P((struct vop_read_args *)); 71static int fifo_write __P((struct vop_write_args *)); 72static int fifo_ioctl __P((struct vop_ioctl_args *)); 73static int fifo_poll __P((struct vop_poll_args *)); |
74static int fifo_kqfilter __P((struct vop_kqfilter_args *)); |
|
74static int fifo_bmap __P((struct vop_bmap_args *)); 75static int fifo_pathconf __P((struct vop_pathconf_args *)); 76static int fifo_advlock __P((struct vop_advlock_args *)); 77 | 75static int fifo_bmap __P((struct vop_bmap_args *)); 76static int fifo_pathconf __P((struct vop_pathconf_args *)); 77static int fifo_advlock __P((struct vop_advlock_args *)); 78 |
78static int filt_fiforattach(struct knote *kn); | |
79static void filt_fifordetach(struct knote *kn); 80static int filt_fiforead(struct knote *kn, long hint); | 79static void filt_fifordetach(struct knote *kn); 80static int filt_fiforead(struct knote *kn, long hint); |
81static int filt_fifowattach(struct knote *kn); | |
82static void filt_fifowdetach(struct knote *kn); 83static int filt_fifowrite(struct knote *kn, long hint); 84 | 81static void filt_fifowdetach(struct knote *kn); 82static int filt_fifowrite(struct knote *kn, long hint); 83 |
85struct filterops fifo_rwfiltops[] = { 86 { 1, filt_fiforattach, filt_fifordetach, filt_fiforead }, 87 { 1, filt_fifowattach, filt_fifowdetach, filt_fifowrite }, 88}; | 84static struct filterops fiforead_filtops = 85 { 1, NULL, filt_fifordetach, filt_fiforead }; 86static struct filterops fifowrite_filtops = 87 { 1, NULL, filt_fifowdetach, filt_fifowrite }; |
89 90vop_t **fifo_vnodeop_p; 91static struct vnodeopv_entry_desc fifo_vnodeop_entries[] = { 92 { &vop_default_desc, (vop_t *) vop_defaultop }, 93 { &vop_access_desc, (vop_t *) vop_ebadf }, 94 { &vop_advlock_desc, (vop_t *) fifo_advlock }, 95 { &vop_bmap_desc, (vop_t *) fifo_bmap }, 96 { &vop_close_desc, (vop_t *) fifo_close }, --- 4 unchanged lines hidden (view full) --- 101 { &vop_lease_desc, (vop_t *) vop_null }, 102 { &vop_link_desc, (vop_t *) fifo_badop }, 103 { &vop_lookup_desc, (vop_t *) fifo_lookup }, 104 { &vop_mkdir_desc, (vop_t *) fifo_badop }, 105 { &vop_mknod_desc, (vop_t *) fifo_badop }, 106 { &vop_open_desc, (vop_t *) fifo_open }, 107 { &vop_pathconf_desc, (vop_t *) fifo_pathconf }, 108 { &vop_poll_desc, (vop_t *) fifo_poll }, | 88 89vop_t **fifo_vnodeop_p; 90static struct vnodeopv_entry_desc fifo_vnodeop_entries[] = { 91 { &vop_default_desc, (vop_t *) vop_defaultop }, 92 { &vop_access_desc, (vop_t *) vop_ebadf }, 93 { &vop_advlock_desc, (vop_t *) fifo_advlock }, 94 { &vop_bmap_desc, (vop_t *) fifo_bmap }, 95 { &vop_close_desc, (vop_t *) fifo_close }, --- 4 unchanged lines hidden (view full) --- 100 { &vop_lease_desc, (vop_t *) vop_null }, 101 { &vop_link_desc, (vop_t *) fifo_badop }, 102 { &vop_lookup_desc, (vop_t *) fifo_lookup }, 103 { &vop_mkdir_desc, (vop_t *) fifo_badop }, 104 { &vop_mknod_desc, (vop_t *) fifo_badop }, 105 { &vop_open_desc, (vop_t *) fifo_open }, 106 { &vop_pathconf_desc, (vop_t *) fifo_pathconf }, 107 { &vop_poll_desc, (vop_t *) fifo_poll }, |
108 { &vop_kqfilter_desc, (vop_t *) fifo_kqfilter }, |
|
109 { &vop_print_desc, (vop_t *) fifo_print }, 110 { &vop_read_desc, (vop_t *) fifo_read }, 111 { &vop_readdir_desc, (vop_t *) fifo_badop }, 112 { &vop_readlink_desc, (vop_t *) fifo_badop }, 113 { &vop_reallocblks_desc, (vop_t *) fifo_badop }, 114 { &vop_reclaim_desc, (vop_t *) vop_null }, 115 { &vop_remove_desc, (vop_t *) fifo_badop }, 116 { &vop_rename_desc, (vop_t *) fifo_badop }, --- 232 unchanged lines hidden (view full) --- 349 filetmp.f_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_writesock; 350 error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_p); 351 if (error) 352 return (error); 353 } 354 return (0); 355} 356 | 109 { &vop_print_desc, (vop_t *) fifo_print }, 110 { &vop_read_desc, (vop_t *) fifo_read }, 111 { &vop_readdir_desc, (vop_t *) fifo_badop }, 112 { &vop_readlink_desc, (vop_t *) fifo_badop }, 113 { &vop_reallocblks_desc, (vop_t *) fifo_badop }, 114 { &vop_reclaim_desc, (vop_t *) vop_null }, 115 { &vop_remove_desc, (vop_t *) fifo_badop }, 116 { &vop_rename_desc, (vop_t *) fifo_badop }, --- 232 unchanged lines hidden (view full) --- 349 filetmp.f_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_writesock; 350 error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_p); 351 if (error) 352 return (error); 353 } 354 return (0); 355} 356 |
357/* ARGSUSED */ |
|
357static int | 358static int |
358filt_fiforattach(struct knote *kn) | 359fifo_kqfilter(ap) 360 struct vop_kqfilter_args /* { 361 struct vnode *a_vp; 362 struct knote *a_kn; 363 } */ *ap; |
359{ | 364{ |
360 struct vnode *vn = (struct vnode *)kn->kn_fp->f_data; 361 struct socket *so = (struct socket *)vn->v_fifoinfo->fi_readsock; | 365 struct socket *so = (struct socket *)ap->a_vp->v_fifoinfo->fi_readsock; 366 struct sockbuf *sb; |
362 | 367 |
363 SLIST_INSERT_HEAD(&so->so_rcv.sb_sel.si_note, kn, kn_selnext); 364 so->so_rcv.sb_flags |= SB_KNOTE; | 368 switch (ap->a_kn->kn_filter) { 369 case EVFILT_READ: 370 ap->a_kn->kn_fop = &fiforead_filtops; 371 sb = &so->so_rcv; 372 break; 373 case EVFILT_WRITE: 374 ap->a_kn->kn_fop = &fifowrite_filtops; 375 sb = &so->so_snd; 376 break; 377 default: 378 return (1); 379 } 380 381 ap->a_kn->kn_hook = (caddr_t)so; 382 383 SLIST_INSERT_HEAD(&sb->sb_sel.si_note, ap->a_kn, kn_selnext); 384 sb->sb_flags |= SB_KNOTE; 385 |
365 return (0); 366} 367 368static void 369filt_fifordetach(struct knote *kn) 370{ | 386 return (0); 387} 388 389static void 390filt_fifordetach(struct knote *kn) 391{ |
371 struct vnode *vn = (struct vnode *)kn->kn_fp->f_data; 372 struct socket *so = (struct socket *)vn->v_fifoinfo->fi_readsock; | 392 struct socket *so = (struct socket *)kn->kn_hook; |
373 374 SLIST_REMOVE(&so->so_rcv.sb_sel.si_note, kn, knote, kn_selnext); 375 if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_note)) 376 so->so_rcv.sb_flags &= ~SB_KNOTE; 377} 378 379static int 380filt_fiforead(struct knote *kn, long hint) 381{ | 393 394 SLIST_REMOVE(&so->so_rcv.sb_sel.si_note, kn, knote, kn_selnext); 395 if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_note)) 396 so->so_rcv.sb_flags &= ~SB_KNOTE; 397} 398 399static int 400filt_fiforead(struct knote *kn, long hint) 401{ |
382 struct vnode *vn = (struct vnode *)kn->kn_fp->f_data; 383 struct socket *so = (struct socket *)vn->v_fifoinfo->fi_readsock; | 402 struct socket *so = (struct socket *)kn->kn_hook; |
384 385 kn->kn_data = so->so_rcv.sb_cc; 386 if (so->so_state & SS_CANTRCVMORE) { 387 kn->kn_flags |= EV_EOF; 388 return (1); 389 } 390 kn->kn_flags &= ~EV_EOF; 391 return (kn->kn_data > 0); 392} 393 | 403 404 kn->kn_data = so->so_rcv.sb_cc; 405 if (so->so_state & SS_CANTRCVMORE) { 406 kn->kn_flags |= EV_EOF; 407 return (1); 408 } 409 kn->kn_flags &= ~EV_EOF; 410 return (kn->kn_data > 0); 411} 412 |
394static int 395filt_fifowattach(struct knote *kn) 396{ 397 struct vnode *vn = (struct vnode *)kn->kn_fp->f_data; 398 struct socket *so = (struct socket *)vn->v_fifoinfo->fi_writesock; 399 400 SLIST_INSERT_HEAD(&so->so_snd.sb_sel.si_note, kn, kn_selnext); 401 so->so_rcv.sb_flags |= SB_KNOTE; 402 return (0); 403} 404 | |
405static void 406filt_fifowdetach(struct knote *kn) 407{ | 413static void 414filt_fifowdetach(struct knote *kn) 415{ |
408 struct vnode *vn = (struct vnode *)kn->kn_fp->f_data; 409 struct socket *so = (struct socket *)vn->v_fifoinfo->fi_readsock; | 416 struct socket *so = (struct socket *)kn->kn_hook; |
410 411 SLIST_REMOVE(&so->so_snd.sb_sel.si_note, kn, knote, kn_selnext); 412 if (SLIST_EMPTY(&so->so_snd.sb_sel.si_note)) 413 so->so_snd.sb_flags &= ~SB_KNOTE; 414} 415 416static int 417filt_fifowrite(struct knote *kn, long hint) 418{ | 417 418 SLIST_REMOVE(&so->so_snd.sb_sel.si_note, kn, knote, kn_selnext); 419 if (SLIST_EMPTY(&so->so_snd.sb_sel.si_note)) 420 so->so_snd.sb_flags &= ~SB_KNOTE; 421} 422 423static int 424filt_fifowrite(struct knote *kn, long hint) 425{ |
419 struct vnode *vn = (struct vnode *)kn->kn_fp->f_data; 420 struct socket *so = (struct socket *)vn->v_fifoinfo->fi_readsock; | 426 struct socket *so = (struct socket *)kn->kn_hook; |
421 422 kn->kn_data = sbspace(&so->so_snd); 423 if (so->so_state & SS_CANTSENDMORE) { 424 kn->kn_flags |= EV_EOF; 425 return (1); 426 } 427 kn->kn_flags &= ~EV_EOF; 428 return (kn->kn_data >= so->so_snd.sb_lowat); --- 181 unchanged lines hidden --- | 427 428 kn->kn_data = sbspace(&so->so_snd); 429 if (so->so_state & SS_CANTSENDMORE) { 430 kn->kn_flags |= EV_EOF; 431 return (1); 432 } 433 kn->kn_flags &= ~EV_EOF; 434 return (kn->kn_data >= so->so_snd.sb_lowat); --- 181 unchanged lines hidden --- |