dgaudet 97/10/01 22:10:36
Modified: htdocs/manual new_features_1_3.html
src CHANGES
src/main http_main.c http_log.c
Log:
detach from stdin/out/err when booting
PR: 523
Reviewed by: Dean Gaudet, Brian Behlendorf, Jim Jagielski
Revision Changes Path
1.24 +6 -0 apachen/htdocs/manual/new_features_1_3.html
Index: new_features_1_3.html
===================================================================
RCS file: /export/home/cvs/apachen/htdocs/manual/new_features_1_3.html,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- new_features_1_3.html 1997/09/30 23:24:28 1.23
+++ new_features_1_3.html 1997/10/02 05:10:26 1.24
@@ -304,6 +304,12 @@
<a href="mod/mod_cern_meta.html">mod_cern_meta</a> is now configurable
on a per-directory basis.
+<li><strong>Detaching from stdin/out/err</strong><br>
+ On boot Apache will now detach from stdin, stdout, and stderr. It
+ does not detach from stderr until it has successfully read the config
+ files. So you will see errors in the config file. This should make
+ it easier to start Apache via rsh or crontab.
+
<li><strong>API Additions</strong><br>
For all those module writers and code hackers:
1.454 +8 -1 apachen/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apachen/src/CHANGES,v
retrieving revision 1.453
retrieving revision 1.454
diff -u -r1.453 -r1.454
--- CHANGES 1997/09/30 21:48:37 1.453
+++ CHANGES 1997/10/02 05:10:30 1.454
@@ -1,5 +1,12 @@
Changes with Apache 1.3b1
-
+
+ *) When booting, apache will now detach itself from stdin, stdout,
+ and stderr. stderr will not be detached until after the config
+ files have been read so you will be able to see initial error
+ messages. After that all errors are logged in the error_log.
+ This makes it more convenient to start apache via rsh, ssh,
+ or crontabs. [Dean Gaudet] PR#523
+
*) mod_proxy was sending HTTP/1.1 responses to ftp requests by mistake.
Also removed the auto-generated link to www.apache.org that was the
source of so many misdirected bug reports. [Roy Fielding, Marc Slemko]
1.227 +19 -0 apachen/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_main.c,v
retrieving revision 1.226
retrieving revision 1.227
diff -u -r1.226 -r1.227
--- http_main.c 1997/09/25 01:03:22 1.226
+++ http_main.c 1997/10/02 05:10:33 1.227
@@ -2077,6 +2077,25 @@
exit(1);
}
#endif
+
+ /* close out the standard file descriptors */
+ if (freopen("/dev/null", "r", stdin) == NULL) {
+ fprintf(stderr, "httpd: unable to replace stdin with /dev/null: %s\n",
+ strerror(errno));
+ /* continue anyhow -- note we can't close out descriptor 0 because we
+ * have nothing to replace it with, and if we didn't have a descriptor
+ * 0 the next file would be created with that value ... leading to
+ * havoc.
+ */
+ }
+ if (freopen("/dev/null", "w", stdout) == NULL) {
+ fprintf(stderr, "httpd: unable to replace stdout with /dev/null: %s\n",
+ strerror(errno));
+ }
+ /* stderr is a tricky one, we really want it to be the error_log,
+ * but we haven't opened that yet. So leave it alone for now and it'll
+ * be reopened moments later.
+ */
#endif /* ndef WIN32 */
}
1.35 +27 -0 apachen/src/main/http_log.c
Index: http_log.c
===================================================================
RCS file: /export/home/cvs/apachen/src/main/http_log.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- http_log.c 1997/09/12 20:37:33 1.34
+++ http_log.c 1997/10/02 05:10:34 1.35
@@ -224,8 +224,35 @@
void open_logs (server_rec *s_main, pool *p)
{
server_rec *virt, *q;
+#ifndef WIN32
+ int replace_stderr;
+#endif
open_error_log (s_main, p);
+
+#ifndef WIN32
+ replace_stderr = 1;
+ if (s_main->error_log) {
+ /* replace stderr with this new log */
+ fflush(stderr);
+ if (dup2(fileno(s_main->error_log), 2) == -1) {
+ aplog_error(APLOG_MARK, APLOG_CRIT, s_main,
+ "unable to replace stderr with error_log: %s",
+ strerror(errno));
+ } else {
+ replace_stderr = 0;
+ }
+ }
+ /* note that stderr may still need to be replaced with something
+ * because it points to the old error log, or back to the tty
+ * of the submitter.
+ */
+ if (replace_stderr && freopen("/dev/null", "w", stderr) == NULL) {
+ aplog_error(APLOG_MARK, APLOG_CRIT, s_main,
+ "unable to replace stderr with /dev/null: %s",
+ strerror(errno));
+ }
+#endif
for (virt = s_main->next; virt; virt = virt->next) {
if (virt->error_fname)