From 4661934e31d3eee9414eb44ffc5a7e355326bc31 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 3 Dec 2012 18:47:41 +0100 Subject: ape: fix _grpmems(), access(), getppid(), cleanup _grpmems() was broken tokenizing group list in place. we have to copy it to status buffer before tokenizing. dynamically alloc path for test file to check write permission on directory and add pid to the name to prevent races. use _OPEN instead of ape open to read /dev/ppid in getppid(). use mode enums instead of numeric constants for _OPEN() and _CREATE(). --- sys/src/ape/lib/ap/plan9/access.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'sys/src/ape/lib/ap/plan9/access.c') diff --git a/sys/src/ape/lib/ap/plan9/access.c b/sys/src/ape/lib/ap/plan9/access.c index c51b37d6c..c96db0228 100644 --- a/sys/src/ape/lib/ap/plan9/access.c +++ b/sys/src/ape/lib/ap/plan9/access.c @@ -24,8 +24,6 @@ access(const char *name, int mode) 2, 2 }; - char tname[1024]; - if(mode == 0){ db = _dirstat(name); if(db == nil){ @@ -48,13 +46,23 @@ access(const char *name, int mode) close(fd); } if(mode & W_OK){ - strncpy(tname, name, sizeof(tname)-9); - strcat(tname, "/_AcChAcK"); - fd = creat(tname, 0666); - if(fd < 0) + char *tname; + int nname; + nname = strlen(name); + tname = malloc(nname+32); + if(tname == 0) return -1; - close(fd); - _REMOVE(tname); + memset(tname, 0, nname+32); + memcpy(tname, name, n); + memcpy(tname+nname, "/_AcChAcK", 9); + _ultoa(tname+nname+9, getpid()); + fd = _CREATE(tname, ORCLOSE, 0666); + if(fd < 0){ + free(tname); + return -1; + } + _CLOSE(fd); + free(tname); } return 0; } -- cgit v1.2.3