chiark / gitweb /
[PATCH] trivial: remove _all_ trailing slashes with no_trailing_slash()
[elogind.git] / udev_utils.c
index 0b730d565b666fd7f9f648a782de3d99d6b92d96..5b0355d0e9986722d3b32f348ab9035a61b53ac0 100644 (file)
@@ -25,6 +25,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <ctype.h>
 #include <dirent.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
@@ -56,16 +57,16 @@ void udev_init_device(struct udevice *udev, const char* devpath, const char *sub
        else if (strncmp(udev->devpath, "/class/", 7) == 0)
                udev->type = 'c';
 
-       udev->mode = default_mode;
-       strfieldcpy(udev->owner, default_owner);
-       strfieldcpy(udev->group, default_group);
+       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;
@@ -111,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;
@@ -143,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 {