diff options
Diffstat (limited to 'linux/fs/stat.c')
| -rw-r--r-- | linux/fs/stat.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/linux/fs/stat.c b/linux/fs/stat.c new file mode 100644 index 0000000..4bec71d --- /dev/null +++ b/linux/fs/stat.c @@ -0,0 +1,51 @@ +#include <errno.h> +#include <sys/stat.h> + +#include <linux/fs.h> +#include <linux/sched.h> +#include <linux/kernel.h> +#include <asm/segment.h> + +static int cp_stat(struct m_inode * inode, struct stat * statbuf) +{ + struct stat tmp; + int i; + + verify_area(statbuf,sizeof (* statbuf)); + tmp.st_dev = inode->i_dev; + tmp.st_ino = inode->i_num; + tmp.st_mode = inode->i_mode; + tmp.st_nlink = inode->i_nlinks; + tmp.st_uid = inode->i_uid; + tmp.st_gid = inode->i_gid; + 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]); + return (0); +} + +int sys_stat(char * filename, struct stat * statbuf) +{ + int i; + struct m_inode * inode; + + if (!(inode=namei(filename))) + return -ENOENT; + i=cp_stat(inode,statbuf); + iput(inode); + return i; +} + +int sys_fstat(unsigned int fd, struct stat * statbuf) +{ + struct file * f; + struct m_inode * inode; + + if (fd >= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode)) + return -ENOENT; + return cp_stat(inode,statbuf); +} |
