Changes with Apache 1.2.1
-
+
+ *) Attempt to work around problems with third party libraries that do not
+ handle high numbered descriptors (examples include bind, and
+ solaris libc). On all systems apache attempts to keep all permanent
+ descriptors above 15 (called the low slack line). Solaris users
+ can also benefit from adding -DHIGH_SLACK_LINE=256 to EXTRA_CFLAGS
+ which keeps all non-FILE * descriptors above 255. On all systems
+ this should make supporting large numbers of vhosts with many open
+ log files more feasible. If this causes trouble please report it,
+ you can disable this workaround by adding -DNO_SLACK to EXTRA_CFLAGS.
+ [Dean Gaudet] various PRs
+
+ *) Related to the last entry, network sockets are now opened before
+ log files are opened. The only known case where this can cause
+ problems is under Solaris with many virtualhosts and many Listen
+ directives. But using -DHIGH_SLACK_LINE=256 described above will
+ work around this problem. [Dean Gaudet]
+
*) pregsub had an off-by-1 in its error checking code. [Alexei Kosut]
Changes with Apache 1.2
NO_LINGCLOSE:
Do not use Apache's soft, "lingering" close feature to
terminate connections.
+ NO_SLACK:
+ Do not use the "slack" fd feature which requires a working fcntl
+ F_DUPFD.
--
MISC #DEFINES:
extern void GETPRIVMODE();
extern void GETUSERMODE();
extern char *inet_ntoa();
+#define NO_SLACK
#elif defined(SUNOS4)
#define HAVE_GMTOFF
extern void GETPRIVMODE();
extern void GETUSERMODE();
extern char *inet_ntoa();
+#define NO_SLACK
#elif defined(SUNOS4)
#define HAVE_GMTOFF
/* For http_main.c... */
server_rec *read_config (pool *conf_pool, pool *temp_pool, char *config_name);
+void init_modules(pool *p, server_rec *s);
void setup_prelinked_modules();
void show_directives();
void show_modules();
#define DECLINED -1 /* Module declines to handle */
#define OK 0 /* Module has handled this stage. */
+
/* ----------------------- HTTP Status Codes ------------------------- */
#define RESPONSE_CODES 38
unsigned long get_virthost_addr (const char *hostname, unsigned short *port);
extern time_t restart_time;
+
+/*
+ * Apache tries to keep all of its long term filehandles (such as log files,
+ * and sockets) above this number. This is to workaround problems in many
+ * third party libraries that are compiled with a small FD_SETSIZE. There
+ * should be no reason to lower this, because it's only advisory. If a file
+ * can't be allocated above this number then it will remain in the "slack"
+ * area.
+ *
+ * Only the low slack line is used by default. If HIGH_SLACK_LINE is defined
+ * then an attempt is also made to keep all non-FILE * files above the high
+ * slack line. This is to work around a Solaris C library limitation, where it
+ * uses an unsigned char to store the file descriptor.
+ */
+#ifndef LOW_SLACK_LINE
+#define LOW_SLACK_LINE 15
+#endif
+/* #define HIGH_SLACK_LINE 255 */
+
+/*
+ * The ap_slack() function takes a fd, and tries to move it above the indicated
+ * line. It returns an fd which may or may not have moved above the line, and
+ * never fails. If the high line was requested and it fails it will also try
+ * the low line.
+ */
+int ap_slack (int fd, int line);
+#define AP_SLACK_LOW 1
+#define AP_SLACK_HIGH 2
* rst --- 4/95 --- 6/95
*/
-#include "conf.h"
-#include "alloc.h"
+#include "httpd.h"
#include <stdarg.h>
block_alarms();
fd = open(name, flg, mode);
save_errno = errno;
- if (fd >= 0) note_cleanups_for_fd (a, fd);
+ if (fd >= 0) {
+ fd = ap_slack (fd, AP_SLACK_HIGH);
+ note_cleanups_for_fd (a, fd);
+ }
unblock_alarms();
errno = save_errno;
return fd;
desc = open(name, baseFlag | O_APPEND | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (desc >= 0) {
+ desc = ap_slack(desc, AP_SLACK_LOW);
fd = fdopen(desc, mode);
}
} else {
server_rec *read_config(pool *p, pool *ptemp, char *confname)
{
server_rec *s = init_server_config(p);
- module *m;
init_config_globals(p);
fixup_virtual_hosts (p, s);
+ return s;
+}
+
+
+void init_modules(pool *p, server_rec *s)
+{
+ module *m;
+
for (m = top_module; m; m = m->next)
if (m->init)
(*m->init) (s, p);
-
- return s;
}
+
/********************************************************************
* Configuration directives are restricted in terms of where they may
* appear in the main configuration files and/or .htaccess files according
exit(1);
}
+ s = ap_slack(s, AP_SLACK_HIGH);
+
note_cleanups_for_fd(pconf, s); /* arrange to close on exec or restart */
#ifndef MPE
ptrans = make_sub_pool (pconf);
server_conf = read_config (pconf, ptrans, server_confname);
- open_logs (server_conf, pconf);
- set_group_privs ();
- accept_mutex_init (pconf);
- if (!is_graceful) {
- reinit_scoreboard(pconf);
- }
-#ifdef SCOREBOARD_FILE
- else {
- scoreboard_fname = server_root_relative (pconf, scoreboard_fname);
- note_cleanups_for_fd (pconf, scoreboard_fd);
- }
-#endif
-
- default_server_hostnames (server_conf);
if (listeners == NULL) {
if (!is_graceful) {
sd = -1;
}
+ init_modules (pconf, server_conf);
+ open_logs (server_conf, pconf);
+ set_group_privs ();
+ accept_mutex_init (pconf);
+ if (!is_graceful) {
+ reinit_scoreboard(pconf);
+ }
+#ifdef SCOREBOARD_FILE
+ else {
+ scoreboard_fname = server_root_relative (pconf, scoreboard_fname);
+ note_cleanups_for_fd (pconf, scoreboard_fd);
+ }
+#endif
+
+ default_server_hostnames (server_conf);
+
set_signals ();
log_pid (pconf, pid_fname);
suexec_enabled = init_suexec();
server_conf = read_config (pconf, ptrans, server_confname);
+ init_modules (pconf, server_conf);
if(standalone) {
clear_pool (pconf); /* standalone_main rereads... */
return (p);
}
#endif
+
+
+int ap_slack (int fd, int line)
+{
+#if !defined(F_DUPFD) || defined(NO_SLACK)
+ return fd;
+#else
+ int new_fd;
+
+#ifdef HIGH_SLACK_LINE
+ if (line == AP_SLACK_HIGH) {
+ new_fd = fcntl (fd, F_DUPFD, HIGH_SLACK_LINE);
+ if (new_fd != -1) {
+ close (fd);
+ return new_fd;
+ }
+ }
+#endif
+ /* otherwise just assume line == AP_SLACK_LOW */
+ new_fd = fcntl (fd, F_DUPFD, LOW_SLACK_LINE);
+ if (new_fd == -1) {
+ return fd;
+ }
+ close (fd);
+ return new_fd;
+#endif
+}