]> mj.ucw.cz Git - umpf.git/blobdiff - lock.c
started with filtering mail
[umpf.git] / lock.c
diff --git a/lock.c b/lock.c
index d6d1155660ec9fe6ca6935d31d837cae22ec81f2..12f40830b4e4f4bee8b4846556b986e8cb6d221c 100644 (file)
--- a/lock.c
+++ b/lock.c
@@ -8,8 +8,9 @@
 #include <fcntl.h>
 #include <errno.h>
 #include <sys/stat.h>
+#include <time.h>
 
-#include "brum.h"
+#include "umpf.h"
 
 #define LOCK_MAX_TRIES 3
 gid_t rgid, egid, sgid;
@@ -45,17 +46,16 @@ random_sleep(unsigned int about, unsigned int offset)
        usleep(about * 1000000 + myrand * 500000);
 }
 
-static char*
+char*
 cat(char* l, char* r)
 {
        char* res = xmalloc(strlen(l) + strlen (r) + 1);
        strcpy(res, l);
        strcat(res, r);
-
+       
        return res;     
 }
 
-/* FIXME: what about privileges? */
 static int
 dot_lock(char* path)
 {
@@ -64,7 +64,10 @@ dot_lock(char* path)
        int res = -1;
        char* lockfile = cat(path, ".lock");
 
+       raise_gid();
        for (i = 0; i < LOCK_MAX_TRIES; i++){
+               struct stat buf;
+
                if ((fd = open(lockfile, O_WRONLY | O_EXCL | O_CREAT, 0)) 
                        >= 0) {
                        close(fd);
@@ -74,11 +77,13 @@ dot_lock(char* path)
 
                if (errno != EEXIST)
                        break;
-
-               /* FIXME: deal with old locks */
-
+               /* deal with old locks */
+               stat(lockfile, &buf);
+               if ((time(NULL) - buf.st_mtime) > 3600)
+                       unlink(lockfile);               
                random_sleep(1, 1);
        }
+       drop_gid();
 
        free(lockfile);
        return res;