int dvr_extra_time_pre;
int dvr_extra_time_post;
char *dvr_postproc;
+int dvr_iov_max;
static int de_tally;
-
struct dvr_entry_list dvrentries;
static void dvr_entry_save(dvr_entry_t *de);
struct stat st;
uint32_t u32;
+ dvr_iov_max = sysconf(_SC_IOV_MAX);
+
/* Default settings */
dvr_retention_days = 31;
#include "mkmux.h"
#include "ebml.h"
+extern int dvr_iov_max;
+
TAILQ_HEAD(mk_cue_queue, mk_cue);
#define MATROSKA_TIMESCALE 1000000 // in nS
iov[i ].iov_base = hd->hd_data + hd->hd_data_off;
iov[i++].iov_len = hd->hd_data_len - hd->hd_data_off;
}
-
- if(writev(mkm->fd, iov, i) != hq->hq_size) {
- mkm->error = errno;
- tvhlog(LOG_ERR, "MKV", "%s: Unable to write -- %s",
- mkm->filename, strerror(errno));
- } else {
- mkm->fdpos += hq->hq_size;
- }
+
+ do {
+ ssize_t r;
+ int iovcnt = i < dvr_iov_max ? i : dvr_iov_max;
+ if((r = writev(mkm->fd, iov, iovcnt)) == -1) {
+ mkm->error = errno;
+ tvhlog(LOG_ERR, "MKV", "%s: Unable to write -- %s",
+ mkm->filename, strerror(errno));
+ return;
+ }
+ mkm->fdpos += r;
+ i -= iovcnt;
+ iov += iovcnt;
+ } while(i);
}