コード例 #1
0
ファイル: readdir.c プロジェクト: Mellvik/elks
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;
}
コード例 #2
0
ファイル: read_write.c プロジェクト: Edwin-Edward/elks
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;
}