1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00
tmate-ssh-server/tmate-replayer.c
2013-07-10 22:48:24 -04:00

71 lines
1.4 KiB
C

#include <ctype.h>
#include <unistd.h>
#include "tmate.h"
#ifdef TMATE_RECORD_REPLAY
#define READ_MAX_SIZE 1024
#define TIMER_INERVAL_USEC 1000
extern int server_shutdown;
extern void server_send_shutdown(void);
static void start_timer(struct tmate_replayer *replayer);
static void on_read_timer(evutil_socket_t fd, short what, void *arg)
{
struct tmate_replayer *replayer = arg;
char *buf;
ssize_t len;
if (replayer->log_fd < 0) {
evtimer_del(&replayer->ev_read_timer);
server_shutdown = 1;
server_send_shutdown();
return;
}
tmate_decoder_get_buffer(replayer->decoder, &buf, &len);
if (len == 0)
tmate_fatal("Decoder buffer full");
if (len > READ_MAX_SIZE)
len = READ_MAX_SIZE;
len = read(replayer->log_fd, buf, len);
if (len < 0)
tmate_fatal("cannot read from replay log file");
if (len == 0) {
tmate_info("Replay file reached EOF");
replayer->log_fd = -1;
} else {
tmate_decoder_commit(replayer->decoder, len);
}
start_timer(replayer);
}
static void start_timer(struct tmate_replayer *replayer)
{
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = TIMER_INERVAL_USEC;
evtimer_assign(&replayer->ev_read_timer, ev_base,
on_read_timer, replayer);
evtimer_add(&replayer->ev_read_timer, &tv);
}
void tmate_replayer_init(struct tmate_replayer *replayer,
struct tmate_decoder *decoder,
int log_fd)
{
replayer->decoder = decoder;
replayer->log_fd = log_fd;
start_timer(replayer);
}
#endif