aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominique Martinet <dominique.martinet@atmark-techno.com>2023-02-02 11:19:00 +0900
committerWilliam Hubbs <w.d.hubbs@gmail.com>2023-04-24 22:06:41 -0500
commit0b9c3c080388476519ac3385c21518cc5a94735a (patch)
treed42f9943159e9dea6c9f6b369b888224a377167f
parenta3c721b6821f1ecbe7ac567becc13df08b416f36 (diff)
openrc-run: silence lock failures with --no-deps
work around scary warnings described in previous commit
-rw-r--r--src/openrc-run/openrc-run.c4
-rw-r--r--src/shared/misc.c12
-rw-r--r--src/shared/misc.h2
3 files changed, 13 insertions, 5 deletions
diff --git a/src/openrc-run/openrc-run.c b/src/openrc-run/openrc-run.c
index e9a064f8..bf64a1b3 100644
--- a/src/openrc-run/openrc-run.c
+++ b/src/openrc-run/openrc-run.c
@@ -612,7 +612,7 @@ svc_start_check(void)
}
if (exclusive_fd == -1)
- exclusive_fd = svc_lock(applet);
+ exclusive_fd = svc_lock(applet, !deps);
if (exclusive_fd == -1) {
if (errno == EACCES)
eerrorx("%s: superuser access required", applet);
@@ -864,7 +864,7 @@ svc_stop_check(RC_SERVICE *state)
exit(EXIT_FAILURE);
if (exclusive_fd == -1)
- exclusive_fd = svc_lock(applet);
+ exclusive_fd = svc_lock(applet, !deps);
if (exclusive_fd == -1) {
if (errno == EACCES)
eerrorx("%s: superuser access required", applet);
diff --git a/src/shared/misc.c b/src/shared/misc.c
index 28f95b34..c987ce8c 100644
--- a/src/shared/misc.c
+++ b/src/shared/misc.c
@@ -234,7 +234,7 @@ signal_setup_restart(int sig, void (*handler)(int))
}
int
-svc_lock(const char *applet)
+svc_lock(const char *applet, bool ignore_lock_failure)
{
char *file = NULL;
int fd;
@@ -245,6 +245,14 @@ svc_lock(const char *applet)
if (fd == -1)
return -1;
if (flock(fd, LOCK_EX | LOCK_NB) == -1) {
+ if (ignore_lock_failure) {
+ /* Two services with a need b, and b's start()
+ * calling restart --no-deps on a would cause
+ * harmless errors: just ignore them.
+ * See https://github.com/OpenRC/openrc/issues/224
+ */
+ exit(EXIT_SUCCESS);
+ }
eerror("Call to flock failed: %s", strerror(errno));
close(fd);
return -1;
@@ -274,7 +282,7 @@ exec_service(const char *service, const char *arg)
sigset_t old;
struct sigaction sa;
- fd = svc_lock(basename_c(service));
+ fd = svc_lock(basename_c(service), false);
if (fd == -1)
return -1;
diff --git a/src/shared/misc.h b/src/shared/misc.h
index 099206c8..f4ab25ad 100644
--- a/src/shared/misc.h
+++ b/src/shared/misc.h
@@ -50,7 +50,7 @@ void env_filter(void);
void env_config(void);
int signal_setup(int sig, void (*handler)(int));
int signal_setup_restart(int sig, void (*handler)(int));
-int svc_lock(const char *);
+int svc_lock(const char *, bool);
int svc_unlock(const char *, int);
pid_t exec_service(const char *, const char *);