msk: rudimentary lock

This commit is contained in:
K. Lange 2018-12-26 12:37:05 +09:00
parent e4a72a352d
commit 45ccb8b071

View File

@ -15,6 +15,7 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <toaru/confreader.h>
@ -23,13 +24,32 @@
#define MSK_VERSION "1.0.0"
#define VAR_PATH "/var/msk"
#define LOCK_PATH "/var/run/msk.lock"
static confreader_t * msk_config = NULL;
static confreader_t * msk_manifest = NULL;
static hashmap_t * msk_installed = NULL;
static int lock_fd = -1;
static int verbose = 0;
static void release_lock(void) {
if (lock_fd != -1) {
unlink(LOCK_PATH);
}
}
static void needs_lock(void) {
if (lock_fd == -1) {
lock_fd = open(LOCK_PATH, O_RDWR|O_CREAT|O_EXCL);
if (lock_fd < 0) {
fprintf(stderr, "msk: failed to obtain exclusive lock\n");
exit(1);
}
atexit(release_lock);
}
}
/**
* checks whether 'candidate' is newer than 'current'.
*
@ -153,6 +173,8 @@ static int update_stores(int argc, char * argv[]) {
return usage(argc,argv);
}
needs_lock();
read_config();
make_var();
@ -377,6 +399,7 @@ static int install_package(char * pkg) {
static int install_packages(int argc, char * argv[]) {
needs_root();
needs_lock();
read_config();
read_manifest(1);
read_installed();