OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [before_ORP/] [uclinux/] [uClinux-2.0.x/] [fs/] [minix/] [dir.c] - Diff between revs 901 and 1765

Only display areas with differences | Details | Blame | View Log

Rev 901 Rev 1765
/*
/*
 *  linux/fs/minix/dir.c
 *  linux/fs/minix/dir.c
 *
 *
 *  Copyright (C) 1991, 1992 Linus Torvalds
 *  Copyright (C) 1991, 1992 Linus Torvalds
 *
 *
 *  minix directory handling functions
 *  minix directory handling functions
 */
 */
 
 
#include <linux/string.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/fs.h>
#include <linux/minix_fs.h>
#include <linux/minix_fs.h>
#include <linux/stat.h>
#include <linux/stat.h>
 
 
#include <asm/segment.h>
#include <asm/segment.h>
 
 
static int minix_dir_read(struct inode * inode, struct file * filp, char * buf, int count)
static int minix_dir_read(struct inode * inode, struct file * filp, char * buf, int count)
{
{
        return -EISDIR;
        return -EISDIR;
}
}
 
 
static int minix_readdir(struct inode *, struct file *, void *, filldir_t);
static int minix_readdir(struct inode *, struct file *, void *, filldir_t);
 
 
static struct file_operations minix_dir_operations = {
static struct file_operations minix_dir_operations = {
        NULL,                   /* lseek - default */
        NULL,                   /* lseek - default */
        minix_dir_read,         /* read */
        minix_dir_read,         /* read */
        NULL,                   /* write - bad */
        NULL,                   /* write - bad */
        minix_readdir,          /* readdir */
        minix_readdir,          /* readdir */
        NULL,                   /* select - default */
        NULL,                   /* select - default */
        NULL,                   /* ioctl - default */
        NULL,                   /* ioctl - default */
        NULL,                   /* mmap */
        NULL,                   /* mmap */
        NULL,                   /* no special open code */
        NULL,                   /* no special open code */
        NULL,                   /* no special release code */
        NULL,                   /* no special release code */
        file_fsync              /* default fsync */
        file_fsync              /* default fsync */
};
};
 
 
/*
/*
 * directories can handle most operations...
 * directories can handle most operations...
 */
 */
struct inode_operations minix_dir_inode_operations = {
struct inode_operations minix_dir_inode_operations = {
        &minix_dir_operations,  /* default directory file-ops */
        &minix_dir_operations,  /* default directory file-ops */
        minix_create,           /* create */
        minix_create,           /* create */
        minix_lookup,           /* lookup */
        minix_lookup,           /* lookup */
        minix_link,             /* link */
        minix_link,             /* link */
        minix_unlink,           /* unlink */
        minix_unlink,           /* unlink */
        minix_symlink,          /* symlink */
        minix_symlink,          /* symlink */
        minix_mkdir,            /* mkdir */
        minix_mkdir,            /* mkdir */
        minix_rmdir,            /* rmdir */
        minix_rmdir,            /* rmdir */
        minix_mknod,            /* mknod */
        minix_mknod,            /* mknod */
        minix_rename,           /* rename */
        minix_rename,           /* rename */
        NULL,                   /* readlink */
        NULL,                   /* readlink */
        NULL,                   /* follow_link */
        NULL,                   /* follow_link */
        NULL,                   /* readpage */
        NULL,                   /* readpage */
        NULL,                   /* writepage */
        NULL,                   /* writepage */
        NULL,                   /* bmap */
        NULL,                   /* bmap */
        minix_truncate,         /* truncate */
        minix_truncate,         /* truncate */
        NULL                    /* permission */
        NULL                    /* permission */
};
};
 
 
static int minix_readdir(struct inode * inode, struct file * filp,
static int minix_readdir(struct inode * inode, struct file * filp,
        void * dirent, filldir_t filldir)
        void * dirent, filldir_t filldir)
{
{
        unsigned int offset;
        unsigned int offset;
        struct buffer_head * bh;
        struct buffer_head * bh;
        struct minix_dir_entry * de;
        struct minix_dir_entry * de;
        struct minix_sb_info * info;
        struct minix_sb_info * info;
 
 
        if (!inode || !inode->i_sb || !S_ISDIR(inode->i_mode))
        if (!inode || !inode->i_sb || !S_ISDIR(inode->i_mode))
                return -EBADF;
                return -EBADF;
        info = &inode->i_sb->u.minix_sb;
        info = &inode->i_sb->u.minix_sb;
        if (filp->f_pos & (info->s_dirsize - 1))
        if (filp->f_pos & (info->s_dirsize - 1))
                return -EBADF;
                return -EBADF;
        while (filp->f_pos < inode->i_size) {
        while (filp->f_pos < inode->i_size) {
                offset = filp->f_pos & 1023;
                offset = filp->f_pos & 1023;
                bh = minix_bread(inode,(filp->f_pos)>>BLOCK_SIZE_BITS,0);
                bh = minix_bread(inode,(filp->f_pos)>>BLOCK_SIZE_BITS,0);
                if (!bh) {
                if (!bh) {
                        filp->f_pos += 1024-offset;
                        filp->f_pos += 1024-offset;
                        continue;
                        continue;
                }
                }
                do {
                do {
                        de = (struct minix_dir_entry *) (offset + bh->b_data);
                        de = (struct minix_dir_entry *) (offset + bh->b_data);
                        if (de->inode) {
                        if (de->inode) {
                                int size = strnlen(de->name, info->s_namelen);
                                int size = strnlen(de->name, info->s_namelen);
                                if (filldir(dirent, de->name, size, filp->f_pos, de->inode) < 0) {
                                if (filldir(dirent, de->name, size, filp->f_pos, de->inode) < 0) {
                                        brelse(bh);
                                        brelse(bh);
                                        return 0;
                                        return 0;
                                }
                                }
                        }
                        }
                        offset += info->s_dirsize;
                        offset += info->s_dirsize;
                        filp->f_pos += info->s_dirsize;
                        filp->f_pos += info->s_dirsize;
                } while (offset < 1024 && filp->f_pos < inode->i_size);
                } while (offset < 1024 && filp->f_pos < inode->i_size);
                brelse(bh);
                brelse(bh);
        }
        }
        return 0;
        return 0;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.