1 /*
2 * linux/fs/stat.c
3 *
4 * (C) 1991 Linus Torvalds
5 */
6
7 #include <errno.h> // �����ͷ�ļ�������ϵͳ�и��ֳ����š�
8 #include <sys/stat.h> // �ļ�״̬ͷ�ļ��������ļ�״̬�ṹstat{}�ͳ�����
9
10 #include <linux/fs.h> // �ļ�ϵͳͷ�ļ��������ļ����ṹ��file��m_inode���ȡ�
11 #include <linux/sched.h> // ���ȳ���ͷ�ļ�������������ṹtask_struct������0���ݵȡ�
12 #include <linux/kernel.h> // �ں�ͷ�ļ�������һЩ�ں˳��ú�����ԭ�ζ��塣
13 #include <asm/segment.h> // �β���ͷ�ļ����������йضμĴ���������Ƕ��ʽ��ຯ����
14
//// �����ļ�״̬��Ϣ��
// ����inode���ļ�i�ڵ㣬statbuf���û����ݿռ���stat�ļ�״̬�ṹָ�룬���ڴ��ȡ
// �õ�״̬��Ϣ��
15 static void cp_stat(struct m_inode * inode, struct stat * statbuf)
16 {
17 struct stat tmp;
18 int i;
19
// ������֤(�����)������ݵ��ڴ�ռ䡣Ȼ����ʱ������Ӧ�ڵ��ϵ���Ϣ��
20 verify_area(statbuf,sizeof (struct stat));
21 tmp.st_dev = inode->i_dev; // �ļ����ڵ��豸�š�
22 tmp.st_ino = inode->i_num; // �ļ�i�ڵ�š�
23 tmp.st_mode = inode->i_mode; // �ļ����ԡ�
24 tmp.st_nlink = inode->i_nlinks; // ���������
25 tmp.st_uid = inode->i_uid; // �ļ����û�ID��
26 tmp.st_gid = inode->i_gid; // �����ID��
27 tmp.st_rdev = inode->i_zone[0]; // �豸�ţ����������ַ��ļ�����豸�ļ�����
28 tmp.st_size = inode->i_size; // �ļ��ֽڳ��ȣ�����ļ��dz����ļ�����
29 tmp.st_atime = inode->i_atime; // ������ʱ�䡣
30 tmp.st_mtime = inode->i_mtime; // �����ʱ�䡣
31 tmp.st_ctime = inode->i_ctime; // ���i�ڵ���ʱ�䡣
// �����Щ״̬��Ϣ���Ƶ��û��������С�
32 for (i=0 ; i<sizeof (tmp) ; i++)
33 put_fs_byte(((char *) &tmp)[i],i + (char *) statbuf);
34 }
35
//// �ļ�״̬ϵͳ���á�
// ���ݸ������ļ�����ȡ����ļ�״̬��Ϣ��
// ����filename��ָ�����ļ�����statbuf�Ǵ��״̬��Ϣ�Ļ�����ָ�롣
// ���أ��ɹ�����0���������س����롣
36 int sys_stat(char * filename, struct stat * statbuf)
37 {
38 struct m_inode * inode;
39
// ���ȸ����ļ����ҳ���Ӧ��i�ڵ㡣Ȼ��i�ڵ��ϵ��ļ�״̬��Ϣ���Ƶ��û��������У�
// ���Żظ�i�ڵ㡣
40 if (!(inode=namei(filename)))
41 return -ENOENT;
42 cp_stat(inode,statbuf);
43 iput(inode);
44 return 0;
45 }
46
//// �ļ�״̬ϵͳ���á�
// ���ݸ������ļ�����ȡ����ļ�״̬��Ϣ���ļ�·�������з��������ļ�������ȡ�����ļ�
// ��״̬��
// ����filename��ָ�����ļ�����statbuf�Ǵ��״̬��Ϣ�Ļ�����ָ�롣
// ���أ��ɹ�����0���������س����롣
47 int sys_lstat(char * filename, struct stat * statbuf)
48 {
49 struct m_inode * inode;
50
// ���ȸ����ļ����ҳ���Ӧ��i�ڵ㡣Ȼ��i�ڵ��ϵ��ļ�״̬��Ϣ���Ƶ��û��������У�
// ���Żظ�i�ڵ㡣
51 if (!(inode = lnamei(filename))) // ȡָ��·����i�ڵ㣬������������ӡ�
52 return -ENOENT;
53 cp_stat(inode,statbuf);
54 iput(inode);
55 return 0;
56 }
57
//// �ļ�״̬ϵͳ���á�
// ���ݸ������ļ������ȡ����ļ�״̬��Ϣ��
// ����fd��ָ���ļ��ľ��(������)��statbuf�Ǵ��״̬��Ϣ�Ļ�����ָ�롣
// ���أ��ɹ�����0���������س����롣
58 int sys_fstat(unsigned int fd, struct stat * statbuf)
59 {
60 struct file * f;
61 struct m_inode * inode;
62
// ����ȡ�ļ������Ӧ���ļ��ṹ��Ȼ����еõ��ļ���i�ڵ㡣Ȼ��i�ڵ��ϵ��ļ�״
// ̬��Ϣ���Ƶ��û��������С�����ļ����ֵ����һ�����������ļ���NR_OPEN����
// �߸þ�����ļ��ṹָ��Ϊ�գ����߶�Ӧ�ļ��ṹ��i�ڵ��ֶ�Ϊ�գ�����������س���
// �벢�˳���
63 if (fd >= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode))
64 return -EBADF;
65 cp_stat(inode,statbuf);
66 return 0;
67 }
68
//// �����������ļ�ϵͳ���á�
// �õ��ö�ȡ���������ļ������ݣ����÷���������ָ���ļ���·�����ַ����������ŵ�ָ��
// ���ȵ��û��������С���������̫С���ͻ�ضϷ������ӵ����ݡ�
// ������path -- ���������ļ�·������buf -- �û���������bufsiz -- ���������ȡ�
// ���أ��ɹ��ط��뻺�����е��ַ�������ʧ���س����롣
69 int sys_readlink(const char * path, char * buf, int bufsiz)
70 {
71 struct m_inode * inode;
72 struct buffer_head * bh;
73 int i;
74 char c;
75
// ���ȼ�����֤������������Ч�ԣ���������е������û��������ֽڳ���bufsi������
// 1--1023֮�䡣Ȼ��ȡ�÷��������ļ�����i�ڵ㣬����ȡ���ļ��ĵ�1���������ݡ�֮
// ��Ż�i�ڵ㡣
76 if (bufsiz <= 0)
77 return -EBADF;
78 if (bufsiz > 1023)
79 bufsiz = 1023;
80 verify_area(buf,bufsiz);
81 if (!(inode = lnamei(path)))
82 return -ENOENT;
83 if (inode->i_zone[0])
84 bh = bread(inode->i_dev, inode->i_zone[0]);
85 else
86 bh = NULL;
87 iput(inode);
// �����ȡ�ļ��������ݳɹ�����������и������bufsiz���ַ����û��������С�������
// NULL�ַ�������ͷŻ���飬�����ظ��Ƶ��ֽ�����
88 if (!bh)
89 return 0;
90 i = 0;
91 while (i<bufsiz && (c = bh->b_data[i])) {
92 i++;
93 put_fs_byte(c,buf++);
94 }
95 brelse(bh);
96 return i;
97 }
98