1 /* Created (MFS based): 2 * February 2010 (Evgeniy Ivanov) 3 */ 4 5 #include "fs.h" 6 7 /*===========================================================================* 8 * fs_stat * 9 *===========================================================================*/ 10 int fs_stat(ino_t ino_nr, struct stat *statbuf) 11 { 12 register struct puffs_node *pn; /* target pnode */ 13 struct vattr va; 14 mode_t mo; 15 int s; 16 PUFFS_MAKECRED(pcr, &global_kcred); 17 18 if (global_pu->pu_ops.puffs_node_getattr == NULL) { 19 lpuffs_debug("fs_stat: puffs_node_getattr is missing\n"); 20 return(EINVAL); 21 } 22 23 if ((pn = puffs_pn_nodewalk(global_pu, find_inode_cb, &ino_nr)) == NULL) { 24 lpuffs_debug("walk failed...\n"); 25 return(EINVAL); 26 } 27 28 if (global_pu->pu_ops.puffs_node_getattr(global_pu, pn, &va, pcr) != 0) { 29 if (errno) { 30 if (errno > 0) errno = -errno; 31 return(errno); 32 } 33 return(EINVAL); 34 } 35 36 /* Fill in the statbuf struct. */ 37 mo = va.va_mode & I_TYPE; 38 39 /* true iff special */ 40 s = (mo == I_CHAR_SPECIAL || mo == I_BLOCK_SPECIAL); 41 42 statbuf->st_mode = va.va_mode; 43 statbuf->st_nlink = va.va_nlink; 44 statbuf->st_uid = va.va_uid; 45 statbuf->st_gid = va.va_gid; 46 statbuf->st_rdev = (s ? va.va_rdev : NO_DEV); 47 statbuf->st_size = va.va_size; 48 statbuf->st_atimespec = va.va_atime; 49 statbuf->st_mtimespec = va.va_mtime; 50 statbuf->st_ctimespec = va.va_ctime; 51 52 statbuf->st_birthtimespec = va.va_birthtime; 53 statbuf->st_blksize = va.va_blocksize; 54 statbuf->st_blocks = va.va_bytes / va.va_blocksize; 55 statbuf->st_flags = va.va_flags; 56 statbuf->st_gen = va.va_gen; 57 58 return(OK); 59 } 60 61 62 /*===========================================================================* 63 * fs_statvfs * 64 *===========================================================================*/ 65 int fs_statvfs(struct statvfs *st) 66 { 67 68 if (global_pu->pu_ops.puffs_fs_statvfs(global_pu, st) != 0) { 69 lpuffs_debug("statvfs failed\n"); 70 return(EINVAL); 71 } 72 73 /* libpuffs doesn't truncate filenames */ 74 st->f_flag |= ST_NOTRUNC; 75 76 return(OK); 77 } 78