home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / bin / scriptreplay < prev    next >
Text File  |  2006-11-29  |  2KB  |  84 lines

  1. #!/usr/bin/perl -w
  2.  
  3. # "script -t" will output a typescript with timings
  4. # this script "scriptreplay" replays it
  5. # run pod2man on it to get a man page
  6.  
  7. =head1 NAME
  8.  
  9. scriptreplay - play back typescripts, using timing information
  10.  
  11. =head1 SYNOPSIS
  12.  
  13. scriptreplay timingfile [typescript [divisor]]
  14.  
  15. =head1 DESCRIPTION
  16.  
  17. This program replays a typescript, using timing information to ensure that
  18. output happens at the same speed as it originally appeared when the script
  19. was recorded. It is only guaranteed to work properly if run on the same
  20. terminal the script was recorded on.
  21.  
  22. The timings information is what script outputs to standard error if it is
  23. run with the -t parameter.
  24.  
  25. By default, the typescript to display is assumed to be named "typescript",
  26. but other filenames may be specified, as the second parameter.
  27.  
  28. If the third parameter exits, it is used as a time divisor. For example,
  29. specifying a divisor of 2 makes the script be replayed twice as fast.
  30.  
  31. =head1 EXAMPLE
  32.  
  33.  % script -t 2> timingfile
  34.  Script started, file is typescript
  35.  % ls
  36.  <etc, etc>
  37.  % exit
  38.  Script done, file is typescript
  39.  % scriptreplay timingfile
  40.  
  41. =cut
  42.  
  43. use strict;
  44. $|=1;
  45. open (TIMING, shift)
  46.         or die "cannot read timing info: $!";
  47. open (TYPESCRIPT, shift || 'typescript')
  48.         or die "cannot read typescript: $!";
  49. my $divisor=shift || 1;
  50.  
  51. # Read starting timestamp line and ignore.
  52. <TYPESCRIPT>;
  53.  
  54. my $block;
  55. my $oldblock='';
  56. while (<TIMING>) {
  57.         my ($delay, $blocksize)=split ' ', $_, 2;
  58.         # Sleep, unless the delay is really tiny. Really tiny delays cannot
  59.         # be accurately done, because the system calls in this loop will
  60.         # have more overhead. The 0.0001 is arbitrary, but works fairly well.
  61.         if ($delay / $divisor > 0.0001) {
  62.                 select(undef, undef, undef, $delay / $divisor - 0.0001);
  63.         }
  64.  
  65.         read(TYPESCRIPT, $block, $blocksize)
  66.                 or die "read failure on typescript: $!";
  67.         print $oldblock;
  68.         $oldblock=$block;
  69. }
  70. print $oldblock;
  71.  
  72. =head1 SEE ALSO
  73.  
  74. script(1)
  75.  
  76. =head1 COPYRIGHT
  77.  
  78. This program is in the public domain.
  79.  
  80. =head1 AUTHOR
  81.  
  82. Joey Hess <joey@kitenet.net>
  83.  
  84.