#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
+#include <time.h>
-#include "brum.h"
+#include "umpf.h"
-#define LOCK_MAX_TRIES 30
+#define LOCK_MAX_TRIES 3
gid_t rgid, egid, sgid;
void
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)
{
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);
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;