diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 16:56:50 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 16:56:50 +0000 |
commit | 53e0e51cbb94b5cb6f4bba729e62dec3b544f14e (patch) | |
tree | d6fa664a5b4c5abdff1dc1520695b279fe507f04 /sys/src/ape/lib/ap/plan9/chmod.c | |
parent | cbfc955b8df9b44c5aae452680e0246f6a309102 (diff) |
ape: fix broken chmod for directories. (makes hg work again)
Diffstat (limited to 'sys/src/ape/lib/ap/plan9/chmod.c')
-rw-r--r-- | sys/src/ape/lib/ap/plan9/chmod.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/sys/src/ape/lib/ap/plan9/chmod.c b/sys/src/ape/lib/ap/plan9/chmod.c index 8b6daad22..82ba8783c 100644 --- a/sys/src/ape/lib/ap/plan9/chmod.c +++ b/sys/src/ape/lib/ap/plan9/chmod.c @@ -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; } |