summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap/plan9
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-03 16:56:50 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-03 16:56:50 +0000
commit53e0e51cbb94b5cb6f4bba729e62dec3b544f14e (patch)
treed6fa664a5b4c5abdff1dc1520695b279fe507f04 /sys/src/ape/lib/ap/plan9
parentcbfc955b8df9b44c5aae452680e0246f6a309102 (diff)
ape: fix broken chmod for directories. (makes hg work again)
Diffstat (limited to 'sys/src/ape/lib/ap/plan9')
-rw-r--r--sys/src/ape/lib/ap/plan9/chmod.c32
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;
}