X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_lib.c;h=86a526f7e816ecca46aedf4dc622a355d92b7b74;hb=c449b25e3f998efe8f5988632126fb468ee55fc5;hp=012d60b0ea3138baa3082724a5308d90e27657db;hpb=af4b05d4917fdfa55eff3d8d53a830464d8162a1;p=elogind.git diff --git a/udev_lib.c b/udev_lib.c index 012d60b0e..86a526f7e 100644 --- a/udev_lib.c +++ b/udev_lib.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "udev.h" #include "logging.h" @@ -35,41 +36,51 @@ #include "list.h" -#define BLOCK_PATH "/block/" -#define CLASS_PATH "/class/" -#define NET_PATH "/class/net/" - -char get_device_type(const char *path, const char *subsystem) +void udev_set_values(struct udevice *udev, const char* devpath, + const char *subsystem, const char* action) { - if (strcmp(subsystem, "block") == 0) - return 'b'; - - if (strcmp(subsystem, "net") == 0) - return 'n'; - - if (strncmp(path, BLOCK_PATH, strlen(BLOCK_PATH)) == 0 && - strlen(path) > strlen(BLOCK_PATH)) - return 'b'; - - if (strncmp(path, NET_PATH, strlen(NET_PATH)) == 0 && - strlen(path) > strlen(NET_PATH)) - return 'n'; - - if (strncmp(path, CLASS_PATH, strlen(CLASS_PATH)) == 0 && - strlen(path) > strlen(CLASS_PATH)) - return 'c'; + memset(udev, 0x00, sizeof(struct udevice)); - return '\0'; + if (devpath) + strfieldcpy(udev->devpath, devpath); + if (subsystem) + strfieldcpy(udev->subsystem, subsystem); + if (action) + strfieldcpy(udev->action, action); + + if (strcmp(udev->subsystem, "block") == 0) + udev->type = 'b'; + else if (strcmp(udev->subsystem, "net") == 0) + udev->type = 'n'; + else if (strncmp(udev->devpath, "/block/", 7) == 0) + udev->type = 'b'; + else if (strncmp(udev->devpath, "/class/net/", 11) == 0) + udev->type = 'n'; + else if (strncmp(udev->devpath, "/class/", 7) == 0) + udev->type = 'c'; } -void udev_set_values(struct udevice *udev, const char* devpath, - const char *subsystem, const char* action) +int kernel_release_satisfactory(int version, int patchlevel, int sublevel) { - memset(udev, 0x00, sizeof(struct udevice)); - strfieldcpy(udev->devpath, devpath); - strfieldcpy(udev->subsystem, subsystem); - strfieldcpy(udev->action, action); - udev->type = get_device_type(devpath, subsystem); + static int kversion = 0; + static int kpatchlevel; + static int ksublevel; + + if (kversion == 0) { + struct utsname uts; + 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) @@ -219,7 +230,7 @@ int call_foreach_file(file_fnct_t fnct, const char *dirname, list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) { char filename[NAME_SIZE]; - snprintf(filename, NAME_SIZE-1, "%s/%s", dirname, loop_file->name); + snprintf(filename, NAME_SIZE, "%s/%s", dirname, loop_file->name); filename[NAME_SIZE-1] = '\0'; fnct(filename, data);