udevtrigger: reduce indent level in scan_* functions
[project/procd.git] / udevtrigger.c
index be611c7..dbb414a 100644 (file)
@@ -5,12 +5,12 @@
  *     This program is free software; you can redistribute it and/or modify it
  *     under the terms of the GNU General Public License as published by the
  *     Free Software Foundation version 2 of the License.
- * 
+ *
  *     This program is distributed in the hope that it will be useful, but
  *     WITHOUT ANY WARRANTY; without even the implied warranty of
  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  *     General Public License for more details.
- * 
+ *
  *     You should have received a copy of the GNU General Public License along
  *     with this program; if not, write to the Free Software Foundation, Inc.,
  *     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
@@ -21,6 +21,7 @@
 #include <stddef.h>
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdbool.h>
 #include <unistd.h>
 #include <getopt.h>
 #include <errno.h>
@@ -135,21 +136,34 @@ static int sysfs_resolve_link(char *devpath, size_t size)
        return 0;
 }
 
+static bool device_has_attribute(const char *path, const char *attr,
+                                mode_t mode)
+{
+       char filename[PATH_SIZE];
+       struct stat statbuf;
+
+       strlcpy(filename, path, sizeof(filename));
+       strlcat(filename, attr, sizeof(filename));
+
+       if (stat(filename, &statbuf) < 0)
+               return false;
+
+       if (!(statbuf.st_mode & mode))
+               return false;
+
+       return true;
+}
 
 static int device_list_insert(const char *path)
 {
-       char filename[PATH_SIZE];
        char devpath[PATH_SIZE];
        struct stat statbuf;
 
        dbg("add '%s'" , path);
 
-       /* we only have a device, if we have an uevent file */
-       strlcpy(filename, path, sizeof(filename));
-       strlcat(filename, "/uevent", sizeof(filename));
-       if (stat(filename, &statbuf) < 0)
-               return -1;
-       if (!(statbuf.st_mode & S_IWUSR))
+       /* we only have a device, if we have a dev and an uevent file */
+       if (!device_has_attribute(path, "/dev", S_IRUSR) ||
+           !device_has_attribute(path, "/uevent", S_IWUSR))
                return -1;
 
        strlcpy(devpath, &path[4], sizeof(devpath));
@@ -165,6 +179,26 @@ static int device_list_insert(const char *path)
        return 0;
 }
 
+static void scan_subdir(const char *base)
+{
+       DIR *dir;
+       struct dirent *dent;
+
+       dir = opendir(base);
+       if (dir == NULL)
+               return;
+
+       for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+               char dirname[PATH_SIZE];
+
+               strlcpy(dirname, base, sizeof(dirname));
+               strlcat(dirname, "/", sizeof(dirname));
+               strlcat(dirname, dent->d_name, sizeof(dirname));
+               device_list_insert(dirname);
+       }
+
+       closedir(dir);
+}
 
 static void scan_subsystem(const char *subsys)
 {
@@ -176,39 +210,25 @@ static void scan_subsystem(const char *subsys)
        strlcat(base, subsys, sizeof(base));
 
        dir = opendir(base);
-       if (dir != NULL) {
-               for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
-                       char dirname[PATH_SIZE];
-                       DIR *dir2;
-                       struct dirent *dent2;
-
-                       if (dent->d_name[0] == '.')
-                               continue;
-
-                       strlcpy(dirname, base, sizeof(dirname));
-                       strlcat(dirname, "/", sizeof(dirname));
-                       strlcat(dirname, dent->d_name, sizeof(dirname));
-                       strlcat(dirname, "/devices", sizeof(dirname));
-
-                       /* look for devices */
-                       dir2 = opendir(dirname);
-                       if (dir2 != NULL) {
-                               for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
-                                       char dirname2[PATH_SIZE];
-
-                                       if (dent2->d_name[0] == '.')
-                                               continue;
-
-                                       strlcpy(dirname2, dirname, sizeof(dirname2));
-                                       strlcat(dirname2, "/", sizeof(dirname2));
-                                       strlcat(dirname2, dent2->d_name, sizeof(dirname2));
-                                       device_list_insert(dirname2);
-                               }
-                               closedir(dir2);
-                       }
-               }
-               closedir(dir);
+       if (dir == NULL)
+               return;
+
+       for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+               char dirname[PATH_SIZE];
+
+               if (dent->d_name[0] == '.')
+                       continue;
+
+               strlcpy(dirname, base, sizeof(dirname));
+               strlcat(dirname, "/", sizeof(dirname));
+               strlcat(dirname, dent->d_name, sizeof(dirname));
+               strlcat(dirname, "/devices", sizeof(dirname));
+
+               /* look for devices */
+               scan_subdir(dirname);
        }
