From 391e675c6f92f4019b9b90bcb521399480580aad Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 31 Oct 2016 12:50:31 +0100 Subject: flock: fix no-flock patch Addresses: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=842598 Signed-off-by: Karel Zak --- sys-utils/flock.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) (limited to 'sys-utils/flock.c') diff --git a/sys-utils/flock.c b/sys-utils/flock.c index ac473eecd..8ee17035b 100644 --- a/sys-utils/flock.c +++ b/sys-utils/flock.c @@ -115,6 +115,17 @@ static int open_file(const char *filename, int *flags) return fd; } +static void __attribute__((__noreturn__)) run_program(int fd, char **cmd_argv, int do_close) +{ + if (do_close) + close(fd); + + execvp(cmd_argv[0], cmd_argv); + + warn(_("failed to execute %s"), cmd_argv[0]); + _exit((errno == ENOMEM) ? EX_OSERR : EX_UNAVAILABLE); +} + int main(int argc, char *argv[]) { static timer_t t_id; @@ -333,16 +344,22 @@ int main(int argc, char *argv[]) if (!no_fork) { f = fork(); - if (f < 0) { + if (f < 0) err(EX_OSERR, _("fork failed")); - if (f != 0) { - do { - w = waitpid(f, &status, 0); - if (w == -1 && errno != EINTR) + + /* child */ + else if (f == 0) + run_program(fd, cmd_argv, do_close); + + /* parent */ + else { + do { + w = waitpid(f, &status, 0); + if (w == -1 && errno != EINTR) break; - } while (w != f); + } while (w != f); - if (w == -1) { + if (w == -1) { status = EXIT_FAILURE; warn(_("waitpid failed")); } else if (WIFEXITED(status)) @@ -352,18 +369,12 @@ int main(int argc, char *argv[]) else /* WTF? */ status = EX_OSERR; - } - goto out; } - } - if (do_close) - close(fd); - execvp(cmd_argv[0], cmd_argv); - /* execvp() failed */ - warn(_("failed to execute %s"), cmd_argv[0]); - _exit((errno == ENOMEM) ? EX_OSERR : EX_UNAVAILABLE); + + } else + /* no-fork execution */ + run_program(fd, cmd_argv, do_close); } -out: return status; } -- cgit v1.2.3-55-g7522