chiark / gitweb /
childs -> children
[elogind.git] / libudev / libudev-util-private.c
index 585dfc6a41004f08f5fe1dfd6b4a37760d702af1..2f9f4a74c31bf016bd4bef867f19333a490b907b 100644 (file)
@@ -43,18 +43,29 @@ int util_create_path(struct udev *udev, const char *path)
        pos[0] = '\0';
 
        dbg(udev, "stat '%s'\n", p);
-       if (stat(p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR)
-               return 0;
+       if (stat(p, &stats) == 0) {
+               if ((stats.st_mode & S_IFMT) == S_IFDIR)
+                       return 0;
+               else
+                       return -ENOTDIR;
+       }
 
-       if (util_create_path(udev, p) != 0)
-               return -1;
+       err = util_create_path(udev, p);
+       if (err != 0)
+               return err;
 
        dbg(udev, "mkdir '%s'\n", p);
        udev_selinux_setfscreatecon(udev, p, S_IFDIR|0755);
        err = mkdir(p, 0755);
-       if (err != 0 && errno == EEXIST)
-               if (stat(p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR)
-                       err = 0;
+       if (err != 0) {
+               err = -errno;
+               if (err == -EEXIST && stat(p, &stats) == 0) {
+                       if ((stats.st_mode & S_IFMT) == S_IFDIR)
+                               err = 0;
+                       else
+                               err = -ENOTDIR;
+               }
+       }
        udev_selinux_resetfscreatecon(udev);
        return err;
 }
@@ -73,7 +84,7 @@ int util_delete_path(struct udev *udev, const char *path)
        if (pos == p || pos == NULL)
                return 0;
 
-       while (1) {
+       for (;;) {
                *pos = '\0';
                pos = strrchr(p, '/');
 
@@ -103,8 +114,8 @@ int util_unlink_secure(struct udev *udev, const char *filename)
 {
        int err;
 
-       chmod(filename, 0000);
        chown(filename, 0, 0);
+       chmod(filename, 0000);
        err = unlink(filename);
        if (errno == ENOENT)
                err = 0;
@@ -243,7 +254,7 @@ int util_resolve_subsys_kernel(struct udev *udev, const char *string,
 
 int util_run_program(struct udev *udev, const char *command, char **envp,
                     char *result, size_t ressize, size_t *reslen,
-                    const sigset_t *sigmask)
+                    const sigset_t *sigmask, bool reset_prio)
 {
        int status;
        int outpipe[2] = {-1, -1};
@@ -338,6 +349,8 @@ int util_run_program(struct udev *udev, const char *command, char **envp,
 
                if (sigmask)
                        sigprocmask(SIG_SETMASK, sigmask, NULL);
+               if (reset_prio)
+                       setpriority(PRIO_PROCESS, 0, 0);
 
                execve(argv[0], argv, envp);
                if (errno == ENOENT || errno == ENOTDIR) {
@@ -441,7 +454,7 @@ int util_run_program(struct udev *udev, const char *command, char **envp,
                        if (errpipe[READ_END] > 0)
                                close(errpipe[READ_END]);
 
-                       /* return the childs stdout string */
+                       /* return the child's stdout string */
                        if (result) {
                                result[respos] = '\0';
                                dbg(udev, "result='%s'\n", result);