mirror of
https://github.com/tmate-io/tmate-ssh-server.git
synced 2020-11-18 19:53:51 -08:00
71 lines
1.4 KiB
C
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
|