X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_utils.c;h=5b0355d0e9986722d3b32f348ab9035a61b53ac0;hp=bdf0233e3ae1c5828f6cedc4acfea3463a227a58;hb=e39515ac1fd303c0263ee4bc91f2d7699617d0bf;hpb=9af5bb2f8fdbf54c064ddbd319d61092f28a4132 diff --git a/udev_utils.c b/udev_utils.c index bdf0233e3..5b0355d0e 100644 --- a/udev_utils.c +++ b/udev_utils.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -36,8 +37,7 @@ #include "list.h" -void udev_set_values(struct udevice *udev, const char* devpath, - const char *subsystem, const char* action) +void udev_init_device(struct udevice *udev, const char* devpath, const char *subsystem) { memset(udev, 0x00, sizeof(struct udevice)); @@ -45,8 +45,6 @@ void udev_set_values(struct udevice *udev, const char* 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'; @@ -58,13 +56,17 @@ void udev_set_values(struct udevice *udev, const char* devpath, udev->type = 'n'; else if (strncmp(udev->devpath, "/class/", 7) == 0) udev->type = 'c'; + + udev->mode = 0660; + strcpy(udev->owner, "root"); + strcpy(udev->group, "root"); } -int kernel_release_satisfactory(int version, int patchlevel, int sublevel) +int kernel_release_satisfactory(unsigned int version, unsigned int patchlevel, unsigned int sublevel) { - static int kversion = 0; - static int kpatchlevel; - static int ksublevel; + static unsigned int kversion = 0; + static unsigned int kpatchlevel; + static unsigned int ksublevel; if (kversion == 0) { struct utsname uts; @@ -110,6 +112,41 @@ int create_path(const char *path) return mkdir(p, 0755); } +int parse_get_pair(char **orig_string, char **left, char **right) +{ + char *temp; + char *string = *orig_string; + + if (!string) + return -ENODEV; + + /* eat any whitespace */ + while (isspace(*string) || *string == ',') + ++string; + + /* split based on '=' */ + temp = strsep(&string, "="); + *left = temp; + if (!string) + return -ENODEV; + + /* take the right side and strip off the '"' */ + while (isspace(*string)) + ++string; + if (*string == '"') + ++string; + else + return -ENODEV; + + temp = strsep(&string, "\""); + if (!string || *temp == '\0') + return -ENODEV; + *right = temp; + *orig_string = string; + + return 0; +} + int file_map(const char *filename, char **buf, size_t *bufsize) { struct stat stats; @@ -142,22 +179,32 @@ void file_unmap(char *buf, size_t bufsize) munmap(buf, bufsize); } -size_t buf_get_line(char *buf, size_t buflen, size_t cur) +/* return number of chars until the next newline, skip escaped newline */ +size_t buf_get_line(const char *buf, size_t buflen, size_t cur) { - size_t count = 0; + int escape = 0; + size_t count; + + for (count = cur; count < buflen; count++) { + if (!escape && buf[count] == '\n') + break; - for (count = cur; count < buflen && buf[count] != '\n'; count++); + if (buf[count] == '\\') + escape = 1; + else + escape = 0; + } return count - cur; } void no_trailing_slash(char *path) { - int len; + size_t len; len = strlen(path); - if (len > 0 && path[len-1] == '/') - path[len-1] = '\0'; + while (len > 0 && path[len-1] == '/') + path[--len] = '\0'; } struct files {