-typedef void *feedfile_got_article(oop_source *lp, oop_read *rd,
- oop_rd_event ev, const char *errmsg,
- int errnoval,
- const char *data, size_t recsz,
- void *ipf_v) {
+static void *feedfile_got_bad_data(InputFile *ipf, off_t offset,
+ const char *data, const char *how) {
+ warn("corrupted file: %s, offset %lu: %s: %s",
+ ipf->path, (unsigned long)offset, how, sanitise(data));
+ ipf->readcount_err++;
+ if (ipf->readcount_err > max_bad_data_initial +
+ (ipf->readcount_ok+ipf->readcount_blank) / max_bad_data_ratio)
+ die("too much garbage in input file! (%d errs, %d ok, %d blank)",
+ ipf->readcount_err, ipf->readcount_ok, ipf->readcount_blank);
+ return OOP_CONTINUE;
+}
+
+static void *feedfile_read_err(oop_source *lp, oop_read *rd,
+ oop_rd_event ev, const char *errmsg,
+ int errnoval, const char *data, size_t recsz,
+ void *ipf_v) {
+ InputFile *ipf= ipf_v;
+ assert(ev == OOP_RD_SYSTEM);
+ errno= errnoval;
+ sysdie("error reading input file: %s, offset %lu",
+ ipf->path, (unsigned long)ipf->offset);
+}
+
+static void *feedfile_got_article(oop_source *lp, oop_read *rd,
+ oop_rd_event ev, const char *errmsg,
+ int errnoval, const char *data, size_t recsz,
+ void *ipf_v) {