|
|
1.1 ! root 1: /* ! 2: * linux/fs/fifo.c ! 3: * ! 4: * written by Paul H. Hargrove ! 5: */ ! 6: ! 7: #include <errno.h> ! 8: ! 9: #include <linux/fcntl.h> ! 10: #include <linux/sched.h> ! 11: #include <linux/kernel.h> ! 12: ! 13: extern struct file_operations read_pipe_fops; ! 14: extern struct file_operations write_pipe_fops; ! 15: extern struct file_operations rdwr_pipe_fops; ! 16: ! 17: static int fifo_open(struct inode * inode,struct file * filp) ! 18: { ! 19: int retval = 0; ! 20: unsigned long page; ! 21: ! 22: switch( filp->f_mode ) { ! 23: ! 24: case 1: ! 25: /* ! 26: * O_RDONLY ! 27: * POSIX.1 says that O_NONBLOCK means return with the FIFO ! 28: * opened, even when there is no process writing the FIFO. ! 29: */ ! 30: filp->f_op = &read_pipe_fops; ! 31: PIPE_READERS(*inode)++; ! 32: if (!(filp->f_flags & O_NONBLOCK)) ! 33: while (!PIPE_WRITERS(*inode)) { ! 34: if (PIPE_HEAD(*inode) != PIPE_TAIL(*inode)) ! 35: break; ! 36: if (current->signal & ~current->blocked) { ! 37: retval = -ERESTARTSYS; ! 38: break; ! 39: } ! 40: interruptible_sleep_on(&PIPE_READ_WAIT(*inode)); ! 41: } ! 42: if (retval) ! 43: PIPE_READERS(*inode)--; ! 44: break; ! 45: ! 46: case 2: ! 47: /* ! 48: * O_WRONLY ! 49: * POSIX.1 says that O_NONBLOCK means return -1 with ! 50: * errno=ENXIO when there is no process reading the FIFO. ! 51: */ ! 52: if ((filp->f_flags & O_NONBLOCK) && !PIPE_READERS(*inode)) { ! 53: retval = -ENXIO; ! 54: break; ! 55: } ! 56: filp->f_op = &write_pipe_fops; ! 57: PIPE_WRITERS(*inode)++; ! 58: while (!PIPE_READERS(*inode)) { ! 59: if (current->signal & ~current->blocked) { ! 60: retval = -ERESTARTSYS; ! 61: break; ! 62: } ! 63: interruptible_sleep_on(&PIPE_WRITE_WAIT(*inode)); ! 64: } ! 65: if (retval) ! 66: PIPE_WRITERS(*inode)--; ! 67: break; ! 68: ! 69: case 3: ! 70: /* ! 71: * O_RDWR ! 72: * POSIX.1 leaves this case "undefined" when O_NONBLOCK is set. ! 73: * This implementation will NEVER block on a O_RDWR open, since ! 74: * the process can at least talk to itself. ! 75: */ ! 76: filp->f_op = &rdwr_pipe_fops; ! 77: PIPE_WRITERS(*inode) += 1; ! 78: PIPE_READERS(*inode) += 1; ! 79: break; ! 80: ! 81: default: ! 82: retval = -EINVAL; ! 83: } ! 84: if (PIPE_WRITERS(*inode)) ! 85: wake_up(&PIPE_READ_WAIT(*inode)); ! 86: if (PIPE_READERS(*inode)) ! 87: wake_up(&PIPE_WRITE_WAIT(*inode)); ! 88: if (retval || inode->i_size) ! 89: return retval; ! 90: page = get_free_page(); ! 91: if (inode->i_size) { ! 92: free_page(page); ! 93: return 0; ! 94: } ! 95: if (!page) ! 96: return -ENOMEM; ! 97: inode->i_size = page; ! 98: return 0; ! 99: } ! 100: ! 101: /* ! 102: * Dummy default file-operations: the only thing this does ! 103: * is contain the open that then fills in the correct operations ! 104: * depending on the access mode of the file... ! 105: */ ! 106: struct file_operations def_fifo_fops = { ! 107: NULL, ! 108: NULL, ! 109: NULL, ! 110: NULL, ! 111: NULL, ! 112: NULL, ! 113: fifo_open, /* will set read or write pipe_fops */ ! 114: NULL ! 115: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.