chiark / gitweb /
[PATCH] fix test for temporary nodes
[elogind.git] / udev_utils.c
index fe18892de19fa2eeb3332ad526b8b5c533430cd9..fda1f42f7e0272c8957822a8e2be107b4ba20c9d 100644 (file)
@@ -57,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;
@@ -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 {