/* * linux/lib/update.c * * (C) 2021 Huan */ #include #include #include #include #include #include #include #include #include #include #define DIRBUF 8192 /* buffer size for fs-indep. dirs */ /* must in general be larger than the filesystem buffer size */ int sys_getdents(unsigned int fd, struct linux_dirent *d, unsigned int count) { struct linux_dirent tmp; struct file * file; struct m_inode * inode; struct buffer_head * block; struct dir_entry * ptr; char * buf; int inum; /*the "inum"st inode.*/ int dnum; /*the "dnum"st element of array "d".*/ int ld_size; int i; int result; ld_size = sizeof(struct linux_dirent); /*the size of struct "linux_dirent".(24)*/ file = current->filp[fd]; /*get the current file pointer we need.*/ if (fd >= NR_OPEN) return -EINVAL; /*shu zu yue jie*/ if (count == 0) return -1; /*the size of dirp is too small(0)*/ if (!file) return ENOTDIR; /*can't open file.*/ inode = file->f_inode; /*get the inode of this file.*/ block = bread(inode->i_dev,inode->i_zone[0]); /*get the block that storing inodes.*/ tmp.d_reclen = sizeof(tmp); /*the size of struct "linux_dirent".(24)*/ tmp.d_off = 0; /*useless*/ buf = &tmp; /*get the address of tmp.*/ dnum = 0; /*the "pian yi liang" of array "d".*/ for (inum = 0;(inum*sizeof(struct dir_entry))i_size;inum++) { if (dnum >= (count-ld_size)) return 0; /*shu zu "d" yue jie*/ ptr = (struct dir_entry *) (block->b_data + (inum*sizeof(struct dir_entry))); /*get the address of the next inode.*/ if (!ptr -> inode) continue; /*ignore current inode if it is empty.*/ tmp.d_ino = ptr -> inode; /*copy the inode into tmp.*/ for (i = 0; i < 14; i++) tmp.d_name[i] = ptr -> name[i]; /*copy current file name into tmp.*/ for (i = 0; i < tmp.d_reclen; i++){ put_fs_byte(*(buf+i),((char*)d)+i+dnum*tmp.d_reclen); /*copy tmp to array "d"(from kernal to user).*/ } dnum++; /*fill the next element of array "d".*/ } result = dnum*tmp.d_reclen; /*lenth of the array "d"*/ return result; } int sys_pipe2(int* fd, int flags){ if(flags == 0){ struct m_inode * inode; struct file * f[2]; int fp[2]; int i,j; j=0; for(i=0;j<2 && if_count++; if (j==1) f[0]->f_count=0; if (j<2) return -1; j=0; for(i=0;j<2 && ifilp[i]) { current->filp[ fp[j]=i ] = f[j]; j++; } if (j==1) current->filp[fp[0]]=NULL; if (j<2) { f[0]->f_count=f[1]->f_count=0; return -1; } if (!(inode=get_pipe_inode())) { current->filp[fp[0]] = current->filp[fp[1]] = NULL; f[0]->f_count = f[1]->f_count = 0; return -1; } f[0]->f_inode = f[1]->f_inode = inode; f[0]->f_pos = f[1]->f_pos = 0; f[0]->f_mode = 1; /* read */ f[1]->f_mode = 2; /* write */ put_fs_long(fp[0],0+fd); put_fs_long(fp[1],1+fd); return 0; } } int sys_sleep(unsigned int seconds){ sys_signal(SIGALRM,SIG_IGN,NULL); sys_alarm(seconds); pause(); return 0; }