1 /* Created (MFS based): 2 * February 2010 (Evgeniy Ivanov) 3 */ 4 5 #include "fs.h" 6 #include "inode.h" 7 #include "super.h" 8 9 10 /*===========================================================================* 11 * fs_chmod * 12 *===========================================================================*/ 13 int fs_chmod(ino_t ino_nr, mode_t *mode) 14 { 15 /* Perform the chmod(name, mode) system call. */ 16 register struct inode *rip; 17 18 /* Temporarily open the file. */ 19 if( (rip = get_inode(fs_dev, ino_nr)) == NULL) 20 return(EINVAL); 21 22 /* Now make the change. Clear setgid bit if file is not in caller's grp */ 23 rip->i_mode = (rip->i_mode & ~ALL_MODES) | (*mode & ALL_MODES); 24 rip->i_update |= CTIME; 25 rip->i_dirt = IN_DIRTY; 26 27 /* Return full new mode to caller. */ 28 *mode = rip->i_mode; 29 30 put_inode(rip); 31 return(OK); 32 } 33 34 35 /*===========================================================================* 36 * fs_chown * 37 *===========================================================================*/ 38 int fs_chown(ino_t ino_nr, uid_t uid, gid_t gid, mode_t *mode) 39 { 40 register struct inode *rip; 41 42 /* Temporarily open the file. */ 43 if( (rip = get_inode(fs_dev, ino_nr)) == NULL) 44 return(EINVAL); 45 46 rip->i_uid = uid; 47 rip->i_gid = gid; 48 rip->i_mode &= ~(I_SET_UID_BIT | I_SET_GID_BIT); 49 rip->i_update |= CTIME; 50 rip->i_dirt = IN_DIRTY; 51 52 /* Update caller on current mode, as it may have changed. */ 53 *mode = rip->i_mode; 54 put_inode(rip); 55 56 return(OK); 57 } 58