openrc-run: silence lock failures with --no-deps

work around scary warnings described in previous commit
This commit is contained in:
Dominique Martinet 2023-02-02 11:19:00 +09:00 committed by William Hubbs
parent a3c721b682
commit 0b9c3c0803
3 changed files with 13 additions and 5 deletions

View File

@ -612,7 +612,7 @@ svc_start_check(void)
} }
if (exclusive_fd == -1) if (exclusive_fd == -1)
exclusive_fd = svc_lock(applet); exclusive_fd = svc_lock(applet, !deps);
if (exclusive_fd == -1) { if (exclusive_fd == -1) {
if (errno == EACCES) if (errno == EACCES)
eerrorx("%s: superuser access required", applet); eerrorx("%s: superuser access required", applet);
@ -864,7 +864,7 @@ svc_stop_check(RC_SERVICE *state)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
if (exclusive_fd == -1) if (exclusive_fd == -1)
exclusive_fd = svc_lock(applet); exclusive_fd = svc_lock(applet, !deps);
if (exclusive_fd == -1) { if (exclusive_fd == -1) {
if (errno == EACCES) if (errno == EACCES)
eerrorx("%s: superuser access required", applet); eerrorx("%s: superuser access required", applet);

View File

@ -234,7 +234,7 @@ signal_setup_restart(int sig, void (*handler)(int))
} }
int int
svc_lock(const char *applet) svc_lock(const char *applet, bool ignore_lock_failure)
{ {
char *file = NULL; char *file = NULL;
int fd; int fd;
@ -245,6 +245,14 @@ svc_lock(const char *applet)
if (fd == -1) if (fd == -1)
return -1; return -1;
if (flock(fd, LOCK_EX | LOCK_NB) == -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)); eerror("Call to flock failed: %s", strerror(errno));
close(fd); close(fd);
return -1; return -1;
@ -274,7 +282,7 @@ exec_service(const char *service, const char *arg)
sigset_t old; sigset_t old;
struct sigaction sa; struct sigaction sa;
fd = svc_lock(basename_c(service)); fd = svc_lock(basename_c(service), false);
if (fd == -1) if (fd == -1)
return -1; return -1;

View File

@ -50,7 +50,7 @@ void env_filter(void);
void env_config(void); void env_config(void);
int signal_setup(int sig, void (*handler)(int)); int signal_setup(int sig, void (*handler)(int));
int signal_setup_restart(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); int svc_unlock(const char *, int);
pid_t exec_service(const char *, const char *); pid_t exec_service(const char *, const char *);