This source file includes following definitions.
- ext_readdir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <asm/segment.h>
16
17 #include <linux/errno.h>
18 #include <linux/kernel.h>
19 #include <linux/fs.h>
20 #include <linux/ext_fs.h>
21 #include <linux/stat.h>
22
23 static int ext_readdir(struct inode *, struct file *, struct dirent *, int);
24
25 static struct file_operations ext_dir_operations = {
26 NULL,
27 NULL,
28 NULL,
29 ext_readdir,
30 NULL,
31 NULL,
32 NULL,
33 NULL
34 };
35
36
37
38
39 struct inode_operations ext_dir_inode_operations = {
40 &ext_dir_operations,
41 ext_create,
42 ext_lookup,
43 ext_link,
44 ext_unlink,
45 ext_symlink,
46 ext_mkdir,
47 ext_rmdir,
48 ext_mknod,
49 ext_rename,
50 NULL,
51 NULL,
52 NULL,
53 ext_truncate
54 };
55
56 static int ext_readdir(struct inode * inode, struct file * filp,
57 struct dirent * dirent, int count)
58 {
59 unsigned int offset,i;
60 char c;
61 struct buffer_head * bh;
62 struct ext_dir_entry * de;
63
64 if (!inode || !S_ISDIR(inode->i_mode))
65 return -EBADF;
66 while (filp->f_pos < inode->i_size) {
67 offset = filp->f_pos & 1023;
68 bh = ext_bread(inode,(filp->f_pos)>>BLOCK_SIZE_BITS,0);
69 if (!bh) {
70 filp->f_pos += 1024-offset;
71 continue;
72 }
73 de = (struct ext_dir_entry *) (offset + bh->b_data);
74 while (offset < 1024 && filp->f_pos < inode->i_size) {
75 offset += de->rec_len;
76 filp->f_pos += de->rec_len;
77 if (de->rec_len < 8 || de->rec_len % 4 != 0 ||
78 de->rec_len < de->name_len + 8) {
79 printk ("ext_readdir: bad directory entry\n");
80 printk ("dev=%d, dir=%d, offset=%d, rec_len=%d, name_len=%d\n",
81 inode->i_dev, inode->i_ino, offset, de->rec_len, de->name_len);
82 return 0;
83 }
84 if (de->inode) {
85 for (i = 0; i < de->name_len; i++)
86 if (c = de->name[i])
87 put_fs_byte(c,i+dirent->d_name);
88 else
89 break;
90 if (i) {
91 put_fs_long(de->inode,&dirent->d_ino);
92 put_fs_byte(0,i+dirent->d_name);
93 put_fs_word(i,&dirent->d_reclen);
94 brelse(bh);
95 return i;
96 }
97 }
98 de = (struct ext_dir_entry *) ((char *) de
99 + de->rec_len);
100 }
101 brelse(bh);
102 }
103 return 0;
104 }