summaryrefslogtreecommitdiffstats
path: root/misc-utils/scriptreplay.pl
diff options
context:
space:
mode:
Diffstat (limited to 'misc-utils/scriptreplay.pl')
-rwxr-xr-xmisc-utils/scriptreplay.pl83
1 files changed, 83 insertions, 0 deletions
diff --git a/misc-utils/scriptreplay.pl b/misc-utils/scriptreplay.pl
new file mode 100755
index 000000000..ea72b1f3e
--- /dev/null
+++ b/misc-utils/scriptreplay.pl
@@ -0,0 +1,83 @@
+#!/usr/bin/perl -w
+
+# "script -t" will output a typescript with timings
+# this script "scriptreplay" replays it
+# run pod2man on it to get a man page
+
+=head1 NAME
+
+scriptreplay - play back typescripts, using timing information
+
+=head1 SYNOPSIS
+
+scriptreplay timingfile [typescript [divisor]]
+
+=head1 DESCRIPTION
+
+This program replays a typescript, using timing information to ensure that
+output happens at the same speed as it originally appeared when the script
+was recorded. It is only guaranteed to work properly if run on the same
+terminal the script was recorded on.
+
+The timings information is what script outputs to standard error if it is
+run with the -t parameter.
+
+By default, the typescript to display is assumed to be named "typescript",
+but other filenames may be specified, as the second parameter.
+
+If the third parameter exits, it is used as a time divisor. For example,
+specifying a divisor of 2 makes the script be replayed twice as fast.
+
+=head1 EXAMPLE
+
+ % script -t 2> timingfile
+ Script started, file is typescript
+ % ls
+ <etc, etc>
+ % exit
+ Script done, file is typescript
+ % scriptreplay timingfile
+
+=cut
+
+use strict;
+$|=1;
+open (TIMING, shift)
+ or die "cannot read timing info: $!";
+open (TYPESCRIPT, shift || 'typescript')
+ or die "cannot read typescript: $!";
+my $divisor=shift || 1;
+
+# Read starting timestamp line and ignore.
+<TYPESCRIPT>;
+
+my $block;
+my $oldblock='';
+while (<TIMING>) {
+ my ($delay, $blocksize)=split ' ', $_, 2;
+ # Sleep, unless the delay is really tiny. Really tiny delays cannot
+ # be accurately done, because the system calls in this loop will
+ # have more overhead. The 0.0001 is arbitrary, but works fairly well.
+ if ($delay / $divisor > 0.0001) {
+ select(undef, undef, undef, $delay / $divisor - 0.0001);
+ }
+
+ read(TYPESCRIPT, $block, $blocksize)
+ or die "read failure on typescript: $!";
+ print $oldblock;
+ $oldblock=$block;
+}
+print $oldblock;
+
+=head1 SEE ALSO
+
+script(1)
+
+=head1 COPYRIGHT
+
+This program is in the public domain.
+
+=head1 AUTHOR
+
+Joey Hess <joey@kitenet.net>
+