From: Karel Zak Date: Fri, 22 Nov 2019 12:48:29 +0000 (+0100) Subject: scriptlive: add --command, cleanup shell exec X-Git-Tag: v2.35-rc1~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ec363cfff188579ef62d451324ede9a40481434;p=thirdparty%2Futil-linux.git scriptlive: add --command, cleanup shell exec Signed-off-by: Karel Zak --- diff --git a/term-utils/scriptlive.c b/term-utils/scriptlive.c index 29d16557c0..9b99ccbefc 100644 --- a/term-utils/scriptlive.c +++ b/term-utils/scriptlive.c @@ -71,6 +71,7 @@ usage(void) fputs(_(" -B, --log-io script stdin and stdout log file\n"), out); fputs(USAGE_SEPARATOR, out); + fputs(_(" -c, --command run command rather than interactive shell\n"), out); fputs(_(" -d, --divisor speed up or slow down execution with time divisor\n"), out); fputs(_(" -m, --maxdelay wait at most this many seconds between updates\n"), out); printf(USAGE_HELP_OPTIONS(25)); @@ -170,6 +171,7 @@ main(int argc, char *argv[]) pid_t child; static const struct option longopts[] = { + { "command", required_argument, 0, 'c' }, { "timing", required_argument, 0, 't' }, { "log-timing", required_argument, 0, 'T' }, { "log-in", required_argument, 0, 'I'}, @@ -199,11 +201,14 @@ main(int argc, char *argv[]) replay_init_debug(); timerclear(&maxdelay); - while ((ch = getopt_long(argc, argv, "B:I:T:t:d:m:Vh", longopts, NULL)) != -1) { + while ((ch = getopt_long(argc, argv, "c:B:I:T:t:d:m:Vh", longopts, NULL)) != -1) { err_exclusive_options(ch, longopts, excl, excl_st); switch(ch) { + case 'c': + command = optarg; + break; case 't': case 'T': log_tm = optarg; @@ -308,10 +313,17 @@ main(int argc, char *argv[]) shname = strrchr(shell, '/'); shname = shname ? shname + 1 : shell; - if (command) - execl(shell, shname, "-c", command, NULL); - else - execl(shell, shname, "-i", NULL); + if (access(shell, X_OK) == 0) { + if (command) + execl(shell, shname, "-c", command, NULL); + else + execl(shell, shname, "-i", NULL); + } else { + if (command) + execlp(shname, "-c", command, NULL); + else + execlp(shname, "-i", NULL); + } err(EXIT_FAILURE, "failed to execute %s", shell); break; }