ape: fix broken chmod for directories. (makes hg work again)
This commit is contained in:
parent
cbfc955b8d
commit
53e0e51cbb
1 changed files with 22 additions and 10 deletions
|
@ -7,27 +7,39 @@
|
||||||
int
|
int
|
||||||
chmod(const char *path, mode_t mode)
|
chmod(const char *path, mode_t mode)
|
||||||
{
|
{
|
||||||
Dir d;
|
Dir d, *dir;
|
||||||
|
|
||||||
_nulldir(&d);
|
dir = _dirstat(path);
|
||||||
d.mode = mode & 0777;
|
if(dir == nil){
|
||||||
if(_dirwstat(path, &d) < 0){
|
error:
|
||||||
_syserrno();
|
_syserrno();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
_nulldir(&d);
|
||||||
|
d.mode = (dir->mode & ~0777) | (mode & 0777);
|
||||||
|
free(dir);
|
||||||
|
if(_dirwstat(path, &d) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fchmod(int fd, mode_t mode)
|
fchmod(int fd, mode_t mode)
|
||||||
{
|
{
|
||||||
Dir d;
|
Dir d, *dir;
|
||||||
|
|
||||||
_nulldir(&d);
|
dir = _dirfstat(fd);
|
||||||
d.mode = mode & 0777;
|
if(dir == nil){
|
||||||
if(_dirfwstat(fd, &d) < 0){
|
error:
|
||||||
_syserrno();
|
_syserrno();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
_nulldir(&d);
|
||||||
|
d.mode = (dir->mode & ~ 0777) | (mode & 0777);
|
||||||
|
free(dir);
|
||||||
|
if(_dirfwstat(fd, &d) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue