+ die_err("Couldn't take fcntl lock");
+}
+
+static void take_flock_lock(conf_t *conf, FILE *f) {
+ if (!conf->flock_lock)
+ return;
+ int fd = fileno(f);
+ if (fd == -1)
+ die_err("Couldn't get file descriptor for locking");
+ if (flock(fd, LOCK_EX | LOCK_NB) == 0)
+ return;
+ if (errno != EWOULDBLOCK)
+ die_err("Couldn't take flock lock");
+ if (fputs(WAITING, stderr) == EOF)
+ die("Error writing waiting message");
+ if (flock(fd, LOCK_EX) == 0)
+ return;
+ die_err("Couldn't take flock lock");
+}
+
+static void take_lock(conf_t *conf, FILE *f) {
+ take_fcntl_lock(conf, f);
+ take_flock_lock(conf, f);