]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
cli: stop immediately if SRD PD registration fails
[sigrok-cli.git] / sigrok-cli.c
index 48f36ccc7d01a318d813334a007b1745906d71d9..359c34b8fd54877dd43f6583cf867b2effb63e7a 100644 (file)
@@ -513,6 +513,7 @@ static int register_pds(struct sr_dev *dev, const char *pdstring)
 {
        GHashTable *pd_opthash;
        struct srd_decoder_inst *di;
 {
        GHashTable *pd_opthash;
        struct srd_decoder_inst *di;
+       int ret;
        char **pdtokens, **pdtok, *pd_name;
 
        /* Avoid compiler warnings. */
        char **pdtokens, **pdtok, *pd_name;
 
        /* Avoid compiler warnings. */
@@ -521,6 +522,7 @@ static int register_pds(struct sr_dev *dev, const char *pdstring)
        g_datalist_init(&pd_ann_visible);
        pdtokens = g_strsplit(pdstring, ",", -1);
        pd_opthash = NULL;
        g_datalist_init(&pd_ann_visible);
        pdtokens = g_strsplit(pdstring, ",", -1);
        pd_opthash = NULL;
+       ret = 0;
        pd_name = NULL;
 
        for (pdtok = pdtokens; *pdtok; pdtok++) {
        pd_name = NULL;
 
        for (pdtok = pdtokens; *pdtok; pdtok++) {
@@ -533,10 +535,12 @@ static int register_pds(struct sr_dev *dev, const char *pdstring)
                g_hash_table_remove(pd_opthash, "sigrok_key");
                if (srd_decoder_load(pd_name) != SRD_OK) {
                        g_critical("Failed to load protocol decoder %s.", pd_name);
                g_hash_table_remove(pd_opthash, "sigrok_key");
                if (srd_decoder_load(pd_name) != SRD_OK) {
                        g_critical("Failed to load protocol decoder %s.", pd_name);
+                       ret = 1;
                        goto err_out;
                }
                if (!(di = srd_inst_new(pd_name, pd_opthash))) {
                        g_critical("Failed to instantiate protocol decoder %s.", pd_name);
                        goto err_out;
                }
                if (!(di = srd_inst_new(pd_name, pd_opthash))) {
                        g_critical("Failed to instantiate protocol decoder %s.", pd_name);
+                       ret = 1;
                        goto err_out;
                }
                g_datalist_set_data(&pd_ann_visible, di->inst_id, pd_name);
                        goto err_out;
                }
                g_datalist_set_data(&pd_ann_visible, di->inst_id, pd_name);
@@ -545,8 +549,10 @@ static int register_pds(struct sr_dev *dev, const char *pdstring)
                 * is the probe name as specified in the decoder class, and the
                 * value is the probe number i.e. the order in which the PD's
                 * incoming samples are arranged. */
                 * is the probe name as specified in the decoder class, and the
                 * value is the probe number i.e. the order in which the PD's
                 * incoming samples are arranged. */
-               if (srd_inst_probe_set_all(di, pd_opthash) != SRD_OK)
+               if (srd_inst_probe_set_all(di, pd_opthash) != SRD_OK) {
+                       ret = 1;
                        goto err_out;
                        goto err_out;
+               }
                g_hash_table_destroy(pd_opthash);
                pd_opthash = NULL;
        }
                g_hash_table_destroy(pd_opthash);
                pd_opthash = NULL;
        }
@@ -558,7 +564,7 @@ err_out:
        if (pd_name)
                g_free(pd_name);
 
        if (pd_name)
                g_free(pd_name);
 
-       return 0;
+       return ret;
 }
 
 void show_pd_annotation(struct srd_proto_data *pdata, void *cb_data)
 }
 
 void show_pd_annotation(struct srd_proto_data *pdata, void *cb_data)
@@ -992,7 +998,7 @@ static void logger(const gchar *log_domain, GLogLevelFlags log_level,
         * All messages, warnings, errors etc. go to stderr (not stdout) in
         * order to not mess up the CLI tool data output, e.g. VCD output.
         */
         * All messages, warnings, errors etc. go to stderr (not stdout) in
         * order to not mess up the CLI tool data output, e.g. VCD output.
         */
-       if (log_level & (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING)
+       if (log_level & (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING)
                        || opt_loglevel > SR_LOG_WARN) {
                fprintf(stderr, "%s\n", message);
                fflush(stderr);
                        || opt_loglevel > SR_LOG_WARN) {
                fprintf(stderr, "%s\n", message);
                fflush(stderr);