int main(int argc, char **argv) { struct arguments args; char *homedir = getenv("HOME"); char *channel = NULL; int lnb = -1, idx = -1; int vpid = -1, apid = -1, sid = -1; int pmtpid = 0; int pat_fd = -1, pmt_fd = -1; int audio_fd = 0, video_fd = 0; int dvr_fd, file_fd; struct dvb_v5_fe_parms *parms; const struct argp argp = { .options = options, .parser = parse_opt, .doc = "DVB zap utility", .args_doc = "<initial file>", }; memset(&args, 0, sizeof(args)); args.sat_number = -1; argp_parse(&argp, argc, argv, 0, &idx, &args); if (idx < argc) channel = argv[idx]; if (!channel) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.input_format == FILE_UNKNOWN) { fprintf(stderr, "ERROR: Please specify a valid format\n"); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.lnb_name) { lnb = search_lnb(args.lnb_name); if (lnb < 0) { printf("Please select one of the LNBf's below:\n"); print_all_lnb(); exit(1); } else { printf("Using LNBf "); print_lnb(lnb); } } asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux); asprintf(&args.dvr_dev, "/dev/dvb/adapter%i/dvr%i", args.adapter, args.demux); if (args.silent < 2) fprintf(stderr, "using demux '%s'\n", args.demux_dev); if (!args.confname) { if (!homedir) ERROR("$HOME not set"); asprintf(&args.confname, "%s/.tzap/%i/%s", homedir, args.adapter, CHANNEL_FILE); if (access(args.confname, R_OK)) asprintf(&args.confname, "%s/.tzap/%s", homedir, CHANNEL_FILE); } printf("reading channels from file '%s'\n", args.confname); parms = dvb_fe_open(args.adapter, args.frontend, 0, 0); if (!parms) return -1; if (lnb) parms->lnb = get_lnb(lnb); if (args.sat_number > 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; if (parse(&args, parms, channel, &vpid, &apid, &sid)) return -1; if (setup_frontend(&args, parms) < 0) return -1; if (args.frontend_only) { check_frontend(&args, parms); dvb_fe_close(parms); return 0; } if (args.rec_psi) { if (sid < 0) { fprintf(stderr, "Service id 0x%04x was not specified at the file\n", sid); return -1; } pmtpid = get_pmt_pid(args.demux_dev, sid); if (pmtpid <= 0) { fprintf(stderr, "couldn't find pmt-pid for sid %04x\n", sid); return -1; } if ((pat_fd = open(args.demux_dev, O_RDWR)) < 0) { perror("opening pat demux failed"); return -1; } if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, args.dvr) < 0) return -1; if ((pmt_fd = open(args.demux_dev, O_RDWR)) < 0) { perror("opening pmt demux failed"); return -1; } if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, args.dvr) < 0) return -1; } if (vpid >= 0) { if (args.silent < 2) fprintf(stderr, "video pid %d\n", vpid); if ((video_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR("failed opening '%s'", args.demux_dev); return -1; } if (set_pesfilter(video_fd, vpid, DMX_PES_VIDEO, args.dvr) < 0) return -1; } if (apid >= 0) { if (args.silent < 2) fprintf(stderr, "audio pid %d\n", apid); if ((audio_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR("failed opening '%s'", args.demux_dev); return -1; } if (set_pesfilter(audio_fd, apid, DMX_PES_AUDIO, args.dvr) < 0) return -1; } signal(SIGALRM, do_timeout); if (args.timeout > 0) alarm(args.timeout); if (args.record) { if (args.filename != NULL) { if (strcmp(args.filename, "-") != 0) { file_fd = open(args.filename, O_WRONLY | O_LARGEFILE | O_CREAT, 0644); if (file_fd < 0) { PERROR("open of '%s' failed", args.filename); return -1; } } else { file_fd = 1; } } else { PERROR("Record mode but no filename!"); return -1; } if ((dvr_fd = open(args.dvr_dev, O_RDONLY)) < 0) { PERROR("failed opening '%s'", args.dvr_dev); return -1; } if (args.silent < 2) print_frontend_stats(parms, args.human_readable); copy_to_file(dvr_fd, file_fd, args.timeout, args.silent); if (args.silent < 2) print_frontend_stats(parms, args.human_readable); } else { check_frontend(&args, parms); } close(pat_fd); close(pmt_fd); close(audio_fd); close(video_fd); dvb_fe_close(parms); return 0; }
int main(int argc, char **argv) { struct arguments args; int lnb = -1,idx = -1; const struct argp argp = { .options = options, .parser = parse_opt, .doc = "scan DVB services using the channel file", .args_doc = "<initial file>", }; memset(&args, 0, sizeof(args)); args.sat_number = -1; args.output = DEFAULT_OUTPUT; args.input_format = FILE_DVBV5; args.output_format = FILE_DVBV5; args.timeout_multiply = 1; argp_parse(&argp, argc, argv, 0, &idx, &args); if (args.timeout_multiply == 0) args.timeout_multiply = 1; if (args.lnb_name) { lnb = dvb_sat_search_lnb(args.lnb_name); if (lnb < 0) { printf("Please select one of the LNBf's below:\n"); print_all_lnb(); exit(1); } else { printf("Using LNBf "); print_lnb(lnb); } } if (idx < argc) args.confname = argv[idx]; if (!args.confname || idx < 0) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if ((args.input_format == FILE_ZAP) || (args.input_format == FILE_UNKNOWN) || (args.output_format == FILE_UNKNOWN)) { fprintf(stderr, "ERROR: Please specify a valid format\n"); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux); if (verbose) fprintf(stderr, "using demux '%s'\n", args.demux_dev); struct dvb_v5_fe_parms *parms = dvb_fe_open(args.adapter, args.frontend, verbose, args.force_dvbv3); if (!parms) return -1; if (lnb >= 0) parms->lnb = dvb_sat_get_lnb(lnb); if (args.sat_number >= 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; if (run_scan(&args, parms)) return -1; dvb_fe_close(parms); free(args.demux_dev); return 0; }