����12-15 linux/fs/stat.c


  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