marc 97/08/03 13:29:22
Modified: htdocs/manual/mod core.html directives.html
src http_conf_globals.h http_config.c http_core.c
http_main.c
Log:
Add a CoreDumpDirectory directive to allow users to specify where Apache
should try to core dump.
Reviewed by: Brian Behlendorf, Dean Gaudet
Revision Changes Path
1.69 +15 -0 apache/htdocs/manual/mod/core.html
Index: core.html
===================================================================
RCS file: /export/home/cvs/apache/htdocs/manual/mod/core.html,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- core.html 1997/07/30 18:41:46 1.68
+++ core.html 1997/08/03 20:29:15 1.69
@@ -29,6 +29,7 @@
<li><A HREF="#authtype">AuthType</A>
<li><A HREF="#bindaddress">BindAddress</A>
<li><A HREF="#clearmodulelist">ClearModuleList</A>
+<li><A HREF="#coredumpdirectory">CoreDumpDirectory</A>
<li><A HREF="#defaulttype">DefaultType</A>
<li><A HREF="#directory"><Directory></A>
<li><A HREF="#directorymatch"><DirectoryMatch></A>
@@ -264,6 +265,20 @@
The server comes with a built-in list of active modules. This
directive clears the list. It is assumed that the list will then be
re-populated using the <A HREF="#addmodule">AddModule</A> directive.<p><hr>
+
+<h2><A name="coredumpdirectory">CoreDumpDirectory directive</A></h2>
+<!--%plaintext <?INDEX {\tt CoreDumpDirectory} directive> -->
+<strong>Syntax:</strong> CoreDumpDirectory <em>directory</em><br>
+<strong>Default:</strong> the same location as ServerRoot<br>
+<strong>Context:</strong> server config<br>
+<strong>Status:</strong> core<p>
+
+This controls the directory to which Apache attempts to switch before
+dumping core. The default is in the <A HREF="#serverroot">ServerRoot</A>
+directory, however since this should not be writable by the user
+the server runs as, core dumps won't normally get written. If you
+want a core dump for debugging, you can use this directive to place
+it in a different location.<p><hr>
<h2><A name="defaulttype">DefaultType directive</A></h2>
<!--%plaintext <?INDEX {\tt DefaultType} directive> -->
1.29 +1 -0 apache/htdocs/manual/mod/directives.html
Index: directives.html
===================================================================
RCS file: /export/home/cvs/apache/htdocs/manual/mod/directives.html,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- directives.html 1997/07/30 20:08:16 1.28
+++ directives.html 1997/08/03 20:29:16 1.29
@@ -73,6 +73,7 @@
<li><A HREF="mod_cookies.html#cookielog">CookieLog</A> (mod_cookies)
<li><A HREF="mod_log_config.html#cookielog">CookieLog</A> (mod_log_config)
<li><A HREF="mod_usertrack.html#cookietracking">CookieTracking</A>
+<li><A HREF="core.html#coredumpdirectory">CoreDumpDirectory</A>
<li><A HREF="mod_log_config.html#customlog">CustomLog</A>
<li><A HREF="mod_autoindex.html#defaulticon">DefaultIcon</A>
<li><A HREF="core.html#defaulttype">DefaultType</A>
1.16 +5 -0 apache/src/http_conf_globals.h
Index: http_conf_globals.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_conf_globals.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- http_conf_globals.h 1997/07/27 02:15:45 1.15
+++ http_conf_globals.h 1997/08/03 20:29:18 1.16
@@ -87,3 +87,8 @@
extern char server_root[MAX_STRING_LEN];
extern char server_confname[MAX_STRING_LEN];
+/* We want this to have the least chance of being correupted if there
+ * is some memory corruption, so we allocate it statically.
+ */
+extern char coredump_dir[MAX_STRING_LEN];
+
1.69 +2 -0 apache/src/http_config.c
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- http_config.c 1997/07/28 18:22:42 1.68
+++ http_config.c 1997/08/03 20:29:18 1.69
@@ -1154,6 +1154,8 @@
bind_address.s_addr = htonl(INADDR_ANY);
listeners = NULL;
listenbacklog = DEFAULT_LISTENBACKLOG;
+ strncpy(coredump_dir, server_root, sizeof(coredump_dir)-1);
+ coredump_dir[sizeof(coredump_dir)-1] = '\0';
}
server_rec *init_server_config(pool *p)
1.104 +14 -0 apache/src/http_core.c
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.c,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -r1.103 -r1.104
--- http_core.c 1997/07/31 07:51:34 1.103
+++ http_core.c 1997/08/03 20:29:19 1.104
@@ -1242,6 +1242,19 @@
return NULL;
}
+const char *set_coredumpdir (cmd_parms *cmd, void *dummy, char *arg) {
+ struct stat finfo;
+ if (cmd->server->is_virtual)
+ return "CoreDumpDirectory not allowed in <VirtualHost>";
+ if ((stat(arg, &finfo) == -1) || !S_ISDIR(finfo.st_mode)) {
+ return pstrcat(cmd->pool, "CoreDumpDirectory ", arg,
+ " does not exist or is not a directory", NULL);
+ }
+ strncpy(coredump_dir, arg, sizeof(coredump_dir)-1);
+ coredump_dir[sizeof(coredump_dir)-1] = '\0';
+ return NULL;
+}
+
/* Note --- ErrorDocument will now work from .htaccess files.
* The AllowOverride of Fileinfo allows webmasters to turn it off
*/
@@ -1366,6 +1379,7 @@
{ "ThreadsPerChild", set_threads, NULL, RSRC_CONF, TAKE1, "Number of threads
a child creates" },
{ "ExcessRequestsPerChild", set_excess_requests, NULL, RSRC_CONF, TAKE1,
"Maximum number of requests a particular child serves after it is ready to
die." },
{ "ListenBacklog", set_listenbacklog, NULL, RSRC_CONF, TAKE1, "maximum
length of the queue of pending connections, as used by listen(2)" },
+{ "CoreDumpDirectory", set_coredumpdir, NULL, RSRC_CONF, TAKE1, "The
location of the directory Apache changes to before dumping core" },
{ NULL },
};
1.194 +7 -16 apache/src/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_main.c,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -r1.193 -r1.194
--- http_main.c 1997/08/02 06:49:32 1.193
+++ http_main.c 1997/08/03 20:29:20 1.194
@@ -193,6 +193,7 @@
char server_root[MAX_STRING_LEN];
char server_confname[MAX_STRING_LEN];
+char coredump_dir[MAX_STRING_LEN];
/* *Non*-shared http_main globals... */
@@ -1463,15 +1464,10 @@
void bus_error(int sig) {
char emsg[256];
- ap_snprintf
- (
- emsg,
- sizeof(emsg),
- "httpd: caught SIGBUS, attempting to dump core in %s",
- server_root
- );
+ ap_snprintf(emsg, sizeof(emsg),
+ "httpd: caught SIGBUS, attempting to dump core in %s", coredump_dir);
log_error(emsg, server_conf);
- chdir(server_root);
+ chdir(coredump_dir);
abort();
exit(1);
}
@@ -1479,15 +1475,10 @@
void seg_fault(int sig) {
char emsg[256];
- ap_snprintf
- (
- emsg,
- sizeof(emsg),
- "httpd: caught SIGSEGV, attempting to dump core in %s",
- server_root
- );
+ ap_snprintf(emsg, sizeof(emsg),
+ "httpd: caught SIGSEGV, attempting to dump core in %s",
coredump_dir);
log_error(emsg, server_conf);
- chdir(server_root);
+ chdir(coredump_dir);
abort();
exit(1);
}