X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/record-dvb/blobdiff_plain/4710a9f88a22ea44ad4ec216e6c379783e1079e3..657d048dbd935b019e08009cb337ea999d762e83:/record-dvb.c diff --git a/record-dvb.c b/record-dvb.c index 02fcd51..bb69447 100644 --- a/record-dvb.c +++ b/record-dvb.c @@ -13,13 +13,15 @@ #include "http.h" #include "mcast.h" -#define CHUNKSIZE 3000 -#define GTOD_INTERVAL 100 +#define CHUNKSIZE 3000 +#define GTOD_INTERVAL 100 +#define MAX_ERROR_SLEEP 60 void record(int(*open_fn)(char *), char *url, char *outfile, int duration) { struct timeval start, curr; int bytes, recvd, written, count = 0; + int error_sleep = 0; char buffer[CHUNKSIZE]; int in, out; @@ -39,13 +41,28 @@ void record(int(*open_fn)(char *), char *url, char *outfile, int duration) curr = start; do { - if ((recvd = recv(in, buffer, CHUNKSIZE, 0)) < 1) { - /* TODO: Insert better connection-loss recovery here */ + if (error_sleep) { + sleep(error_sleep); + printf("Reconnecting... "); if ((in = (*open_fn)(url)) < 0) { - sleep(1); + if (error_sleep < MAX_ERROR_SLEEP) + error_sleep *= 2; + + if (error_sleep > MAX_ERROR_SLEEP) + error_sleep = MAX_ERROR_SLEEP; + + printf("failed\n"); continue; + } else { + printf("succeeded\n"); + error_sleep = 0; } } + + if ((recvd = recv(in, buffer, CHUNKSIZE, 0)) < 1) { + error_sleep = 1; + continue; + } written = 0; do { if ((bytes = write(out, buffer, recvd-written)) < 0) {