+
+       closedir(dir);
 }
 
 static void scan_block(void)
@@ -220,43 +240,26 @@ static void scan_block(void)
        strlcpy(base, "/sys/block", sizeof(base));
 
        dir = opendir(base);
-       if (dir != NULL) {
-               for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
-                       char dirname[PATH_SIZE];
-                       DIR *dir2;
-                       struct dirent *dent2;
-
-                       if (dent->d_name[0] == '.')
-                               continue;
-
-                       strlcpy(dirname, base, sizeof(dirname));
-                       strlcat(dirname, "/", sizeof(dirname));
-                       strlcat(dirname, dent->d_name, sizeof(dirname));
-                       if (device_list_insert(dirname) != 0)
-                               continue;
-
-                       /* look for partitions */
-                       dir2 = opendir(dirname);
-                       if (dir2 != NULL) {
-                               for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
-                                       char dirname2[PATH_SIZE];
-
-                                       if (dent2->d_name[0] == '.')
-                                               continue;
-
-                                       if (!strcmp(dent2->d_name,"device"))
-                                               continue;
-
-                                       strlcpy(dirname2, dirname, sizeof(dirname2));
-                                       strlcat(dirname2, "/", sizeof(dirname2));
-                                       strlcat(dirname2, dent2->d_name, sizeof(dirname2));
-                                       device_list_insert(dirname2);
-                               }
-                               closedir(dir2);
-                       }
-               }
-               closedir(dir);
+       if (dir == NULL)
+               return;
+
+       for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+               char dirname[PATH_SIZE];
+
+               if (dent->d_name[0] == '.')
+                       continue;
+
+               strlcpy(dirname, base, sizeof(dirname));
+               strlcat(dirname, "/", sizeof(dirname));
+               strlcat(dirname, dent->d_name, sizeof(dirname));
+               if (device_list_insert(dirname) != 0)
+                       continue;
+
+               /* look for partitions */
+               scan_subdir(dirname);
        }
+
+       closedir(dir);
 }
 
 static void scan_class(void)
@@ -268,39 +271,23 @@ static void scan_class(void)
        strlcpy(base, "/sys/class", sizeof(base));
 
        dir = opendir(base);
-       if (dir != NULL) {
-               for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
-                       char dirname[PATH_SIZE];
-                       DIR *dir2;
-                       struct dirent *dent2;
-
-                       if (dent->d_name[0] == '.')
-                               continue;
-
-                       strlcpy(dirname, base, sizeof(dirname));
-                       strlcat(dirname, "/", sizeof(dirname));
-                       strlcat(dirname, dent->d_name, sizeof(dirname));
-                       dir2 = opendir(dirname);
-                       if (dir2 != NULL) {
-                               for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
-                                       char dirname2[PATH_SIZE];
-
-                                       if (dent2->d_name[0] == '.')
-                                               continue;
-
-                                       if (!strcmp(dent2->d_name, "device"))
-                                               continue;
-
-                                       strlcpy(dirname2, dirname, sizeof(dirname2));
-                                       strlcat(dirname2, "/", sizeof(dirname2));
-                                       strlcat(dirname2, dent2->d_name, sizeof(dirname2));
-                                       device_list_insert(dirname2);
-                               }
-                               closedir(dir2);
-                       }
-               }
-               closedir(dir);
+       if (dir == NULL)
+               return;
+
+       for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+               char dirname[PATH_SIZE];
+
+               if (dent->d_name[0] == '.')
+                       continue;
+
+               strlcpy(dirname, base, sizeof(dirname));
+               strlcat(dirname, "/", sizeof(dirname));
+               strlcat(dirname, dent->d_name, sizeof(dirname));
+
+               scan_subdir(dirname);
        }
+
+       closedir(dir);
 }
 
 int main(int argc, char *argv[], char *envp[])