Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Mar 1999 14:18:25 +0800
From:      Peter Wemm <peter@netplex.com.au>
To:        Ollivier Robert <roberto@keltia.freenix.fr>
Cc:        "FreeBSD Hackers' list" <freebsd-hackers@FreeBSD.ORG>
Subject:   Re: Fwd: Re: cron problem? 
Message-ID:  <199903220618.OAA53483@spinner.netplex.com.au>
In-Reply-To: Your message of "Mon, 22 Mar 1999 00:13:09 %2B0100." <19990322001309.A53335@keltia.freenix.fr> 

next in thread | previous in thread | raw e-mail | index | archive | help
Ollivier Robert wrote:
> Wietse found the following while writing Postfix. Can anyone look at it ?

A followup is on the way, I tracked down what is causing it.

cron(8) is passed stdout etc pointing to /dev/console at startup.
[some time later at the end of the boot sequence]
init fires up a getty on /dev/ttyv0
revoke("/dev/ttyv0") is redirecting the /dev/console fd's to deadfs
[later]
cron does a popen() to sendmail (postfix in this case)
stdin is a pipe, stdout/err are inherited deadfs descriptors formerly to
   /dev/console
fstat() on the inherited descriptor returns EBADF.
methods of testing open fd's no longer work.

> ----- Forwarded message from Wietse Venema <wietse@porcupine.org> -----
> 
> Subject: Re: cron problem?
> Date: Fri, 19 Mar 1999 14:59:34 -0500 (EST)
> From: wietse@porcupine.org (Wietse Venema)
> 
> Found it. I'll post a patch later. This must be a *BSD oddity.
> 
> 	Wietse
> 
> Problem: 
> 
> 	Vixie cron output from an /etc/crontab entry is not mailed,
> 	unless the crontab line ends with an explicit mail command
> 
> System:
> 
> 	FreeBSD 2.x, BSD/OS 2.x ... (yes I'm not running the latest)
> 
> Analysis:
> 
> 	For the sake of security and robustness, Postfix tries to
> 	ensure that stdin/out/err are open before opening anything
> 	else.  The following code fragment appears in many programs
> 	that I wrote in the course of time:
> 
> 	    for (fd = 0; fd < 3; fd++)
> 		if (fstat(fd, &st) == -1 && open("/dev/null", O_WRONLY) != fd)
> 		    msg_fatal("open /dev/null: %m");
> 
> 	This fragment examines the status of stdin/stdout/stderr.
> 	When fstat() returns an error, the code assumes the file
> 	descriptor is not in use, and expects that the next open()
> 	will allocate that file descriptor.
> 
> 	However, the kernel trace shows a small surprise:
> 
> 	  3817 sendmail CALL  fstat(0,0xefbfddc8)
> 	  3817 sendmail RET   fstat 0
> 	  3817 sendmail CALL  fstat(0x1,0xefbfddc8)
> 	  3817 sendmail RET   fstat -1 errno 9 Bad file descriptor
> 	  3817 sendmail CALL  open(0x1c8c,0x1,0xefbfde4c)
> 	  3817 sendmail NAMI  "/dev/null"
> 	  3817 sendmail RET   open 3
> 
> 	So: fstat(1) returns EBADF, and open() returns 3.
> 
> 	Conclusion: file descriptor 1 is still in use.
> 
> 	*** Why on earth does fstat() return EBADF on an open file
> 	descriptor? ***
> 
> Workaround:
> 
> 	Close the file descriptor after error return from fstat().
> 
> 	The following code does the job.
> 
> 	    if (fstat(fd, &st) == -1
> 		&& (close(fd), open("/dev/null", O_WRONLY)) != fd)
> 		msg_fatal("open /dev/null: %m");
> 
> 
> 
> 
> ----- End forwarded message -----
> 
> -- 
> Ollivier ROBERT -=- FreeBSD: The Power to Serve! -=- roberto@keltia.freenix.f
    r
> FreeBSD keltia.freenix.fr 4.0-CURRENT #70: Sat Feb 27 09:43:08 CET 1999
> 
> 
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-hackers" in the body of the message
> 

Cheers,
-Peter
--
Peter Wemm <peter@netplex.com.au>   Netplex Consulting
"No coffee, No workee!" :-)




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903220618.OAA53483>