version 1.11, 2006/03/29 15:40:49 |
version 1.11.2.1, 2006/06/19 04:17:07 |
Line 47 __RCSID("$NetBSD$"); |
|
Line 47 __RCSID("$NetBSD$"); |
|
#include <sys/stat.h> |
#include <sys/stat.h> |
#include <sys/ioctl.h> |
#include <sys/ioctl.h> |
#include <sys/time.h> |
#include <sys/time.h> |
|
#include <sys/param.h> |
#include <sys/uio.h> |
#include <sys/uio.h> |
|
|
#include <err.h> |
#include <err.h> |
Line 63 __RCSID("$NetBSD$"); |
|
Line 64 __RCSID("$NetBSD$"); |
|
#include <unistd.h> |
#include <unistd.h> |
#include <util.h> |
#include <util.h> |
|
|
|
#define DEF_BUF 65536 |
|
|
struct stamp { |
struct stamp { |
uint64_t scr_len; /* amount of data */ |
uint64_t scr_len; /* amount of data */ |
uint64_t scr_sec; /* time it arrived in seconds... */ |
uint64_t scr_sec; /* time it arrived in seconds... */ |
Line 314 playback(FILE *fscript) |
|
Line 317 playback(FILE *fscript) |
|
{ |
{ |
struct timespec tsi, tso; |
struct timespec tsi, tso; |
struct stamp stamp; |
struct stamp stamp; |
char buf[BUFSIZ]; |
struct stat playback_stat; |
|
char buf[DEF_BUF]; |
|
off_t nread, save_len; |
size_t l; |
size_t l; |
time_t clock; |
time_t clock; |
|
|
do { |
if (fstat(fileno(fscript), &playback_stat) == -1) |
|
err(1, "fstat failed"); |
|
|
|
for (nread = 0; nread < playback_stat.st_size; nread += save_len) { |
if (fread(&stamp, sizeof(stamp), 1, fscript) != 1) |
if (fread(&stamp, sizeof(stamp), 1, fscript) != 1) |
err(1, "reading playback header"); |
err(1, "reading playback header"); |
|
|
swapstamp(stamp); |
swapstamp(stamp); |
l = fread(buf, 1, stamp.scr_len, fscript); |
save_len = sizeof(stamp); |
|
|
|
if (stamp.scr_len > |
|
(uint64_t)(playback_stat.st_size - save_len) - nread) |
|
err(1, "invalid stamp"); |
|
|
|
save_len += stamp.scr_len; |
clock = stamp.scr_sec; |
clock = stamp.scr_sec; |
tso.tv_sec = stamp.scr_sec; |
tso.tv_sec = stamp.scr_sec; |
tso.tv_nsec = stamp.scr_usec * 1000; |
tso.tv_nsec = stamp.scr_usec * 1000; |
Line 332 playback(FILE *fscript) |
|
Line 345 playback(FILE *fscript) |
|
case 's': |
case 's': |
(void)printf("Script started on %s", ctime(&clock)); |
(void)printf("Script started on %s", ctime(&clock)); |
tsi = tso; |
tsi = tso; |
|
fseek(fscript, stamp.scr_len, SEEK_CUR); |
break; |
break; |
case 'e': |
case 'e': |
(void)printf("\nScript done on %s", ctime(&clock)); |
(void)printf("\nScript done on %s", ctime(&clock)); |
|
fseek(fscript, stamp.scr_len, SEEK_CUR); |
break; |
break; |
case 'i': |
case 'i': |
/* throw input away */ |
/* throw input away */ |
|
fseek(fscript, stamp.scr_len, SEEK_CUR); |
break; |
break; |
case 'o': |
case 'o': |
tsi.tv_sec = tso.tv_sec - tsi.tv_sec; |
tsi.tv_sec = tso.tv_sec - tsi.tv_sec; |
Line 349 playback(FILE *fscript) |
|
Line 365 playback(FILE *fscript) |
|
if (usesleep) |
if (usesleep) |
(void)nanosleep(&tsi, NULL); |
(void)nanosleep(&tsi, NULL); |
tsi = tso; |
tsi = tso; |
(void)write(STDOUT_FILENO, buf, l); |
while (stamp.scr_len > 0) { |
|
l = MIN(DEF_BUF, stamp.scr_len); |
|
if (fread(buf, sizeof(char), l, fscript) != l) |
|
err(1, "cannot read buffer"); |
|
|
|
(void)write(STDOUT_FILENO, buf, l); |
|
stamp.scr_len -= l; |
|
} |
break; |
break; |
|
default: |
|
err(1, "invalid direction"); |
} |
} |
} while (stamp.scr_direction != 'e'); |
} |
|
|
(void)fclose(fscript); |
(void)fclose(fscript); |
exit(0); |
exit(0); |
} |
} |