(daemon): Define errno in case /dev/null is not the correct device.
authordrepper <drepper>
Sat, 25 Sep 2004 05:30:41 +0000 (05:30 +0000)
committerdrepper <drepper>
Sat, 25 Sep 2004 05:30:41 +0000 (05:30 +0000)
misc/daemon.c

index bc93956..775ef1a 100644 (file)
@@ -65,17 +65,26 @@ daemon(nochdir, noclose)
            && (fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
                struct stat64 st;
 
-               if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) == 0
-                   && __builtin_expect (S_ISCHR (st.st_mode), 1) != 0
+               if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) == 0)
+               {
+                       if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
 #if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
-                   && st.st_rdev == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR)
+                           && (st.st_rdev
+                               == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
 #endif
-                   ) {
-                       (void)__dup2(fd, STDIN_FILENO);
-                       (void)__dup2(fd, STDOUT_FILENO);
-                       (void)__dup2(fd, STDERR_FILENO);
-                       if (fd > 2)
-                               (void)__close (fd);
+                           ) {
+                               (void)__dup2(fd, STDIN_FILENO);
+                               (void)__dup2(fd, STDOUT_FILENO);
+                               (void)__dup2(fd, STDERR_FILENO);
+                               if (fd > 2)
+                                       (void)__close (fd);
+                       } else {
+                               /* We must set an errno value since no
+                                  function call actually failed.  */
+                               close_not_cancel_no_status (fd);
+                               __set_errno (ENODEV);
+                               return -1;
+                       }
                } else {
                        close_not_cancel_no_status (fd);
                        return -1;