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