|
|
1.1.1.2 root 1: /*
2: * linux/fs/stat.c
3: *
4: * (C) 1991 Linus Torvalds
5: */
6:
1.1 root 7: #include <errno.h>
8: #include <sys/stat.h>
9:
10: #include <linux/fs.h>
11: #include <linux/sched.h>
12: #include <linux/kernel.h>
13: #include <asm/segment.h>
14:
1.1.1.2 root 15: static void cp_stat(struct m_inode * inode, struct stat * statbuf)
1.1 root 16: {
17: struct stat tmp;
18: int i;
19:
1.1.1.3 ! root 20: verify_area(statbuf,sizeof (struct stat));
1.1 root 21: tmp.st_dev = inode->i_dev;
22: tmp.st_ino = inode->i_num;
23: tmp.st_mode = inode->i_mode;
24: tmp.st_nlink = inode->i_nlinks;
25: tmp.st_uid = inode->i_uid;
26: tmp.st_gid = inode->i_gid;
27: tmp.st_rdev = inode->i_zone[0];
28: tmp.st_size = inode->i_size;
29: tmp.st_atime = inode->i_atime;
30: tmp.st_mtime = inode->i_mtime;
31: tmp.st_ctime = inode->i_ctime;
32: for (i=0 ; i<sizeof (tmp) ; i++)
1.1.1.3 ! root 33: put_fs_byte(((char *) &tmp)[i],i + (char *) statbuf);
1.1 root 34: }
35:
36: int sys_stat(char * filename, struct stat * statbuf)
37: {
38: struct m_inode * inode;
39:
40: if (!(inode=namei(filename)))
41: return -ENOENT;
1.1.1.2 root 42: cp_stat(inode,statbuf);
1.1 root 43: iput(inode);
1.1.1.2 root 44: return 0;
1.1 root 45: }
46:
1.1.1.3 ! root 47: int sys_lstat(char * filename, struct stat * statbuf)
! 48: {
! 49: struct m_inode * inode;
! 50:
! 51: if (!(inode = lnamei(filename)))
! 52: return -ENOENT;
! 53: cp_stat(inode,statbuf);
! 54: iput(inode);
! 55: return 0;
! 56: }
! 57:
1.1 root 58: int sys_fstat(unsigned int fd, struct stat * statbuf)
59: {
60: struct file * f;
61: struct m_inode * inode;
62:
63: if (fd >= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode))
1.1.1.2 root 64: return -EBADF;
65: cp_stat(inode,statbuf);
66: return 0;
1.1 root 67: }
1.1.1.3 ! root 68:
! 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:
! 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);
! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.