]> sigrok.org Git - libsigrok.git/blobdiff - session_file.c
Detect non-existent file before libzip does.
[libsigrok.git] / session_file.c
index 479dba04ed65ce1cc8b5b2633cd53b67c962514b..d720dd599eae866299b987fc5a1c2873b2ceb72f 100644 (file)
@@ -21,6 +21,9 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <zip.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
 #include <glib.h>
 #include <glib/gstdio.h>
 #include "config.h" /* Needed for PACKAGE_VERSION and others. */
 extern struct sr_session *session;
 extern SR_PRIV struct sr_dev_driver session_driver;
 
+/** @private */
 SR_PRIV int sr_sessionfile_check(const char *filename)
 {
+       struct stat st;
        struct zip *archive;
        struct zip_file *zf;
        struct zip_stat zs;
@@ -62,6 +67,11 @@ SR_PRIV int sr_sessionfile_check(const char *filename)
        if (!filename)
                return SR_ERR_ARG;
 
+       if (stat(filename, &st) == -1) {
+               sr_err("Couldn't stat %s: %s", filename, strerror(errno));
+               return SR_ERR;
+       }
+
        if (!(archive = zip_open(filename, 0, &ret)))
                /* No logging: this can be used just to check if it's
                 * a sigrok session file or not. */
@@ -164,22 +174,22 @@ SR_API int sr_session_load(const char *filename)
                                        sr_dev_open(sdi);
                                        sr_session_dev_add(sdi);
                                        sdi->driver->config_set(SR_CONF_SESSIONFILE,
-                                                       g_variant_new_string(filename), sdi);
+                                                       g_variant_new_string(filename), sdi, NULL);
                                        sdi->driver->config_set(SR_CONF_CAPTUREFILE,
-                                                       g_variant_new_string(val), sdi);
+                                                       g_variant_new_string(val), sdi, NULL);
                                        g_ptr_array_add(capturefiles, val);
                                } else if (!strcmp(keys[j], "samplerate")) {
                                        sr_parse_sizestring(val, &tmp_u64);
                                        sdi->driver->config_set(SR_CONF_SAMPLERATE,
-                                                       g_variant_new_uint64(tmp_u64), sdi);
+                                                       g_variant_new_uint64(tmp_u64), sdi, NULL);
                                } else if (!strcmp(keys[j], "unitsize")) {
                                        tmp_u64 = strtoull(val, NULL, 10);
                                        sdi->driver->config_set(SR_CONF_CAPTURE_UNITSIZE,
-                                                       g_variant_new_uint64(tmp_u64), sdi);
+                                                       g_variant_new_uint64(tmp_u64), sdi, NULL);
                                } else if (!strcmp(keys[j], "total probes")) {
                                        total_probes = strtoull(val, NULL, 10);
                                        sdi->driver->config_set(SR_CONF_CAPTURE_NUM_PROBES,
-                                                       g_variant_new_uint64(total_probes), sdi);
+                                                       g_variant_new_uint64(total_probes), sdi, NULL);
                                        for (p = 0; p < total_probes; p++) {
                                                snprintf(probename, SR_MAX_PROBENAME_LEN, "%" PRIu64, p);
                                                if (!(probe = sr_probe_new(p, SR_PROBE_LOGIC, TRUE,
@@ -278,8 +288,8 @@ SR_API int sr_session_save(const char *filename, const struct sr_dev_inst *sdi,
        fprintf(meta, "unitsize = %d\n", unitsize);
        fprintf(meta, "total probes = %d\n", g_slist_length(sdi->probes));
        if (sr_dev_has_option(sdi, SR_CONF_SAMPLERATE)) {
-               if (sr_config_get(sdi->driver, SR_CONF_SAMPLERATE,
-                               &gvar, sdi) == SR_OK) {
+               if (sr_config_get(sdi->driver, sdi, NULL,
+                                       SR_CONF_SAMPLERATE, &gvar) == SR_OK) {
                        samplerate = g_variant_get_uint64(gvar);
                        s = sr_samplerate_string(samplerate);
                        fprintf(meta, "samplerate = %s\n", s);