|
|
1.1 ! root 1: #include <signal.h> ! 2: ! 3: #include <linux/sched.h> ! 4: #include <linux/mm.h> /* for get_free_page */ ! 5: #include <asm/segment.h> ! 6: ! 7: int read_pipe(struct m_inode * inode, char * buf, int count) ! 8: { ! 9: char * b=buf; ! 10: ! 11: while (PIPE_EMPTY(*inode)) { ! 12: wake_up(&inode->i_wait); ! 13: if (inode->i_count != 2) /* are there any writers left? */ ! 14: return 0; ! 15: sleep_on(&inode->i_wait); ! 16: } ! 17: while (count>0 && !(PIPE_EMPTY(*inode))) { ! 18: count --; ! 19: put_fs_byte(((char *)inode->i_size)[PIPE_TAIL(*inode)],b++); ! 20: INC_PIPE( PIPE_TAIL(*inode) ); ! 21: } ! 22: wake_up(&inode->i_wait); ! 23: return b-buf; ! 24: } ! 25: ! 26: int write_pipe(struct m_inode * inode, char * buf, int count) ! 27: { ! 28: char * b=buf; ! 29: ! 30: wake_up(&inode->i_wait); ! 31: if (inode->i_count != 2) { /* no readers */ ! 32: current->signal |= (1<<(SIGPIPE-1)); ! 33: return -1; ! 34: } ! 35: while (count-->0) { ! 36: while (PIPE_FULL(*inode)) { ! 37: wake_up(&inode->i_wait); ! 38: if (inode->i_count != 2) { ! 39: current->signal |= (1<<(SIGPIPE-1)); ! 40: return b-buf; ! 41: } ! 42: sleep_on(&inode->i_wait); ! 43: } ! 44: ((char *)inode->i_size)[PIPE_HEAD(*inode)] = get_fs_byte(b++); ! 45: INC_PIPE( PIPE_HEAD(*inode) ); ! 46: wake_up(&inode->i_wait); ! 47: } ! 48: wake_up(&inode->i_wait); ! 49: return b-buf; ! 50: } ! 51: ! 52: int sys_pipe(unsigned long * fildes) ! 53: { ! 54: struct m_inode * inode; ! 55: struct file * f[2]; ! 56: int fd[2]; ! 57: int i,j; ! 58: ! 59: j=0; ! 60: for(i=0;j<2 && i<NR_FILE;i++) ! 61: if (!file_table[i].f_count) ! 62: (f[j++]=i+file_table)->f_count++; ! 63: if (j==1) ! 64: f[0]->f_count=0; ! 65: if (j<2) ! 66: return -1; ! 67: j=0; ! 68: for(i=0;j<2 && i<NR_OPEN;i++) ! 69: if (!current->filp[i]) { ! 70: current->filp[ fd[j]=i ] = f[j]; ! 71: j++; ! 72: } ! 73: if (j==1) ! 74: current->filp[fd[0]]=NULL; ! 75: if (j<2) { ! 76: f[0]->f_count=f[1]->f_count=0; ! 77: return -1; ! 78: } ! 79: if (!(inode=get_pipe_inode())) { ! 80: current->filp[fd[0]] = ! 81: current->filp[fd[1]] = NULL; ! 82: f[0]->f_count = f[1]->f_count = 0; ! 83: return -1; ! 84: } ! 85: f[0]->f_inode = f[1]->f_inode = inode; ! 86: f[0]->f_pos = f[1]->f_pos = 0; ! 87: f[0]->f_mode = 1; /* read */ ! 88: f[1]->f_mode = 2; /* write */ ! 89: put_fs_long(fd[0],0+fildes); ! 90: put_fs_long(fd[1],1+fildes); ! 91: return 0; ! 92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.