summaryrefslogtreecommitdiff
path: root/minix/lib/libpuffs/stadir.c
blob: d6decd3649d672cbd46a7afddf6e905df30f5303 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* Created (MFS based):
 *   February 2010 (Evgeniy Ivanov)
 */

#include "fs.h"

/*===========================================================================*
 *                             fs_stat					     *
 *===========================================================================*/
int fs_stat(ino_t ino_nr, struct stat *statbuf)
{
  register struct puffs_node *pn;  /* target pnode */
  struct vattr va;
  mode_t mo;
  int s;
  PUFFS_MAKECRED(pcr, &global_kcred);

  if (global_pu->pu_ops.puffs_node_getattr == NULL) {
	lpuffs_debug("fs_stat: puffs_node_getattr is missing\n");
	return(EINVAL);
  }

  if ((pn = puffs_pn_nodewalk(global_pu, find_inode_cb, &ino_nr)) == NULL) {
	lpuffs_debug("walk failed...\n");
        return(EINVAL);
  }

  if (global_pu->pu_ops.puffs_node_getattr(global_pu, pn, &va, pcr) != 0) {
	if (errno) {
		if (errno > 0) errno = -errno;
		return(errno);
	}
	return(EINVAL);
  }

  /* Fill in the statbuf struct. */
  mo = va.va_mode & I_TYPE;

  /* true iff special */
  s = (mo == I_CHAR_SPECIAL || mo == I_BLOCK_SPECIAL);

  statbuf->st_mode = va.va_mode;
  statbuf->st_nlink = va.va_nlink;
  statbuf->st_uid = va.va_uid;
  statbuf->st_gid = va.va_gid;
  statbuf->st_rdev = (s ? va.va_rdev : NO_DEV);
  statbuf->st_size = va.va_size;
  statbuf->st_atimespec = va.va_atime;
  statbuf->st_mtimespec = va.va_mtime;
  statbuf->st_ctimespec = va.va_ctime;

  statbuf->st_birthtimespec = va.va_birthtime;
  statbuf->st_blksize = va.va_blocksize;
  statbuf->st_blocks = va.va_bytes / va.va_blocksize;
  statbuf->st_flags = va.va_flags;
  statbuf->st_gen = va.va_gen;

  return(OK);
}


/*===========================================================================*
 *                             fs_statvfs                                    *
 *===========================================================================*/
int fs_statvfs(struct statvfs *st)
{

  if (global_pu->pu_ops.puffs_fs_statvfs(global_pu, st) != 0) {
	lpuffs_debug("statvfs failed\n");
	return(EINVAL);
  }

  /* libpuffs doesn't truncate filenames */
  st->f_flag |= ST_NOTRUNC;

  return(OK);
}