Fixed chmod and fchmod, they were ignoring the dir bit. federico Notes: Fri May 30 00:04:19 EDT 2008 geoff should append-only and exclusive-access be cleared, inherited or settable via the mode argument? Reference: /n/sources/patch/applied/ape-chmod-dirbit Date: Thu May 29 02:57:38 CES 2008 Signed-off-by: benavento@gmail.com Reviewed-by: geoff --- /sys/src/ape/lib/ap/plan9/chmod.c Thu May 29 02:56:32 2008 +++ /sys/src/ape/lib/ap/plan9/chmod.c Thu May 29 02:56:27 2008 @@ -7,27 +7,39 @@ int chmod(const char *path, mode_t mode) { - Dir d; + Dir d, *dir; - _nulldir(&d); - d.mode = mode & 0777; - if(_dirwstat(path, &d) < 0){ - _syserrno(); + dir = _dirstat(path); + if(dir == nil){ +error: + _syserrno(); return -1; } + _nulldir(&d); + d.mode = (dir->mode & ~0777) | (mode & 0777); + free(dir); + if(_dirwstat(path, &d) < 0) + goto error; + return 0; } int fchmod(int fd, mode_t mode) { - Dir d; + Dir d, *dir; - _nulldir(&d); - d.mode = mode & 0777; - if(_dirfwstat(fd, &d) < 0){ - _syserrno(); + dir = _dirfstat(fd); + if(dir == nil){ +error: + _syserrno(); return -1; } + _nulldir(&d); + d.mode = (dir->mode & ~ 0777) | (mode & 0777); + free(dir); + if(_dirfwstat(fd, &d) < 0) + goto error; + return 0; }