static int fillonedir(register char *__buf, char *name, size_t namlen, off_t offset, ino_t ino) { register struct linux_dirent *dirent; if (((struct readdir_callback *)__buf)->count) return -EINVAL; ((struct readdir_callback *)__buf)->count++; dirent = ((struct readdir_callback *)__buf)->dirent; put_user_long((__u32)ino, &dirent->d_ino); put_user_long((__u32) offset, &dirent->d_offset); put_user((__u16) namlen, &dirent->d_namlen); memcpy_tofs(dirent->d_name, name, namlen); put_user_char(0, dirent->d_name + namlen); return 0; }
loff_t sys_lseek(unsigned int fd, loff_t * p_offset, unsigned int origin) { register struct file *file; register struct file_operations *fop; loff_t offset, tmp; offset = (loff_t) get_user_long(p_offset); if (fd >= NR_OPEN || !(file = current->files.fd[fd]) || !(file->f_inode)) return -EBADF; if (origin > 2) return -EINVAL; fop = file->f_op; if (fop && fop->lseek) return fop->lseek(file->f_inode, file, offset, origin); /* this is the default handler if no lseek handler is present */ /* Note: We already determined above that origin is in range. */ if (origin == 2) { if (!file->f_inode) return -EINVAL; tmp = file->f_inode->i_size + offset; } else { tmp = (!origin) ? offset : file->f_pos + offset; } if (tmp < 0) return -EINVAL; if (tmp != file->f_pos) { file->f_pos = tmp; #ifdef BLOAT_FS file->f_reada = 0; file->f_version = ++event; #endif } put_user_long((unsigned long int)tmp, (void *)p_offset); return 0; }