X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_lib.c;h=86a526f7e816ecca46aedf4dc622a355d92b7b74;hb=8a0dc204e902a47a5b251c6d4a29eddb8f4a634a;hp=4991ec3acb4447699b34e2a643c76429a5d04833;hpb=6e3e3c3416864eca74cb885f64c453eb531eed63;p=elogind.git diff --git a/udev_lib.c b/udev_lib.c index 4991ec3ac..86a526f7e 100644 --- a/udev_lib.c +++ b/udev_lib.c @@ -28,89 +28,86 @@ #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) +void udev_set_values(struct udevice *udev, const char* devpath, + const char *subsystem, const char* action) { - char *action; - - action = getenv("ACTION"); - if (action != NULL && strlen(action) > ACTION_SIZE) - action[ACTION_SIZE-1] = '\0'; - - return action; + memset(udev, 0x00, sizeof(struct udevice)); + + 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'; } -char *get_devpath(void) +int kernel_release_satisfactory(int version, int patchlevel, int sublevel) { - char *devpath; - - devpath = getenv("DEVPATH"); - if (devpath != NULL && strlen(devpath) > DEVPATH_SIZE) - devpath[DEVPATH_SIZE-1] = '\0'; - - return devpath; -} - -char *get_devname(void) -{ - char *devname; - - devname = getenv("DEVNAME"); - if (devname != NULL && strlen(devname) > NAME_SIZE) - devname[NAME_SIZE-1] = '\0'; - - return devname; -} - -char *get_seqnum(void) -{ - char *seqnum; - - seqnum = getenv("SEQNUM"); + 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; + } + } - return seqnum; + if (kversion >= version && kpatchlevel >= patchlevel && ksublevel >= sublevel) + return 1; + else + return 0; } -char *get_subsystem(char *subsystem) +int create_path(const char *path) { - if (subsystem != NULL && strlen(subsystem) > SUBSYSTEM_SIZE) - subsystem[SUBSYSTEM_SIZE-1] = '\0'; - - return subsystem; -} + char p[NAME_SIZE]; + char *pos; + struct stat stats; -#define BLOCK_PATH "/block/" -#define CLASS_PATH "/class/" -#define NET_PATH "/class/net/" + strcpy (p, path); + pos = strrchr(p, '/'); + if (pos == p || pos == NULL) + return 0; -char get_device_type(const char *path, const char *subsystem) -{ - if (strcmp(subsystem, "block") == 0) - return 'b'; + while (pos[-1] == '/') + pos--; - if (strcmp(subsystem, "net") == 0) - return 'n'; + pos[0] = '\0'; - if (strncmp(path, BLOCK_PATH, strlen(BLOCK_PATH)) == 0 && - strlen(path) > strlen(BLOCK_PATH)) - return 'b'; + dbg("stat '%s'\n", p); + if (stat (p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR) + return 0; - 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'; + if (create_path (p) != 0) + return -1; - return '\0'; + dbg("mkdir '%s'\n", p); + return mkdir(p, 0755); } int file_map(const char *filename, char **buf, size_t *bufsize) @@ -154,18 +151,7 @@ size_t buf_get_line(char *buf, size_t buflen, size_t cur) return count - cur; } -void leading_slash(char *path) -{ - int len; - - len = strlen(path); - if (len > 0 && path[len-1] != '/') { - path[len] = '/'; - path[len+1] = '\0'; - } -} - -void no_leading_slash(char *path) +void no_trailing_slash(char *path) { int len; @@ -203,12 +189,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); @@ -242,11 +228,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) { - strfieldcpy(file, dirname); - strfieldcat(file, "/"); - strfieldcat(file, loop_file->name); + 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); @@ -255,22 +242,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); -}