summaryrefslogtreecommitdiffstats
path: root/term-utils/script.c
diff options
context:
space:
mode:
authorSami Kerola2014-12-31 00:03:32 +0100
committerSami Kerola2015-06-08 22:53:36 +0200
commit04639805e12e343c007746e23cb42c1fa7efbb2a (patch)
tree6cf4723a2f12c01dd44a96e3ae179dd6d57766d5 /term-utils/script.c
parentscript: use correct input type, move comment, and so on (diff)
downloadkernel-qcow2-util-linux-04639805e12e343c007746e23cb42c1fa7efbb2a.tar.gz
kernel-qcow2-util-linux-04639805e12e343c007746e23cb42c1fa7efbb2a.tar.xz
kernel-qcow2-util-linux-04639805e12e343c007746e23cb42c1fa7efbb2a.zip
script: use gettime_monotonic() to get timing file timestamps
This moves the previous time to script control structure, and does timeval calculation with timersub() that is more appropriate than making a timeval to a double. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'term-utils/script.c')
-rw-r--r--term-utils/script.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/term-utils/script.c b/term-utils/script.c
index a085c53db..52c15f2e0 100644
--- a/term-utils/script.c
+++ b/term-utils/script.c
@@ -71,6 +71,7 @@
#include "c.h"
#include "ttyutils.h"
#include "all-io.h"
+#include "monotonic.h"
#if defined(HAVE_LIBUTIL) && defined(HAVE_PTY_H)
# include <pty.h>
@@ -90,6 +91,7 @@ struct script_control {
char *fname; /* output file path */
FILE *typescriptfp; /* output file pointer */
FILE *timingfp; /* timing file pointer */
+ struct timeval oldtime; /* previous write or command start time */
int master; /* pseudoterminal master file descriptor */
int slave; /* pseudoterminal slave file descriptor */
int poll_timeout; /* poll() timeout, used in end of execution */
@@ -205,19 +207,17 @@ static void finish(struct script_control *ctl, int wait)
}
static void write_output(struct script_control *ctl, char *obuf,
- ssize_t bytes, double *oldtime)
+ ssize_t bytes)
{
-
if (ctl->tflg && ctl->timingfp) {
- struct timeval tv;
- double newtime;
+ struct timeval now, delta;
- gettimeofday(&tv, NULL);
- newtime = tv.tv_sec + (double)tv.tv_usec / 1000000;
- fprintf(ctl->timingfp, "%f %zd\n", newtime - *oldtime, bytes);
+ gettime_monotonic(&now);
+ timersub(&now, &ctl->oldtime, &delta);
+ fprintf(ctl->timingfp, "%ld.%06ld %zd\n", delta.tv_sec, delta.tv_usec, bytes);
if (ctl->fflg)
fflush(ctl->timingfp);
- *oldtime = newtime;
+ ctl->oldtime = now;
}
if (fwrite_all(obuf, 1, bytes, ctl->typescriptfp)) {
warn(_("cannot write script file"));
@@ -231,7 +231,7 @@ static void write_output(struct script_control *ctl, char *obuf,
}
}
-static void handle_io(struct script_control *ctl, int fd, double *oldtime, int i)
+static void handle_io(struct script_control *ctl, int fd, int i)
{
char buf[BUFSIZ];
ssize_t bytes;
@@ -255,7 +255,7 @@ static void handle_io(struct script_control *ctl, int fd, double *oldtime, int i
write_all(ctl->master, &c, sizeof(char));
}
} else
- write_output(ctl, buf, bytes, oldtime);
+ write_output(ctl, buf, bytes);
}
static void handle_signal(struct script_control *ctl, int fd)
@@ -285,7 +285,6 @@ static void do_io(struct script_control *ctl)
{
struct pollfd pfd[POLLFDS];
int ret, i;
- double oldtime = time(NULL);
time_t tvec = script_time((time_t *)NULL);
char buf[128];
@@ -301,6 +300,7 @@ static void do_io(struct script_control *ctl)
strftime(buf, sizeof buf, "%c\n", localtime(&tvec));
fprintf(ctl->typescriptfp, _("Script started on %s"), buf);
+ gettime_monotonic(&ctl->oldtime);
while (!ctl->die) {
/* wait for input or signal */
@@ -317,7 +317,7 @@ static void do_io(struct script_control *ctl)
if (pfd[i].revents == 0)
continue;
if (i < 2) {
- handle_io(ctl, pfd[i].fd, &oldtime, i);
+ handle_io(ctl, pfd[i].fd, i);
continue;
}
if (i == 2) {