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