diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/openrc-run/openrc-run.c | 4 | ||||
| -rw-r--r-- | src/shared/misc.c | 12 | ||||
| -rw-r--r-- | src/shared/misc.h | 2 | 
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 *); | 
