X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_lib.c;h=e9c16c863a3407ac0705923c375b8264441b3f39;hb=b579916fb53f3916cf27c85072ce87f5b6b84b8b;hp=4a9eea506cacaf8171313719a33a4b27ae2d185b;hpb=f61d732a02c8a5e11c39651a70e3e3fd00529495;p=elogind.git diff --git a/udev_lib.c b/udev_lib.c index 4a9eea506..e9c16c863 100644 --- a/udev_lib.c +++ b/udev_lib.c @@ -21,14 +21,19 @@ #include #include +#include #include #include +#include +#include #include #include #include "libsysfs/sysfs/libsysfs.h" #include "udev.h" +#include "logging.h" #include "udev_lib.h" +#include "list.h" char *get_action(void) @@ -136,3 +141,84 @@ size_t buf_get_line(char *buf, size_t buflen, size_t cur) return count - cur; } +struct files { + struct list_head list; + char name[NAME_SIZE]; +}; + +/* sort files in lexical order */ +static int file_list_insert(char *filename, struct list_head *file_list) +{ + struct files *loop_file; + struct files *new_file; + + list_for_each_entry(loop_file, file_list, list) { + if (strcmp(loop_file->name, filename) > 0) { + break; + } + } + + new_file = malloc(sizeof(struct files)); + if (new_file == NULL) { + dbg("error malloc"); + return -ENOMEM; + } + + strfieldcpy(new_file->name, filename); + list_add_tail(&new_file->list, &loop_file->list); + return 0; +} + +/* calls function for file or every file found in directory */ +int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix) +{ + struct dirent *ent; + DIR *dir; + char *ext; + char file[NAME_SIZE]; + struct files *loop_file; + struct files *tmp_file; + LIST_HEAD(file_list); + + dbg("open directory '%s'", dirname); + dir = opendir(dirname); + if (dir == NULL) { + dbg("unable to open '%s'", dirname); + return -1; + } + + while (1) { + ent = readdir(dir); + if (ent == NULL || ent->d_name[0] == '\0') + break; + + if ((ent->d_name[0] == '.') || (ent->d_name[0] == COMMENT_CHARACTER)) + continue; + + /* look for file with specified suffix */ + ext = strrchr(ent->d_name, '.'); + if (ext == NULL) + continue; + + if (strcmp(ext, suffix) != 0) + continue; + + dbg("put file '%s/%s' in list", dirname, ent->d_name); + file_list_insert(ent->d_name, &file_list); + } + + /* call function for every file in the list */ + list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) { + strfieldcpy(file, dirname); + strfieldcat(file, "/"); + strfieldcat(file, loop_file->name); + + fnct(file); + + list_del(&loop_file->list); + free(loop_file); + } + + closedir(dir); + return 0; +}