xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/chown.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include "lib.h"
2 #include "sys9.h"
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <unistd.h>
6 #include <string.h>
7 #include <errno.h>
8 #include "dir.h"
9 
10 int
11 chown(const char *path, uid_t owner, gid_t group)
12 {
13 	int n;
14 	int num;
15 	char *nam;
16 	char cd[DIRLEN];
17 	Dir d;
18 
19 	n = -1;
20 	if(_STAT(path, cd) < 0)
21 		_syserrno();
22 	else{
23 		convM2D(cd, &d);
24 
25 		/* check that d.uid matches owner, and find name for group */
26 		nam = d.uid;
27 		if(_getpw(&num, &nam, 0)) {
28 			if(num != owner) {
29 				/* can't change owner in Plan 9 */
30 				errno = EPERM;
31 				return -1;
32 			}
33 		} else {
34 			errno = EINVAL;
35 			return -1;
36 		}
37 		nam = 0;
38 		num = group;
39 		if(!_getpw(&num, &nam, 0)) {
40 			/* couldn't find group */
41 			errno = EINVAL;
42 			return -1;
43 		}
44 		memset(d.gid, 0, NAMELEN);
45 		strcpy(d.gid, nam);
46 
47 		convD2M(&d, cd);
48 		if(_WSTAT(path, cd) < 0)
49 			_syserrno();
50 		else
51 			n = 0;
52 	}
53 	return n;
54 }
55