| From e1d426fd65c00a6d01a10d85edf8a294ae8a2d2b Mon Sep 17 00:00:00 2001 |
| From: Denys Vlasenko <vda.linux@googlemail.com> |
| Date: Sun, 24 Apr 2016 18:19:49 +0200 |
| Subject: [PATCH] flock: fix -c; improve error handling of fork+exec |
| |
| function old new delta |
| flock_main 254 334 +80 |
| |
| Upstream-Status: Backport |
| |
| Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> |
| Signed-off-by: Maxin B. John <maxin.john@intel.com> |
| --- |
| util-linux/flock.c | 19 +++++++++++++++++-- |
| 1 file changed, 17 insertions(+), 2 deletions(-) |
| |
| diff --git a/util-linux/flock.c b/util-linux/flock.c |
| index 05a747f..539a835 100644 |
| --- a/util-linux/flock.c |
| +++ b/util-linux/flock.c |
| @@ -57,7 +57,6 @@ int flock_main(int argc UNUSED_PARAM, char **argv) |
| /* If it is "flock FILE -c PROG", then -c isn't caught by getopt32: |
| * we use "+" in order to support "flock -opt FILE PROG -with-opts", |
| * we need to remove -c by hand. |
| - * TODO: in upstream, -c 'PROG ARGS' means "run sh -c 'PROG ARGS'" |
| */ |
| if (argv[0] |
| && argv[0][0] == '-' |
| @@ -66,6 +65,9 @@ int flock_main(int argc UNUSED_PARAM, char **argv) |
| ) |
| ) { |
| argv++; |
| + if (argv[1]) |
| + bb_error_msg_and_die("-c takes only one argument"); |
| + opt |= OPT_c; |
| } |
| |
| if (OPT_s == LOCK_SH && OPT_x == LOCK_EX && OPT_n == LOCK_NB && OPT_u == LOCK_UN) { |
| @@ -90,8 +92,21 @@ int flock_main(int argc UNUSED_PARAM, char **argv) |
| bb_perror_nomsg_and_die(); |
| } |
| |
| - if (argv[0]) |
| + if (argv[0]) { |
| + if (!(opt & OPT_c)) { |
| + int rc = spawn_and_wait(argv); |
| + if (rc < 0) |
| + bb_simple_perror_msg(argv[0]); |
| + return rc; |
| + } |
| + /* -c 'PROG ARGS' means "run sh -c 'PROG ARGS'" */ |
| + argv -= 2; |
| + argv[0] = (char*)get_shell_name(); |
| + argv[1] = (char*)"-c"; |
| + /* argv[2] = "PROG ARGS"; */ |
| + /* argv[3] = NULL; */ |
| return spawn_and_wait(argv); |
| + } |
| |
| return EXIT_SUCCESS; |
| } |
| -- |
| 2.4.0 |
| |