#include <sys/types.h>
#include <sys/wait.h>
#include <termios.h>
-#include <unistd.h>
#include <paths.h>
#include "c.h"
fputs(_(" -B, --log-io <file> script stdin and stdout log file\n"), out);
fputs(USAGE_SEPARATOR, out);
+ fputs(_(" -c, --command <command> run command rather than interactive shell\n"), out);
fputs(_(" -d, --divisor <num> speed up or slow down execution with time divisor\n"), out);
fputs(_(" -m, --maxdelay <num> wait at most this many seconds between updates\n"), out);
printf(USAGE_HELP_OPTIONS(25));
struct timeval *delay;
rc = replay_get_next_step(ss->setup, "I", &ss->step);
+ if (rc == 1) {
+ ul_pty_write_eof_to_child(ss->pty);
+ rc = 0;
+ break;
+ }
if (rc)
break;
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'},
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;
argv += optind;
idx = 0;
- if (!isatty(STDIN_FILENO))
- errx(EXIT_FAILURE, _("stdin is not terminal"));
-
if (!log_tm && idx < argc)
log_tm = argv[idx++];
if (!log_in && !log_io && idx < argc)
if (shell == NULL)
shell = _PATH_BSHELL;
- fprintf(stdout, _(">>> scriptlive: Starting your typescript execution by %s.\n"), shell);
+ fprintf(stdout, _(">>> scriptlive: Starting your typescript execution by %s.\n"),
+ command ? command : shell);
ul_pty_init_debug(0);
cb->child_sigstop = callback_child_sigstop;
cb->mainloop = mainloop_cb;
+ if (!isatty(STDIN_FILENO))
+ /* We keep ECHO flag for compatibility with script(1) */
+ ul_pty_slave_echo(ss.pty, 1);
+
if (ul_pty_setup(ss.pty))
err(EXIT_FAILURE, _("failed to create pseudo-terminal"));
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;
}