X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=sigrok-cli.c;h=3b34360fcbc0c1b817c4fa8670673ebb3c9da07e;hp=9938260cc2bd232675b876c364fdd02354c1d1b6;hb=2da4987098b2370d5d23f61eded00d83780bb18c;hpb=74b9bf0c14d186ac8681b210322a022b0c42a474 diff --git a/sigrok-cli.c b/sigrok-cli.c index 9938260..3b34360 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -17,7 +17,10 @@ * along with this program. If not, see . */ +#include "config.h" +#ifdef HAVE_SRD #include /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#endif #include #include #include @@ -32,7 +35,6 @@ #include #include #include "sigrok-cli.h" -#include "config.h" #define DEFAULT_OUTPUT_FORMAT "bits:width=64" @@ -43,7 +45,9 @@ static uint64_t limit_frames = 0; static struct sr_output_format *output_format = NULL; static int default_output_format = FALSE; static char *output_format_param = NULL; +#ifdef HAVE_SRD static GHashTable *pd_ann_visible = NULL; +#endif static GByteArray *savebuf; static gboolean opt_version = FALSE; @@ -57,8 +61,10 @@ static gchar *opt_dev = NULL; static gchar *opt_probes = NULL; static gchar *opt_triggers = NULL; static gchar *opt_pds = NULL; +#ifdef HAVE_SRD static gchar *opt_pd_stack = NULL; static gchar *opt_pd_annotations = NULL; +#endif static gchar *opt_input_format = NULL; static gchar *opt_output_format = NULL; static gchar *opt_show = NULL; @@ -66,6 +72,7 @@ static gchar *opt_time = NULL; static gchar *opt_samples = NULL; static gchar *opt_frames = NULL; static gchar *opt_continuous = NULL; +static gchar *opt_set = NULL; static GOptionEntry optargs[] = { {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, @@ -92,12 +99,14 @@ static GOptionEntry optargs[] = { "Trigger configuration", NULL}, {"wait-trigger", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_trigger, "Wait for trigger", NULL}, +#ifdef HAVE_SRD {"protocol-decoders", 'a', 0, G_OPTION_ARG_STRING, &opt_pds, "Protocol decoders to run", NULL}, {"protocol-decoder-stack", 's', 0, G_OPTION_ARG_STRING, &opt_pd_stack, "Protocol decoder stack", NULL}, {"protocol-decoder-annotations", 'A', 0, G_OPTION_ARG_STRING, &opt_pd_annotations, "Protocol decoder annotation(s) to show", NULL}, +#endif {"show", 0, 0, G_OPTION_ARG_NONE, &opt_show, "Show device detail", NULL}, {"time", 0, 0, G_OPTION_ARG_STRING, &opt_time, @@ -108,6 +117,7 @@ static GOptionEntry optargs[] = { "Number of frames to acquire", NULL}, {"continuous", 0, 0, G_OPTION_ARG_NONE, &opt_continuous, "Sample continuously", NULL}, + {"set", 0, 0, G_OPTION_ARG_NONE, &opt_set, "Set device options only", NULL}, {NULL, 0, 0, 0, NULL, NULL, NULL} }; @@ -203,19 +213,23 @@ static GSList *device_scan(void) static void show_version(void) { - const GSList *l; struct sr_dev_driver **drivers; struct sr_input_format **inputs; struct sr_output_format **outputs; - struct srd_decoder *dec; int i; +#ifdef HAVE_SRD + struct srd_decoder *dec; + const GSList *l; +#endif printf("sigrok-cli %s\n\n", VERSION); printf("Using libsigrok %s (lib version %s).\n", sr_package_version_string_get(), sr_lib_version_string_get()); +#ifdef HAVE_SRD printf("Using libsigrokdecode %s (lib version %s).\n\n", srd_package_version_string_get(), srd_lib_version_string_get()); +#endif printf("Supported hardware drivers:\n"); drivers = sr_driver_list(); @@ -236,6 +250,7 @@ static void show_version(void) printf(" %-20s %s\n", outputs[i]->id, outputs[i]->description); printf("\n"); +#ifdef HAVE_SRD if (srd_init(NULL) == SRD_OK) { printf("Supported protocol decoders:\n"); srd_decoder_load_all(); @@ -249,6 +264,7 @@ static void show_version(void) srd_exit(); } printf("\n"); +#endif } static void print_dev_line(const struct sr_dev_inst *sdi) @@ -303,7 +319,7 @@ static void show_dev_detail(void) GSList *devices; uint64_t *integers; const int *hwopts, *hwcaps; - int cap, num_devices, n, i; + int cap, num_devices, *tmp_bool, i; char *s, *title; const char *charopts, **stropts; @@ -314,25 +330,23 @@ static void show_dev_detail(void) num_devices = g_slist_length(devices); if (num_devices > 1) { - if (!opt_dev) { - g_critical("%d devices found. Use --list-devices to show them, " - "and --device to select one.", num_devices); - return; - } - /* opt_dev is NULL if not specified, which is fine. */ - n = strtol(opt_dev, NULL, 10); - if (n >= num_devices) { - g_critical("%d devices found, numbered starting from 0.", - num_devices); - return; - } - sdi = g_slist_nth_data(devices, n); - } else - sdi = g_slist_nth_data(devices, 0); + g_critical("%d devices found. Use --list-devices to show them, " + "and --device to select one.", num_devices); + return; + } + sdi = devices->data; print_dev_line(sdi); - if (sr_info_get(sdi->driver, SR_DI_TRIGGER_TYPES, (const void **)&charopts, + /* This properly opens and initializes the device, so we can get + * current settings. */ + sr_session_new(); + if (sr_session_dev_add(sdi) != SR_OK) { + g_critical("Failed to use device."); + return; + } + + if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_TYPE, (const void **)&charopts, sdi) == SR_OK && charopts) { printf("Supported triggers: "); while (*charopts) { @@ -342,7 +356,7 @@ static void show_dev_detail(void) printf("\n"); } - if ((sr_info_get(sdi->driver, SR_DI_HWOPTS, (const void **)&hwopts, + if ((sr_config_list(sdi->driver, SR_CONF_SCAN_OPTIONS, (const void **)&hwopts, NULL) == SR_OK) && hwopts) { printf("Supported driver options:\n"); for (i = 0; hwopts[i]; i++) { @@ -353,7 +367,7 @@ static void show_dev_detail(void) } title = "Supported device options:\n"; - if ((sr_info_get(sdi->driver, SR_DI_HWCAPS, (const void **)&hwcaps, + if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_OPTIONS, (const void **)&hwcaps, NULL) != SR_OK) || !hwcaps) /* Driver supports no device instance options. */ return; @@ -367,10 +381,10 @@ static void show_dev_detail(void) title = NULL; } - if (srci->key == SR_HWCAP_PATTERN_MODE) { + if (srci->key == SR_CONF_PATTERN_MODE) { /* Pattern generator modes */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_PATTERNS, + if (sr_config_list(sdi->driver, SR_CONF_PATTERN_MODE, (const void **)&stropts, sdi) == SR_OK) { printf(" - supported patterns:\n"); for (i = 0; stropts[i]; i++) @@ -379,10 +393,10 @@ static void show_dev_detail(void) printf("\n"); } - } else if (srci->key == SR_HWCAP_SAMPLERATE) { + } else if (srci->key == SR_CONF_SAMPLERATE) { /* Supported samplerates */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_SAMPLERATES, + if (sr_config_list(sdi->driver, SR_CONF_SAMPLERATE, (const void **)&samplerates, sdi) != SR_OK) { printf("\n"); continue; @@ -409,10 +423,10 @@ static void show_dev_detail(void) printf(" %s\n", sr_samplerate_string(samplerates->list[i])); } - } else if (srci->key == SR_HWCAP_BUFFERSIZE) { + } else if (srci->key == SR_CONF_BUFFERSIZE) { /* Supported buffer sizes */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_BUFFERSIZES, + if (sr_config_list(sdi->driver, SR_CONF_BUFFERSIZE, (const void **)&integers, sdi) != SR_OK) { printf("\n"); continue; @@ -421,10 +435,10 @@ static void show_dev_detail(void) for (i = 0; integers[i]; i++) printf(" %"PRIu64"\n", integers[i]); - } else if (srci->key == SR_HWCAP_TIMEBASE) { + } else if (srci->key == SR_CONF_TIMEBASE) { /* Supported time bases */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_TIMEBASES, + if (sr_config_list(sdi->driver, SR_CONF_TIMEBASE, (const void **)&rationals, sdi) != SR_OK) { printf("\n"); continue; @@ -434,10 +448,10 @@ static void show_dev_detail(void) printf(" %s\n", sr_period_string( rationals[i].p * rationals[i].q)); - } else if (srci->key == SR_HWCAP_TRIGGER_SOURCE) { + } else if (srci->key == SR_CONF_TRIGGER_SOURCE) { /* Supported trigger sources */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_TRIGGER_SOURCES, + if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_SOURCE, (const void **)&stropts, sdi) != SR_OK) { printf("\n"); continue; @@ -446,10 +460,10 @@ static void show_dev_detail(void) for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); - } else if (srci->key == SR_HWCAP_FILTER) { + } else if (srci->key == SR_CONF_FILTER) { /* Supported filters */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_FILTERS, + if (sr_config_list(sdi->driver, SR_CONF_FILTER, (const void **)&stropts, sdi) != SR_OK) { printf("\n"); continue; @@ -458,10 +472,10 @@ static void show_dev_detail(void) for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); - } else if (srci->key == SR_HWCAP_VDIV) { + } else if (srci->key == SR_CONF_VDIV) { /* Supported volts/div values */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_VDIVS, + if (sr_config_list(sdi->driver, SR_CONF_VDIV, (const void **)&rationals, sdi) != SR_OK) { printf("\n"); continue; @@ -470,10 +484,10 @@ static void show_dev_detail(void) for (i = 0; rationals[i].p && rationals[i].q; i++) printf(" %s\n", sr_voltage_string( &rationals[i])); - } else if (srci->key == SR_HWCAP_COUPLING) { + } else if (srci->key == SR_CONF_COUPLING) { /* Supported coupling settings */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_COUPLING, + if (sr_config_list(sdi->driver, SR_CONF_COUPLING, (const void **)&stropts, sdi) != SR_OK) { printf("\n"); continue; @@ -482,14 +496,25 @@ static void show_dev_detail(void) for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); + } else if (srci->key == SR_CONF_DATALOG) { + /* Turning on/off internal data logging. */ + printf(" %s\t(on/off", srci->id); + if (sr_config_get(sdi->driver, SR_CONF_DATALOG, + (const void **)&tmp_bool, sdi) == SR_OK) { + printf(", currently %s", *tmp_bool ? "on" : "off"); + } + printf(")\n"); } else { /* Everything else */ printf(" %s\n", srci->id); } } + sr_session_destroy(); + } +#ifdef HAVE_SRD static void show_pd_detail(void) { GSList *l; @@ -545,6 +570,7 @@ static void show_pd_detail(void) g_strfreev(pdtokens); } +#endif static GArray *get_enabled_logic_probes(const struct sr_dev_inst *sdi) { @@ -628,8 +654,9 @@ static void datafeed_in(const struct sr_dev_inst *sdi, /* How many bytes we need to store the packed samples. */ unitsize = (logic_probelist->len + 7) / 8; +#ifdef HAVE_SRD if (opt_pds && logic_probelist->len) { - if (sr_info_get(sdi->driver, SR_DI_CUR_SAMPLERATE, + if (sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, (const void **)&samplerate, sdi) != SR_OK) { g_critical("Unable to initialize protocol " "decoders: no samplerate found."); @@ -638,45 +665,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi, srd_session_start(logic_probelist->len, unitsize, *samplerate); } - break; - - case SR_DF_END: - g_debug("cli: Received SR_DF_END"); - if (!o) { - g_debug("cli: double end!"); - break; - } - if (o->format->event) { - o->format->event(o, SR_DF_END, &output_buf, &output_len); - if (output_buf) { - if (outfile) - fwrite(output_buf, 1, output_len, outfile); - g_free(output_buf); - output_len = 0; - } - } - if (limit_samples && received_samples < limit_samples) - g_warning("Device only sent %" PRIu64 " samples.", - received_samples); - if (opt_continuous) - g_warning("Device stopped after %" PRIu64 " samples.", - received_samples); - - if (outfile && outfile != stdout) - fclose(outfile); - - if (opt_output_file && default_output_format) { - if (sr_session_save(opt_output_file, sdi, savebuf->data, - unitsize, savebuf->len / unitsize) != SR_OK) - g_critical("Failed to save session."); - g_byte_array_free(savebuf, FALSE); - } - - g_array_free(logic_probelist, TRUE); - if (o->format->cleanup) - o->format->cleanup(o); - g_free(o); - o = NULL; +#endif break; case SR_DF_META: @@ -685,9 +674,13 @@ static void datafeed_in(const struct sr_dev_inst *sdi, for (l = meta->config; l; l = l->next) { src = l->data; switch (src->key) { - case SR_HWCAP_SAMPLERATE: + case SR_CONF_SAMPLERATE: samplerate = (uint64_t *)src->value; - g_debug("cli: got samplerate %"PRIu64, *samplerate); + g_debug("cli: got samplerate %"PRIu64" Hz", *samplerate); + break; + case SR_CONF_SAMPLE_INTERVAL: + samplerate = (uint64_t *)src->value; + g_debug("cli: got sample interval %"PRIu64" ms", *samplerate); break; default: /* Unknown metadata is not an error. */ @@ -738,15 +731,17 @@ static void datafeed_in(const struct sr_dev_inst *sdi, g_byte_array_append(savebuf, filter_out, filter_out_len); } else { if (opt_pds) { +#ifdef HAVE_SRD if (srd_session_send(received_samples, (uint8_t*)filter_out, filter_out_len) != SRD_OK) sr_session_stop(); +#endif } else { output_len = 0; if (o->format->data && packet->type == o->format->df_type) o->format->data(o, filter_out, filter_out_len, &output_buf, &output_len); - if (output_buf) { + if (output_len) { fwrite(output_buf, 1, output_len, outfile); fflush(outfile); g_free(output_buf); @@ -819,8 +814,50 @@ static void datafeed_in(const struct sr_dev_inst *sdi, } } + /* SR_DF_END needs to be handled after the output module's recv() + * is called, so it can properly clean up that module etc. */ + if (packet->type == SR_DF_END) { + g_debug("cli: Received SR_DF_END"); + + if (o->format->event) { + o->format->event(o, SR_DF_END, &output_buf, &output_len); + if (output_buf) { + if (outfile) + fwrite(output_buf, 1, output_len, outfile); + g_free(output_buf); + output_len = 0; + } + } + + if (limit_samples && received_samples < limit_samples) + g_warning("Device only sent %" PRIu64 " samples.", + received_samples); + + if (opt_continuous) + g_warning("Device stopped after %" PRIu64 " samples.", + received_samples); + + g_array_free(logic_probelist, TRUE); + + if (o->format->cleanup) + o->format->cleanup(o); + g_free(o); + o = NULL; + + if (outfile && outfile != stdout) + fclose(outfile); + + if (opt_output_file && default_output_format) { + if (sr_session_save(opt_output_file, sdi, savebuf->data, + unitsize, savebuf->len / unitsize) != SR_OK) + g_critical("Failed to save session."); + g_byte_array_free(savebuf, FALSE); + } + } + } +#ifdef HAVE_SRD /* Register the given PDs for this session. * Accepts a string of the form: "spi:sck=3:sdata=4,spi:sck=3:sdata=5" * That will instantiate two SPI decoders on the clock but different data @@ -993,6 +1030,38 @@ int setup_pd_annotations(void) return 0; } +void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data) +{ + int i; + char **annotations; + gpointer ann_format; + + /* 'cb_data' is not used in this specific callback. */ + (void)cb_data; + + if (!pd_ann_visible) + return; + + if (!g_hash_table_lookup_extended(pd_ann_visible, pdata->pdo->di->inst_id, + NULL, &ann_format)) + /* Not in the list of PDs whose annotations we're showing. */ + return; + + if (pdata->ann_format != GPOINTER_TO_INT(ann_format)) + /* We don't want this particular format from the PD. */ + return; + + annotations = pdata->data; + if (opt_loglevel > SR_LOG_WARN) + printf("%"PRIu64"-%"PRIu64" ", pdata->start_sample, pdata->end_sample); + printf("%s: ", pdata->pdo->proto_id); + for (i = 0; annotations[i]; i++) + printf("\"%s\" ", annotations[i]); + printf("\n"); + fflush(stdout); +} +#endif + int setup_output_format(void) { GHashTable *fmtargs; @@ -1040,37 +1109,6 @@ int setup_output_format(void) return 0; } -void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data) -{ - int i; - char **annotations; - gpointer ann_format; - - /* 'cb_data' is not used in this specific callback. */ - (void)cb_data; - - if (!pd_ann_visible) - return; - - if (!g_hash_table_lookup_extended(pd_ann_visible, pdata->pdo->di->inst_id, - NULL, &ann_format)) - /* Not in the list of PDs whose annotations we're showing. */ - return; - - if (pdata->ann_format != GPOINTER_TO_INT(ann_format)) - /* We don't want this particular format from the PD. */ - return; - - annotations = pdata->data; - if (opt_loglevel > SR_LOG_WARN) - printf("%"PRIu64"-%"PRIu64" ", pdata->start_sample, pdata->end_sample); - printf("%s: ", pdata->pdo->proto_id); - for (i = 0; annotations[i]; i++) - printf("\"%s\" ", annotations[i]); - printf("\n"); - fflush(stdout); -} - static int select_probes(struct sr_dev_inst *sdi) { struct sr_probe *probe; @@ -1189,7 +1227,7 @@ static void load_input_file_format(void) in->format = input_format; in->param = fmtargs; if (in->format->init) { - if (in->format->init(in) != SR_OK) { + if (in->format->init(in, opt_input_file) != SR_OK) { g_critical("Input format init failed."); exit(1); } @@ -1290,7 +1328,7 @@ static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) ret = SR_ERR; } if (val) - ret = sr_dev_config_set(sdi, srci->key, val); + ret = sr_config_set(sdi, srci->key, val); if (ret != SR_OK) { g_critical("Failed to set device option '%s'.", (char *)key); return ret; @@ -1300,6 +1338,40 @@ static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) return SR_OK; } +static void set_options(void) +{ + struct sr_dev_inst *sdi; + GSList *devices; + GHashTable *devargs; + + if (!opt_dev) { + g_critical("No setting specified."); + return; + } + + if (!(devargs = parse_generic_arg(opt_dev, FALSE))) + return; + + if (!(devices = device_scan())) { + g_critical("No devices found."); + return; + } + sdi = devices->data; + + sr_session_new(); + if (sr_session_dev_add(sdi) != SR_OK) { + g_critical("Failed to use device."); + return; + } + + set_dev_options(sdi, devargs); + + sr_session_destroy(); + g_slist_free(devices); + g_hash_table_destroy(devargs); + +} + static int set_limit_time(const struct sr_dev_inst *sdi) { uint64_t time_msec; @@ -1312,8 +1384,8 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_LIMIT_MSEC)) { - if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_MSEC, &time_msec) != SR_OK) { + if (sr_dev_has_option(sdi, SR_CONF_LIMIT_MSEC)) { + if (sr_config_set(sdi, SR_CONF_LIMIT_MSEC, &time_msec) != SR_OK) { g_critical("Failed to configure time limit."); sr_session_destroy(); return SR_ERR; @@ -1324,8 +1396,8 @@ static int set_limit_time(const struct sr_dev_inst *sdi) * convert to samples based on the samplerate. */ limit_samples = 0; - if (sr_dev_has_hwcap(sdi, SR_HWCAP_SAMPLERATE)) { - sr_info_get(sdi->driver, SR_DI_CUR_SAMPLERATE, + if (sr_dev_has_option(sdi, SR_CONF_SAMPLERATE)) { + sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, (const void **)&samplerate, sdi); limit_samples = (*samplerate) * time_msec / (uint64_t)1000; } @@ -1335,7 +1407,7 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES, + if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, &limit_samples) != SR_OK) { g_critical("Failed to configure time-based sample limit."); sr_session_destroy(); @@ -1404,7 +1476,7 @@ static void run_session(void) } if (opt_continuous) { - if (!sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_CONTINUOUS)) { + if (!sr_dev_has_option(sdi, SR_CONF_CONTINUOUS)) { g_critical("This device does not support continuous sampling."); sr_session_destroy(); return; @@ -1420,7 +1492,7 @@ static void run_session(void) if (opt_samples) { if ((sr_parse_sizestring(opt_samples, &limit_samples) != SR_OK) - || (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES, + || (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, &limit_samples) != SR_OK)) { g_critical("Failed to configure sample limit."); sr_session_destroy(); @@ -1430,7 +1502,7 @@ static void run_session(void) if (opt_frames) { if ((sr_parse_sizestring(opt_frames, &limit_frames) != SR_OK) - || (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_FRAMES, + || (sr_config_set(sdi, SR_CONF_LIMIT_FRAMES, &limit_frames) != SR_OK)) { g_critical("Failed to configure frame limit."); sr_session_destroy(); @@ -1495,11 +1567,12 @@ int main(int argc, char **argv) if (sr_log_loglevel_set(opt_loglevel) != SR_OK) goto done; - /* Set the loglevel (amount of messages to output) for libsigrokdecode. */ - if (srd_log_loglevel_set(opt_loglevel) != SRD_OK) + if (sr_init(&sr_ctx) != SR_OK) goto done; - if (sr_init(&sr_ctx) != SR_OK) +#ifdef HAVE_SRD + /* Set the loglevel (amount of messages to output) for libsigrokdecode. */ + if (srd_log_loglevel_set(opt_loglevel) != SRD_OK) goto done; if (opt_pds) { @@ -1515,6 +1588,7 @@ int main(int argc, char **argv) if (setup_pd_annotations() != 0) goto done; } +#endif if (setup_output_format() != 0) goto done; @@ -1523,19 +1597,25 @@ int main(int argc, char **argv) show_version(); else if (opt_list_devs) show_dev_list(); +#ifdef HAVE_SRD else if (opt_pds && opt_show) show_pd_detail(); +#endif else if (opt_show) show_dev_detail(); else if (opt_input_file) load_input_file(); + else if (opt_set) + set_options(); else if (opt_samples || opt_time || opt_frames || opt_continuous) run_session(); else printf("%s", g_option_context_get_help(context, TRUE, NULL)); +#ifdef HAVE_SRD if (opt_pds) srd_exit(); +#endif ret = 0;