From 4f4bd122b940d19d90e23f9a012c51097d42dfbc Mon Sep 17 00:00:00 2001 From: mar77i Date: Fri, 11 Apr 2014 11:05:50 +0200 Subject: lock.sh: Truls Beckens was right #1 --- lock.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lock.sh b/lock.sh index 22191fe..9a9cdd6 100755 --- a/lock.sh +++ b/lock.sh @@ -11,7 +11,7 @@ lock() { echo "lock $1 found, waiting for unlock" >&2 while true; do sleep 2; - if [[ ! -d "$1" ]]; then + if mkdir "$1" &>/dev/null; then return fi done -- cgit v1.2.1 From ed2589219056458a20aa399d128e06394f632e15 Mon Sep 17 00:00:00 2001 From: mar77i Date: Fri, 11 Apr 2014 11:15:04 +0200 Subject: lock.c: Truls Beckens was right #2 also, what the hell? Fixed the obvious stuff and returned atomicity to the locking - no, access() isn't safe when you want that. --- lock.c | 39 ++++++++++----------------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/lock.c b/lock.c index 68245ac..aaac35a 100644 --- a/lock.c +++ b/lock.c @@ -1,4 +1,5 @@ /* See LICENSE for licence details. */ +#include #include #include #include @@ -14,39 +15,19 @@ int main(int argc, char **argv){ return EXIT_FAILURE; } - if(access(argv[1], F_OK)){ - /* create lock */ - if(mkdir(argv[1], S_IRUSR | S_IXUSR)){ + /* create lock */ + if(mkdir(argv[1], S_IRUSR | S_IXUSR)){ + if(errno && errno != EEXIST) { fprintf(stderr, "Failed to create lock %s.\n", argv[1]); return EXIT_FAILURE; } + /* lock exists */ + for(; mkdir(argv[1], S_IRUSR | S_IXUSR);){ + sleep(1); + } + return EXIT_SUCCESS; + } else return EXIT_SUCCESS; } - /* prepare path */ - argvlen = strlen(argv[1]); - pathlen = argvlen + sizeof("/..") + 1; - path = malloc(pathlen); - if(path == NULL) { - fprintf(stderr, "malloc() failed\n"); - return EXIT_FAILURE; - } - - memcpy(path, argv[1], argvlen); - memcpy(path + argvlen, "/..\0", sizeof("/..") + 1); - - if(access(path, F_OK)){ - /* invalid lock */ - fprintf(stderr, "%s is not a lock directory.\n", argv[1]); - free(path); - return EXIT_FAILURE; - } - - /* lock exists */ - for(; !access(path, F_OK) ;){ - sleep(1); - } - - free(path); - return EXIT_SUCCESS; } -- cgit v1.2.1