xref: /minix3/minix/lib/libpuffs/stadir.c (revision ba736c796854b82e29da17267614db0a449419db)
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 Moolenbroek int 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 Moolenbroek int 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