aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-09-25 05:30:41 +0000
committerUlrich Drepper <drepper@redhat.com>2004-09-25 05:30:41 +0000
commit267a7a9eca77719b9cee482585d04ad515a4436d (patch)
treeb38cb2e73cf79014b8dc790a2884159b64e3bf06
parent5fa3cee8e9d0e2a2222ba760b538a6583ccb983c (diff)
downloadglibc-267a7a9eca77719b9cee482585d04ad515a4436d.zip
glibc-267a7a9eca77719b9cee482585d04ad515a4436d.tar.gz
glibc-267a7a9eca77719b9cee482585d04ad515a4436d.tar.bz2
(daemon): Define errno in case /dev/null is not the correct device.
-rw-r--r--misc/daemon.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/misc/daemon.c b/misc/daemon.c
index bc93956..775ef1a 100644
--- a/misc/daemon.c
+++ b/misc/daemon.c
@@ -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;