xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/chmod.c (revision 354ab865bc3e5dadad52235590e3d69db1e603c7)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include <errno.h>
39a747e4fSDavid du Colombier #include <stdlib.h>
43e12c5d1SDavid du Colombier #include "sys9.h"
53e12c5d1SDavid du Colombier #include "dir.h"
63e12c5d1SDavid du Colombier 
7*354ab865SDavid du Colombier static int
seterrno(void)8*354ab865SDavid du Colombier seterrno(void)
93e12c5d1SDavid du Colombier {
103e12c5d1SDavid du Colombier 	_syserrno();
119a747e4fSDavid du Colombier 	return -1;
123e12c5d1SDavid du Colombier }
13*354ab865SDavid du Colombier 
14*354ab865SDavid du Colombier int
chmod(const char * path,mode_t mode)15*354ab865SDavid du Colombier chmod(const char *path, mode_t mode)
16*354ab865SDavid du Colombier {
17*354ab865SDavid du Colombier 	Dir d, *dir;
18*354ab865SDavid du Colombier 
19*354ab865SDavid du Colombier 	dir = _dirstat(path);
20*354ab865SDavid du Colombier 	if(dir == nil)
21*354ab865SDavid du Colombier 		return seterrno();
22*354ab865SDavid du Colombier 	_nulldir(&d);
23*354ab865SDavid du Colombier 	d.mode = (dir->mode & ~0777) | (mode & 0777);
24*354ab865SDavid du Colombier 	free(dir);
25*354ab865SDavid du Colombier 	if(_dirwstat(path, &d) < 0)
26*354ab865SDavid du Colombier 		return seterrno();
279a747e4fSDavid du Colombier 	return 0;
283e12c5d1SDavid du Colombier }
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier int
fchmod(int fd,mode_t mode)313e12c5d1SDavid du Colombier fchmod(int fd, mode_t mode)
323e12c5d1SDavid du Colombier {
33*354ab865SDavid du Colombier 	Dir d, *dir;
343e12c5d1SDavid du Colombier 
35*354ab865SDavid du Colombier 	dir = _dirfstat(fd);
36*354ab865SDavid du Colombier 	if(dir == nil)
37*354ab865SDavid du Colombier 		return seterrno();
389a747e4fSDavid du Colombier 	_nulldir(&d);
39*354ab865SDavid du Colombier 	d.mode = (dir->mode & ~0777) | (mode & 0777);
40*354ab865SDavid du Colombier 	free(dir);
41*354ab865SDavid du Colombier 	if(_dirfwstat(fd, &d) < 0)
42*354ab865SDavid du Colombier 		return seterrno();
439a747e4fSDavid du Colombier 	return 0;
443e12c5d1SDavid du Colombier }
45