X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_lib.c;h=a3fab9632d28a273079b46115f2361a63edb1168;hb=d4a32aa2e4804de9189574213749616dda57faa7;hp=951d36b1d7fb50c746a78d048c27d649c74763fb;hpb=c6478ec1e128f0a92c2123ed110a651b88d43569;p=elogind.git diff --git a/udev_lib.c b/udev_lib.c index 951d36b1d..a3fab9632 100644 --- a/udev_lib.c +++ b/udev_lib.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "udev.h" #include "logging.h" @@ -72,6 +73,29 @@ void udev_set_values(struct udevice *udev, const char* devpath, udev->type = get_device_type(devpath, subsystem); } +int kernel_release_satisfactory(int version, int patchlevel, int sublevel) +{ + static struct utsname uts; + static int kversion = 0; + static int kpatchlevel; + static int ksublevel; + + if (kversion == 0) { + if (uname(&uts) != 0) + return -1; + + if (sscanf (uts.release, "%u.%u.%u", &kversion, &kpatchlevel, &ksublevel) != 3) { + kversion = 0; + return -1; + } + } + + if (kversion >= version && kpatchlevel >= patchlevel && ksublevel >= sublevel) + return 1; + else + return 0; +} + int create_path(const char *path) { char p[NAME_SIZE]; @@ -178,12 +202,12 @@ static int file_list_insert(char *filename, struct list_head *file_list) } /* calls function for every file found in specified directory */ -int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix) +int call_foreach_file(file_fnct_t fnct, const char *dirname, + const char *suffix, void *data) { struct dirent *ent; DIR *dir; char *ext; - char file[NAME_SIZE]; struct files *loop_file; struct files *tmp_file; LIST_HEAD(file_list); @@ -217,10 +241,12 @@ int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix) /* call function for every file in the list */ list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) { - snprintf(file, NAME_SIZE-1, "%s/%s", dirname, loop_file->name); - file[NAME_SIZE-1] = '\0'; + char filename[NAME_SIZE]; + + snprintf(filename, NAME_SIZE, "%s/%s", dirname, loop_file->name); + filename[NAME_SIZE-1] = '\0'; - fnct(file); + fnct(filename, data); list_del(&loop_file->list); free(loop_file); @@ -229,22 +255,3 @@ int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix) closedir(dir); return 0; } - -/* Set the FD_CLOEXEC flag of desc if value is nonzero, - or clear the flag if value is 0. - Return 0 on success, or -1 on error with errno set. */ - -int set_cloexec_flag (int desc, int value) -{ - int oldflags = fcntl (desc, F_GETFD, 0); - /* If reading the flags failed, return error indication now. */ - if (oldflags < 0) - return oldflags; - /* Set just the flag we want to set. */ - if (value != 0) - oldflags |= FD_CLOEXEC; - else - oldflags &= ~FD_CLOEXEC; - /* Store modified flag word in the descriptor. */ - return fcntl (desc, F_SETFD, oldflags); -}