From 5179f5d383f99121bf4085af4b9354638e4e168c Mon Sep 17 00:00:00 2001 From: José Bollo Date: Thu, 17 Oct 2019 18:06:44 +0200 Subject: Add a locker to run only one service MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iedec0340cb08f9eaa81967fb28a8b0e7f2c44603 Signed-off-by: José Bollo --- src/main-cynagorad.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main-cynagorad.c b/src/main-cynagorad.c index db5408d..4a90cc0 100644 --- a/src/main-cynagorad.c +++ b/src/main-cynagorad.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #if defined(WITH_SYSTEMD_ACTIVATION) @@ -61,6 +62,9 @@ #if !defined(DEFAULT_CYNAGORA_GROUP) # define DEFAULT_CYNAGORA_GROUP NULL #endif +#if !defined(DEFAULT_LOCKFILE) +# define DEFAULT_LOCKFILE ".cynagora-lock" +#endif #define _DBDIR_ 'd' #define _GROUP_ 'g' @@ -143,6 +147,7 @@ versiontxt[] = static int isid(const char *text); static void ensure_directory(const char *path, int uid, int gid); +static int lockdir(const char *dir); int main(int ac, char **av) { @@ -316,6 +321,13 @@ int main(int ac, char **av) cap_clear(caps); rc = cap_set_proc(caps); + /* get lock for the database */ + rc = lockdir(dbdir); + if (rc < 0) { + fprintf(stderr, "can not lock database of directory %s: %m\n", dbdir); + return 1; + } + /* connection to the database */ rc = db_open(dbdir); if (rc < 0) { @@ -457,3 +469,22 @@ static void ensure_directory(const char *path, int uid, int gid) ensuredir(p, (int)l, uid, gid); } +static int lockdir(const char *dir) +{ + char path[PATH_MAX]; + int fd, rc; + + rc = snprintf(path, sizeof path, "%s/%s", dir, DEFAULT_LOCKFILE); + if (rc >= (int)sizeof path) { + rc = -1; + errno = ENAMETOOLONG; + } else if (rc >= 0) { + rc = open(path, O_RDWR|O_CREAT, 0600); + if (rc >= 0) { + fd = rc; + rc = flock(fd, LOCK_EX|LOCK_NB); + } + } + return rc; +} + -- cgit 1.2.3-korg