From 53e0e51cbb94b5cb6f4bba729e62dec3b544f14e Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 3 May 2011 16:56:50 +0000 Subject: [PATCH] ape: fix broken chmod for directories. (makes hg work again) --- sys/src/ape/lib/ap/plan9/chmod.c | 32 ++++++++++++++++++++++---------- 1 file 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; }