1*ba736c79SDavid van Moolenbroek /* Created (MFS based):
2*ba736c79SDavid van Moolenbroek * June 2011 (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 #include "puffs.h"
8*ba736c79SDavid van Moolenbroek #include "puffs_priv.h"
9*ba736c79SDavid van Moolenbroek
10*ba736c79SDavid van Moolenbroek
11*ba736c79SDavid van Moolenbroek /*===========================================================================*
12*ba736c79SDavid van Moolenbroek * fs_chmod *
13*ba736c79SDavid van Moolenbroek *===========================================================================*/
fs_chmod(ino_t ino_nr,mode_t * mode)14*ba736c79SDavid van Moolenbroek int fs_chmod(ino_t ino_nr, mode_t *mode)
15*ba736c79SDavid van Moolenbroek {
16*ba736c79SDavid van Moolenbroek /* Perform the chmod(name, mode) system call. */
17*ba736c79SDavid van Moolenbroek struct puffs_node *pn;
18*ba736c79SDavid van Moolenbroek struct vattr va;
19*ba736c79SDavid van Moolenbroek PUFFS_MAKECRED(pcr, &global_kcred);
20*ba736c79SDavid van Moolenbroek
21*ba736c79SDavid van Moolenbroek if (global_pu->pu_ops.puffs_node_setattr == NULL)
22*ba736c79SDavid van Moolenbroek return(EINVAL);
23*ba736c79SDavid van Moolenbroek
24*ba736c79SDavid van Moolenbroek if ((pn = puffs_pn_nodewalk(global_pu, find_inode_cb, &ino_nr)) == NULL)
25*ba736c79SDavid van Moolenbroek return(EINVAL);
26*ba736c79SDavid van Moolenbroek
27*ba736c79SDavid van Moolenbroek puffs_vattr_null(&va);
28*ba736c79SDavid van Moolenbroek /* Clear setgid bit if file is not in caller's grp */
29*ba736c79SDavid van Moolenbroek va.va_mode = (pn->pn_va.va_mode & ~ALL_MODES) | (*mode & ALL_MODES);
30*ba736c79SDavid van Moolenbroek (void)clock_time(&va.va_ctime);
31*ba736c79SDavid van Moolenbroek
32*ba736c79SDavid van Moolenbroek if (global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr) != 0)
33*ba736c79SDavid van Moolenbroek return(EINVAL);
34*ba736c79SDavid van Moolenbroek
35*ba736c79SDavid van Moolenbroek /* Return full new mode to caller. */
36*ba736c79SDavid van Moolenbroek *mode = pn->pn_va.va_mode;
37*ba736c79SDavid van Moolenbroek
38*ba736c79SDavid van Moolenbroek return(OK);
39*ba736c79SDavid van Moolenbroek }
40*ba736c79SDavid van Moolenbroek
41*ba736c79SDavid van Moolenbroek
42*ba736c79SDavid van Moolenbroek /*===========================================================================*
43*ba736c79SDavid van Moolenbroek * fs_chown *
44*ba736c79SDavid van Moolenbroek *===========================================================================*/
fs_chown(ino_t ino_nr,uid_t uid,gid_t gid,mode_t * mode)45*ba736c79SDavid van Moolenbroek int fs_chown(ino_t ino_nr, uid_t uid, gid_t gid, mode_t *mode)
46*ba736c79SDavid van Moolenbroek {
47*ba736c79SDavid van Moolenbroek struct puffs_node *pn;
48*ba736c79SDavid van Moolenbroek struct vattr va;
49*ba736c79SDavid van Moolenbroek PUFFS_MAKECRED(pcr, &global_kcred);
50*ba736c79SDavid van Moolenbroek
51*ba736c79SDavid van Moolenbroek if ((pn = puffs_pn_nodewalk(global_pu, find_inode_cb, &ino_nr)) == NULL)
52*ba736c79SDavid van Moolenbroek return(EINVAL);
53*ba736c79SDavid van Moolenbroek
54*ba736c79SDavid van Moolenbroek puffs_vattr_null(&va);
55*ba736c79SDavid van Moolenbroek va.va_uid = uid;
56*ba736c79SDavid van Moolenbroek va.va_gid = gid;
57*ba736c79SDavid van Moolenbroek va.va_mode = pn->pn_va.va_mode & ~(I_SET_UID_BIT | I_SET_GID_BIT);
58*ba736c79SDavid van Moolenbroek (void)clock_time(&va.va_ctime);
59*ba736c79SDavid van Moolenbroek
60*ba736c79SDavid van Moolenbroek if (global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr) != 0)
61*ba736c79SDavid van Moolenbroek return(EINVAL);
62*ba736c79SDavid van Moolenbroek
63*ba736c79SDavid van Moolenbroek /* Update caller on current mode, as it may have changed. */
64*ba736c79SDavid van Moolenbroek *mode = pn->pn_va.va_mode;
65*ba736c79SDavid van Moolenbroek
66*ba736c79SDavid van Moolenbroek return(OK);
67*ba736c79SDavid van Moolenbroek }
68