summaryrefslogtreecommitdiffstats
path: root/term-utils/script.c
diff options
context:
space:
mode:
authorSami Kerola2014-12-26 23:32:25 +0100
committerSami Kerola2015-06-08 22:53:34 +0200
commita8896ad5b7fe6447326d26dc8addb69b0f3fb347 (patch)
tree161cd4def986f338524128386df7003e1ae82908 /term-utils/script.c
parentscript: add 'Script started' line always to capture file (diff)
downloadkernel-qcow2-util-linux-a8896ad5b7fe6447326d26dc8addb69b0f3fb347.tar.gz
kernel-qcow2-util-linux-a8896ad5b7fe6447326d26dc8addb69b0f3fb347.tar.xz
kernel-qcow2-util-linux-a8896ad5b7fe6447326d26dc8addb69b0f3fb347.zip
script: move do_io() content to small functions
The do_io() got to be a bit long with relatively deep indentation. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'term-utils/script.c')
-rw-r--r--term-utils/script.c108
1 files changed, 58 insertions, 50 deletions
diff --git a/term-utils/script.c b/term-utils/script.c
index 27c1bdb72..86864b00a 100644
--- a/term-utils/script.c
+++ b/term-utils/script.c
@@ -240,14 +240,63 @@ static void write_output(struct script_control *ctl, char *obuf,
}
}
-static void do_io(struct script_control *ctl)
+static void handle_io(struct script_control *ctl, int fd, double *oldtime, int i)
{
char buf[BUFSIZ];
+ ssize_t bytes;
+
+ bytes = read(fd, buf, sizeof(buf));
+ if (bytes < 0) {
+ if (errno == EAGAIN)
+ return;
+ fail(ctl);
+ }
+ if (i == 0) {
+ if (write_all(ctl->master, buf, bytes)) {
+ warn(_("write failed"));
+ fail(ctl);
+ }
+ /* without sync write_output() will write both input &
+ * shell output that looks like double echoing */
+ fdatasync(ctl->master);
+ if (!ctl->isterm && feof(stdin)) {
+ char c = DEF_EOF;
+ write_all(ctl->master, &c, sizeof(char));
+ }
+ } else
+ write_output(ctl, buf, bytes, oldtime);
+}
+
+static void handle_signal(struct script_control *ctl, int fd)
+{
+ struct signalfd_siginfo info;
+ ssize_t bytes;
+
+ bytes = read(fd, &info, sizeof(info));
+ assert(bytes == sizeof(info));
+ switch (info.ssi_signo) {
+ case SIGCHLD:
+ finish(ctl, 0);
+ ctl->poll_timeout = 10;
+ return;
+ case SIGWINCH:
+ if (ctl->isterm) {
+ ioctl(STDIN_FILENO, TIOCGWINSZ, (char *)&ctl->win);
+ ioctl(ctl->slave, TIOCSWINSZ, (char *)&ctl->win);
+ }
+ break;
+ default:
+ abort();
+ }
+}
+
+static void do_io(struct script_control *ctl)
+{
struct pollfd pfd[POLLFDS];
int ret, i;
- ssize_t bytes;
double oldtime = time(NULL);
time_t tvec = script_time((time_t *)NULL);
+ char buf[128];
if (ctl->tflg && !ctl->timingfp)
ctl->timingfp = fdopen(STDERR_FILENO, "w");
@@ -277,57 +326,16 @@ static void do_io(struct script_control *ctl)
if (pfd[i].revents == 0)
continue;
if (i < 2) {
- bytes = read(pfd[i].fd, buf, BUFSIZ);
- if (bytes < 0) {
- if (errno == EAGAIN)
- continue;
- fail(ctl);
- }
- if (i == 0) {
- if (write_all(ctl->master, buf, bytes)) {
- warn(_("write failed"));
- fail(ctl);
- } else
-
- /* without sync write_output()
- * will write both input &
- * shell output that looks like
- * double echoing */
- fdatasync(ctl->master);
- if (!ctl->isterm && feof(stdin)) {
- char c = DEF_EOF;
- write_all(ctl->master, &c, sizeof(char));
- }
- } else
- write_output(ctl, buf, bytes, &oldtime);
+ handle_io(ctl, pfd[i].fd, &oldtime, i);
continue;
}
if (i == 2) {
- struct signalfd_siginfo info;
- ssize_t read_bytes;
-
- read_bytes = read(pfd[i].fd, &info, sizeof(info));
- assert(read_bytes == sizeof(info));
- switch (info.ssi_signo) {
- case SIGCHLD:
- finish(ctl, 0);
- ctl->poll_timeout = 10;
- if (!ctl->isterm)
- /* In situation such as 'date' in
- * $ echo date | ./script
- * ignore input when shell has
- * exited. */
- pfd[0].fd = -1;
- break;
- case SIGWINCH:
- if (ctl->isterm) {
- ioctl(STDIN_FILENO, TIOCGWINSZ, (char *)&ctl->win);
- ioctl(ctl->slave, TIOCSWINSZ, (char *)&ctl->win);
- }
- break;
- default:
- abort();
- }
+ handle_signal(ctl, pfd[i].fd);
+ if (!ctl->isterm && -1 < ctl->poll_timeout)
+ /* In situation such as 'date' in
+ * $ echo date | ./script
+ * ignore input when shell has exited. */
+ pfd[0].fd = -1;
}
}
}