summaryrefslogtreecommitdiffstats
path: root/sys-utils/flock.c
diff options
context:
space:
mode:
authorKarel Zak2016-10-31 12:50:31 +0100
committerKarel Zak2016-10-31 12:50:31 +0100
commit391e675c6f92f4019b9b90bcb521399480580aad (patch)
treeb6c37d75234dfd2fd39d3060a2f04765f47f52f3 /sys-utils/flock.c
parentmount: append inverting options for mount.<type> on "users" (diff)
downloadkernel-qcow2-util-linux-391e675c6f92f4019b9b90bcb521399480580aad.tar.gz
kernel-qcow2-util-linux-391e675c6f92f4019b9b90bcb521399480580aad.tar.xz
kernel-qcow2-util-linux-391e675c6f92f4019b9b90bcb521399480580aad.zip
flock: fix no-flock patch
Addresses: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=842598 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils/flock.c')
-rw-r--r--sys-utils/flock.c45
1 files changed, 28 insertions, 17 deletions
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;
}