- m = mode;
- if (m == IWRITE) {
- if (getfs(ip->i_dev)->s_ronly != 0) {
- u.u_error = EROFS;
- return (1);
- }
- if (ip->i_flag&ITEXT) /* try to free text */
- xrele(ip);
- if (ip->i_flag & ITEXT) {
- u.u_error = ETXTBSY;
- return (1);
- }
- }
- if (u.u_uid == 0)
- return (0);
- if (u.u_uid != ip->i_uid) {
- m >>= 3;
- if (u.u_gid != ip->i_gid)
- m >>= 3;
- }
- if ((ip->i_mode&m) != 0)
- return (0);
- u.u_error = EACCES;
- return (1);
+ vap = &vattr;
+ error = VOP_GETATTR(vp, vap, p->p_ucred, p);
+ if (error)
+ return (error);
+ /*
+ * Copy from vattr table
+ */
+ sb->st_dev = vap->va_fsid;
+ sb->st_ino = vap->va_fileid;
+ mode = vap->va_mode;
+ switch (vp->v_type) {
+ case VREG:
+ mode |= S_IFREG;
+ break;
+ case VDIR:
+ mode |= S_IFDIR;
+ break;
+ case VBLK:
+ mode |= S_IFBLK;
+ break;
+ case VCHR:
+ mode |= S_IFCHR;
+ break;
+ case VLNK:
+ mode |= S_IFLNK;
+ break;
+ case VSOCK:
+ mode |= S_IFSOCK;
+ break;
+ case VFIFO:
+ mode |= S_IFIFO;
+ break;
+ default:
+ return (EBADF);
+ };
+ sb->st_mode = mode;
+ sb->st_nlink = vap->va_nlink;
+ sb->st_uid = vap->va_uid;
+ sb->st_gid = vap->va_gid;
+ sb->st_rdev = vap->va_rdev;
+ sb->st_size = vap->va_size;
+ sb->st_atime = vap->va_atime.tv_sec;
+ sb->st_spare1 = 0;
+ sb->st_mtime = vap->va_mtime.tv_sec;
+ sb->st_spare2 = 0;
+ sb->st_ctime = vap->va_ctime.tv_sec;
+ sb->st_spare3 = 0;
+ sb->st_blksize = vap->va_blocksize;
+ sb->st_flags = vap->va_flags;
+ sb->st_gen = vap->va_gen;
+ sb->st_blocks = vap->va_bytes / S_BLKSIZE;
+ return (0);