chiark / gitweb /
[PATCH] switch major/minor to dev_t
[elogind.git] / udev_utils.c
index 364037f7a98edf9f5e2ea267e57b09b422f79b81..fda1f42f7e0272c8957822a8e2be107b4ba20c9d 100644 (file)
@@ -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 {