|
|
1.1 root 1: /*
2: * linux/fs/minix/dir.c
3: *
4: * minix directory hadnling functions
5: */
6:
7: #include <errno.h>
8:
9: #include <sys/stat.h>
10:
11: #include <asm/segment.h>
12:
13: #include <linux/fs.h>
14: #include <linux/minix_fs.h>
15:
16: static int minix_readdir(struct inode *, struct file *, struct dirent *, int);
17:
18: static struct file_operations minix_dir_operations = {
19: NULL, /* lseek - default */
20: minix_file_read, /* read */
21: NULL, /* write - bad */
22: minix_readdir, /* readdir */
23: NULL, /* select - default */
24: NULL, /* ioctl - default */
25: NULL, /* no special open code */
26: NULL /* no special release code */
27: };
28:
29: /*
30: * directories can handle most operations...
31: */
32: struct inode_operations minix_dir_inode_operations = {
33: &minix_dir_operations, /* default directory file-ops */
34: minix_create, /* create */
35: minix_lookup, /* lookup */
36: minix_link, /* link */
37: minix_unlink, /* unlink */
38: minix_symlink, /* symlink */
39: minix_mkdir, /* mkdir */
40: minix_rmdir, /* rmdir */
41: minix_mknod, /* mknod */
42: minix_rename, /* rename */
43: NULL, /* readlink */
44: NULL, /* follow_link */
45: minix_bmap, /* bmap */
46: minix_truncate /* truncate */
47: };
48:
49: static int minix_readdir(struct inode * inode, struct file * filp,
50: struct dirent * dirent, int count)
51: {
52: unsigned int block,offset,i;
53: char c;
54: struct buffer_head * bh;
55: struct minix_dir_entry * de;
56:
57: if (!inode || !S_ISDIR(inode->i_mode))
58: return -EBADF;
59: if (filp->f_pos & (sizeof (struct minix_dir_entry) - 1))
60: return -EBADF;
61: while (filp->f_pos < inode->i_size) {
62: offset = filp->f_pos & 1023;
63: block = minix_bmap(inode,(filp->f_pos)>>BLOCK_SIZE_BITS);
64: if (!block || !(bh = bread(inode->i_dev,block))) {
65: filp->f_pos += 1024-offset;
66: continue;
67: }
68: de = (struct minix_dir_entry *) (offset + bh->b_data);
69: while (offset < 1024 && filp->f_pos < inode->i_size) {
70: offset += sizeof (struct minix_dir_entry);
71: filp->f_pos += sizeof (struct minix_dir_entry);
72: if (de->inode) {
73: for (i = 0; i < MINIX_NAME_LEN; i++)
74: if (c = de->name[i])
75: put_fs_byte(c,i+dirent->d_name);
76: else
77: break;
78: if (i) {
79: put_fs_long(de->inode,&dirent->d_ino);
80: put_fs_byte(0,i+dirent->d_name);
81: put_fs_word(i,&dirent->d_reclen);
82: brelse(bh);
83: return i;
84: }
85: }
86: de++;
87: }
88: brelse(bh);
89: }
90: return 0;
91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.