chiark / gitweb /
[PATCH] cleanup db functions
[elogind.git] / udev_utils.c
index fe18892de19fa2eeb3332ad526b8b5c533430cd9..e6580d2c0acdca0404e17b2cddb1eee19ec0ad6d 100644 (file)
@@ -47,26 +47,26 @@ void udev_init_device(struct udevice *udev, const char* devpath, const char *sub
                strfieldcpy(udev->subsystem, subsystem);
 
        if (strcmp(udev->subsystem, "block") == 0)
-               udev->type = 'b';
+               udev->type = BLOCK;
        else if (strcmp(udev->subsystem, "net") == 0)
-               udev->type = 'n';
+               udev->type = NET;
        else if (strncmp(udev->devpath, "/block/", 7) == 0)
-               udev->type = 'b';
+               udev->type = BLOCK;
        else if (strncmp(udev->devpath, "/class/net/", 11) == 0)
-               udev->type = 'n';
+               udev->type = NET;
        else if (strncmp(udev->devpath, "/class/", 7) == 0)
-               udev->type = 'c';
+               udev->type = CLASS;
 
-       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;
@@ -112,6 +112,31 @@ int create_path(const char *path)
        return mkdir(p, 0755);
 }
 
+/* Reset permissions on the device node, before unlinking it to make sure,
+ * that permisions of possible hard links will be removed too.
+ */
+int unlink_secure(const char *filename)
+{
+       int retval;
+
+       retval = chown(filename, 0, 0);
+       if (retval)
+               dbg("chown(%s, 0, 0) failed with error '%s'", filename, strerror(errno));
+
+       retval = chmod(filename, 0000);
+       if (retval)
+               dbg("chmod(%s, 0000) failed with error '%s'", filename, strerror(errno));
+
+       retval = unlink(filename);
+       if (errno == ENOENT)
+               retval = 0;
+
+       if (retval)
+               dbg("unlink(%s) failed with error '%s'", filename, strerror(errno));
+
+       return retval;
+}
+
 int parse_get_pair(char **orig_string, char **left, char **right)
 {
        char *temp;
@@ -200,11 +225,11 @@ size_t buf_get_line(const char *buf, size_t buflen, size_t 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 {