From 3b9154d37f5c1edd92a537d104a7adddb2af4cee Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Mon, 17 Jan 2022 13:56:21 -0500 Subject: [PATCH] Reintroduce lock file. --- Makefile | 2 ++ src/keyd.c | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e3c98d6..77189d6 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ DESTDIR= PREFIX=/usr +LOCK_FILE="/var/run/keyd.lock" SOCKET="/var/run/keyd.socket" LOG_FILE="/var/log/keyd.log" CONFIG_DIR="/etc/keyd" @@ -14,6 +15,7 @@ CFLAGS+=-DVERSION=\"$(VERSION)\" \ -DCONFIG_DIR=\"$(CONFIG_DIR)\" \ -DLOG_FILE=\"$(LOG_FILE)\" \ -DSOCKET=\"$(SOCKET)\" \ + -DLOCK_FILE=\"$(LOCK_FILE)\" \ -I/usr/local/include \ -L/usr/local/lib\ diff --git a/src/keyd.c b/src/keyd.c index 9255fff..9eb888c 100644 --- a/src/keyd.c +++ b/src/keyd.c @@ -811,6 +811,21 @@ static void daemonize() dup2(fd, 2); } +static void lock() +{ + int fd; + + if ((fd = open(LOCK_FILE, O_CREAT | O_RDWR, 0600)) == -1) { + perror("flock open"); + exit(1); + } + + if (flock(fd, LOCK_EX | LOCK_NB) == -1) { + fprintf(stderr, "ERROR: Another instance of keyd is already running.\n"); + exit(-1); + } +} + static void chgid() { struct group *g = getgrnam("keyd"); @@ -912,9 +927,7 @@ int main(int argc, char *argv[]) } chgid(); - if (!access(SOCKET, F_OK)) - die("ERROR: Another instance of keyd appears to be running.\n" - "\tto force keyd to run, manually remove %s and try again.", SOCKET); + lock(); if (daemonize_flag) daemonize();