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