xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/chmod.c (revision 354ab865bc3e5dadad52235590e3d69db1e603c7)
1 #include "lib.h"
2 #include <errno.h>
3 #include <stdlib.h>
4 #include "sys9.h"
5 #include "dir.h"
6 
7 static int
seterrno(void)8 seterrno(void)
9 {
10 	_syserrno();
11 	return -1;
12 }
13 
14 int
chmod(const char * path,mode_t mode)15 chmod(const char *path, mode_t mode)
16 {
17 	Dir d, *dir;
18 
19 	dir = _dirstat(path);
20 	if(dir == nil)
21 		return seterrno();
22 	_nulldir(&d);
23 	d.mode = (dir->mode & ~0777) | (mode & 0777);
24 	free(dir);
25 	if(_dirwstat(path, &d) < 0)
26 		return seterrno();
27 	return 0;
28 }
29 
30 int
fchmod(int fd,mode_t mode)31 fchmod(int fd, mode_t mode)
32 {
33 	Dir d, *dir;
34 
35 	dir = _dirfstat(fd);
36 	if(dir == nil)
37 		return seterrno();
38 	_nulldir(&d);
39 	d.mode = (dir->mode & ~0777) | (mode & 0777);
40 	free(dir);
41 	if(_dirfwstat(fd, &d) < 0)
42 		return seterrno();
43 	return 0;
44 }
45