Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581185
  • 博文数量: 137
  • 博客积分: 4040
  • 博客等级: 上校
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-08 13:05
文章分类

全部博文(137)

文章存档

2011年(10)

2010年(23)

2009年(104)

分类: LINUX

2009-08-19 15:04:53

/*
 * linux/fs/stat.c
 *
 * (C) 1991 Linus Torvalds
 */


#include <errno.h>
#include <sys/stat.h>

#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <asm/segment.h>

static void cp_stat(struct m_inode * inode, struct stat * statbuf)// 复制文件状态信息

{// 参数inode 是文件对应的i 节点,statbuf 是stat 文件状态结构指针,用于存放取得的状态信息

    struct stat tmp;
    int i;

    verify_area(statbuf,sizeof (* statbuf));//验证(或分配)存放数据的内存空间

    tmp.st_dev = inode->i_dev;// 文件所在的设备号

    tmp.st_ino = inode->i_num;// 文件i 节点号

    tmp.st_mode = inode->i_mode;// 文件属性

    tmp.st_nlink = inode->i_nlinks; // 文件的连接数

    tmp.st_uid = inode->i_uid;// 文件的用户id

    tmp.st_gid = inode->i_gid;// 文件的组id

    tmp.st_rdev = inode->i_zone[0];// 设备号(如果文件是特殊的字符文件或块文件)

    tmp.st_size = inode->i_size;// 文件大小(字节数)(如果文件是常规文件)

    tmp.st_atime = inode->i_atime;// 最后访问时间

    tmp.st_mtime = inode->i_mtime;// 最后修改时间

    tmp.st_ctime = inode->i_ctime;// 最后节点修改时间

    for (i=0 ; i<sizeof (tmp) ; i++)// 最后将这些状态信息复制到用户缓冲区中

        put_fs_byte(((char *) &tmp)[i],&((char *) statbuf)[i]);
}

int sys_stat(char * filename, struct stat * statbuf)
{// 文件状态系统调用函数 - 根据文件名获取文件状态信息

    struct m_inode * inode;

    if (!(inode=namei(filename)))// 根据给定的目录文件名找到对应的i 节点

        return -ENOENT;
    cp_stat(inode,statbuf);// 复制文件状态信息

    iput(inode);// 释放inode节点

    return 0;
}

int sys_fstat(unsigned int fd, struct stat * statbuf)
{// 文件状态系统调用 - 根据文件句柄获取文件状态信息

    struct file * f;
    struct m_inode * inode;
// 如果文件句柄值大于一个程序最多打开文件数NR_OPEN,或者该句柄的文件结构指针为空,或者对应文件结构的i 节点字段为空,则出错

if (fd >= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode))
        return -EBADF;
    cp_stat(inode,statbuf);// 复制文件状态信息

    return 0;
}

阅读(787) | 评论(0) | 转发(0) |
0

上一篇:open.c

下一篇:fcntl.c

给主人留下些什么吧!~~