tools:iio:lsiio: add error handling
authorHartmut Knaack <knaack.h@gmx.de>
Sun, 31 May 2015 12:40:15 +0000 (14:40 +0200)
committerJonathan Cameron <jic23@kernel.org>
Sun, 31 May 2015 18:45:00 +0000 (19:45 +0100)
Add error handling to calls which can indicate a major problem by
returning an error code.
This also involves to change the type of dump_devices() from void to int.

Signed-off-by: Hartmut Knaack <knaack.h@gmx.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
tools/iio/lsiio.c

index daa6c53..b1089ad 100644 (file)
@@ -69,7 +69,10 @@ static int dump_one_device(const char *dev_dir_name)
                        "%i", &dev_idx);
        if (retval != 1)
                return -EINVAL;
-       read_sysfs_string("name", dev_dir_name, name);
+       retval = read_sysfs_string("name", dev_dir_name, name);
+       if (retval)
+               return retval;
+
        printf("Device %03d: %s\n", dev_idx, name);
 
        if (verblevel >= VERBLEVEL_SENSORS)
@@ -87,20 +90,24 @@ static int dump_one_trigger(const char *dev_dir_name)
                        "%i", &dev_idx);
        if (retval != 1)
                return -EINVAL;
-       read_sysfs_string("name", dev_dir_name, name);
+       retval = read_sysfs_string("name", dev_dir_name, name);
+       if (retval)
+               return retval;
+
        printf("Trigger %03d: %s\n", dev_idx, name);
        return 0;
 }
 
-static void dump_devices(void)
+static int dump_devices(void)
 {
        const struct dirent *ent;
+       int ret;
        DIR *dp;
 
        dp = opendir(iio_dir);
        if (dp == NULL) {
                printf("No industrial I/O devices available\n");
-               return;
+               return -ENODEV;
        }
 
        while (ent = readdir(dp), ent != NULL) {
@@ -109,11 +116,16 @@ static void dump_devices(void)
 
                        if (asprintf(&dev_dir_name, "%s%s", iio_dir,
                                     ent->d_name) < 0) {
-                               printf("Memory allocation failed\n");
+                               ret = -ENOMEM;
+                               goto error_close_dir;
+                       }
+
+                       ret = dump_one_device(dev_dir_name);
+                       if (ret) {
+                               free(dev_dir_name);
                                goto error_close_dir;
                        }
 
-                       dump_one_device(dev_dir_name);
                        free(dev_dir_name);
                        if (verblevel >= VERBLEVEL_SENSORS)
                                printf("\n");
@@ -126,16 +138,26 @@ static void dump_devices(void)
 
                        if (asprintf(&dev_dir_name, "%s%s", iio_dir,
                                     ent->d_name) < 0) {
-                               printf("Memory allocation failed\n");
+                               ret = -ENOMEM;
+                               goto error_close_dir;
+                       }
+
+                       ret = dump_one_trigger(dev_dir_name);
+                       if (ret) {
+                               free(dev_dir_name);
                                goto error_close_dir;
                        }
 
-                       dump_one_trigger(dev_dir_name);
                        free(dev_dir_name);
                }
        }
+       return (closedir(dp) == -1) ? -errno : 0;
+
 error_close_dir:
-       closedir(dp);
+       if (closedir(dp) == -1)
+               perror("dump_devices(): Failed to close directory");
+
+       return ret;
 }
 
 int main(int argc, char **argv)
@@ -163,7 +185,5 @@ int main(int argc, char **argv)
                exit(1);
        }
 
-       dump_devices();
-
-       return 0;
+       return dump_devices();
 }