+static int lock_fd=-1;
+
+static void lock_create(void)
+{
+int retries=3;
+
+ if (!opt_lock)
+ return;
+retry:
+ if (-1==(lock_fd=open(opt_lock,O_CREAT|O_RDWR,0600)))
+ fatal("Error creating lock file \"%s\": %m",opt_lock);
+ if (flock(lock_fd,LOCK_EX))
+ fatal("Error locking lock file \"%s\": %m",opt_lock);
+ if (!access(opt_lock,O_RD|O_WR)) {
+ if (retries--<=0)
+ fatal("Racing for the lock file \"%s\", giving up");
+ if (close(lock_fd))
+ fatal("Error closing lock file \"%s\": %m",opt_lock);
+ lock_fd=-1;
+ goto retry;
+ }
+ if (utime(opt_lock,NULL))
+ fatal("Error updating lock file \"%s\" timestamp: %m",opt_lock);
+}
+
+static void lock_close(void)
+{
+ if (lock_fd==-1)
+ return;
+ if (close(lock_fd))
+ fatal("Error closing lock file \"%s\": %m",opt_lock);
+ lock_fd=-1;
+}
+