+/*!
+ * Get lock on db lock file
+ *
+ * @args cmd (r) !=0: lock, 0: unlock
+ * @returns 1 if lock was acquired, 0 if file is already locked, -1 on error
+ */
+static int get_lock(int cmd)
+{
+ static int lockfd = -1;
+ struct flock lock;
+
+ if (cmd == 0) {
+ if (lockfd == -1)
+ return -1;
+
+ lock.l_start = 0;
+ lock.l_whence = SEEK_SET;
+ lock.l_len = 0;
+ lock.l_type = F_UNLCK;
+ fcntl(lockfd, F_SETLK, &lock);
+ close(lockfd);
+ lockfd = -1;
+ return 0;
+ }
+
+ if (lockfd == -1) {
+ if ((lockfd = open(LOCKFILENAME, O_RDWR | O_CREAT, 0644)) < 0) {
+ LOG(log_error, logtype_cnid, "get_lock: error opening lockfile: %s", strerror(errno));
+ return -1;
+ }
+ }
+
+ lock.l_start = 0;
+ lock.l_whence = SEEK_SET;
+ lock.l_len = 0;
+ lock.l_type = F_WRLCK;
+
+ if (fcntl(lockfd, F_SETLK, &lock) < 0) {
+ if (errno == EACCES || errno == EAGAIN) {
+ LOG(log_debug, logtype_cnid, "get_lock: couldn't lock");
+ return 0;
+ } else {
+ LOG(log_error, logtype_cnid, "get_lock: fcntl F_WRLCK lockfile: %s", strerror(errno));
+ return -1;
+ }
+ }
+
+ LOG(log_debug, logtype_cnid, "get_lock: got lock");
+ return 1;
+}
+