DVB_TABLE_PAT, DVB_TABLE_PAT_PID,
(uint8_t **) &dvb_scan_handler->pat,
pat_pmt_time * timeout_multiply);
+ if (parms->abort)
+ return dvb_scan_handler;
if (rc < 0) {
dvb_logerr("error while waiting for PAT table");
dvb_scan_free_handler_table(dvb_scan_handler);
atsc_filter, DVB_TABLE_VCT_PID,
(uint8_t **)&dvb_scan_handler->vct,
vct_time * timeout_multiply);
+ if (parms->abort)
+ return dvb_scan_handler;
if (rc < 0)
dvb_logerr("error while waiting for VCT table");
else if (parms->verbose)
DVB_TABLE_PMT, program->pid,
(uint8_t **)&dvb_scan_handler->program[num_pmt].pmt,
pat_pmt_time * timeout_multiply);
+ if (parms->abort) {
+ dvb_scan_handler->num_program = num_pmt + 1;
+ return dvb_scan_handler;
+ }
if (rc < 0) {
dvb_logerr("error while reading the PMT table for service 0x%04x",
program->service_id);
DVB_TABLE_NIT, DVB_TABLE_NIT_PID,
(uint8_t **)&dvb_scan_handler->nit,
nit_time * timeout_multiply);
+ if (parms->abort)
+ return dvb_scan_handler;
if (rc < 0)
dvb_logerr("error while reading the NIT table");
else if (parms->verbose)
DVB_TABLE_SDT, DVB_TABLE_SDT_PID,
(uint8_t **)&dvb_scan_handler->sdt,
sdt_time * timeout_multiply);
+ if (parms->abort)
+ return dvb_scan_handler;
if (rc < 0)
dvb_logerr("error while reading the SDT table");
else if (parms->verbose)
DVB_TABLE_NIT2, DVB_TABLE_NIT_PID,
(uint8_t **)&dvb_scan_handler->nit,
nit_time * timeout_multiply);
+ if (parms->abort)
+ return dvb_scan_handler;
if (rc < 0)
dvb_logerr("error while reading the NIT table");
else if (parms->verbose)
DVB_TABLE_SDT2, DVB_TABLE_SDT_PID,
(uint8_t **)&dvb_scan_handler->sdt,
sdt_time * timeout_multiply);
+ if (parms->abort)
+ return dvb_scan_handler;
if (rc < 0)
dvb_logerr("error while reading the SDT table");
else if (parms->verbose)
args->n_status_lines = 0;
for (i = 0; i < args->timeout_multiply * 40; i++) {
+ if (parms->abort)
+ return 0;
rc = dvb_fe_get_stats(parms);
if (rc)
PERROR("dvb_fe_get_stats failed");
args->other_nit,
args->timeout_multiply);
+ if (parms->abort) {
+ dvb_scan_free_handler_table(dvb_scan_handler);
+ break;
+ }
if (!dvb_scan_handler)
continue;
return 0;
}
+static int *timeout_flag;
+
+static void do_timeout(int x)
+{
+ (void)x;
+ if (*timeout_flag == 0) {
+ *timeout_flag = 1;
+ alarm(5);
+ signal(SIGALRM, do_timeout);
+ } else {
+ /* something has gone wrong ... exit */
+ exit(1);
+ }
+}
+
+
int main(int argc, char **argv)
{
struct arguments args;
- int lnb = -1,idx = -1;
+ int err, lnb = -1,idx = -1;
const struct argp argp = {
.options = options,
.parser = parse_opt,
parms->diseqc_wait = args.diseqc_wait;
parms->freq_bpf = args.freq_bpf;
- if (run_scan(&args, parms)) {
- dvb_fe_close(parms);
- free(args.demux_dev);
- return -1;
- }
+ timeout_flag = &parms->abort;
+ signal(SIGTERM, do_timeout);
+ signal(SIGINT, do_timeout);
- dvb_fe_close(parms);
+ err = run_scan(&args, parms);
+ dvb_fe_close(parms);
free(args.demux_dev);
- return 0;
+ return err;
}