From 198f18addf1d814c2fefcb492f3b9fbd221669bb Mon Sep 17 00:00:00 2001 From: "Maxin B. John" Date: Wed, 20 Apr 2016 18:24:45 +0300 Subject: [PATCH] flock: update the behaviour of -c parameter to match upstream In upstream, -c 'PROG ARGS' means "run sh -c 'PROG ARGS'" function old new delta flock_main 286 377 +91 .rodata 155849 155890 +41 Upstream-Status: Submitted [ http://lists.busybox.net/pipermail/busybox/2016-April/084142.html ] Signed-off-by: Maxin B. John --- util-linux/flock.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/util-linux/flock.c b/util-linux/flock.c index 05a747f..c85a25d 100644 --- a/util-linux/flock.c +++ b/util-linux/flock.c @@ -20,6 +20,7 @@ int flock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int flock_main(int argc UNUSED_PARAM, char **argv) { int mode, opt, fd; + char *cmd_args[4]; enum { OPT_s = (1 << 0), OPT_x = (1 << 1), @@ -57,7 +58,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] == '-' @@ -65,7 +65,10 @@ int flock_main(int argc UNUSED_PARAM, char **argv) || (ENABLE_LONG_OPTS && strcmp(argv[0] + 1, "-command") == 0) ) ) { - argv++; + if (argc != optind + 3) + bb_error_msg_and_die("-c requires exactly one command argument"); + else + argv++; } if (OPT_s == LOCK_SH && OPT_x == LOCK_EX && OPT_n == LOCK_NB && OPT_u == LOCK_UN) { @@ -89,9 +92,14 @@ int flock_main(int argc UNUSED_PARAM, char **argv) return EXIT_FAILURE; bb_perror_nomsg_and_die(); } - - if (argv[0]) - return spawn_and_wait(argv); - + if (argv[0]) { + cmd_args[0] = getenv("SHELL"); + if (!cmd_args[0]) + cmd_args[0] = (char*)DEFAULT_SHELL; + cmd_args[1] = (char*)"-c"; + cmd_args[2] = argv[0]; + cmd_args[3] = NULL; + return spawn_and_wait(cmd_args); + } return EXIT_SUCCESS; } -- 2.4.0