You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 1998/09/22 20:05:56 UTC
cvs commit: apache-2.0/apache-nspr/os/win32 modules.c util_win32.c
dgaudet 98/09/22 11:05:55
Modified: apache-nspr Configuration.tmpl Makefile.tmpl
apache-nspr/ap Makefile.tmpl ap.dsp ap_snprintf.c
apache-nspr/include alloc.h ap.h ap_config.h buff.h
hsregex.h http_conf_globals.h http_log.h
http_protocol.h http_request.h httpd.h scoreboard.h
util_md5.h
apache-nspr/main Makefile.tmpl alloc.c buff.c http_config.c
http_core.c http_log.c http_main.c http_protocol.c
http_request.c rfc1413.c util.c util_date.c
util_md5.c util_script.c
apache-nspr/modules/example mod_example.c
apache-nspr/modules/experimental mod_mmap_static.c
apache-nspr/modules/proxy Makefile.tmpl proxy_cache.c
proxy_connect.c proxy_ftp.c proxy_http.c
apache-nspr/modules/standard Makefile.tmpl mod_access.c
mod_actions.c mod_asis.c mod_auth.c mod_autoindex.c
mod_cern_meta.c mod_cgi.c mod_digest.c mod_dir.c
mod_expires.c mod_imap.c mod_include.c mod_info.c
mod_log_config.c mod_mime.c mod_mime_magic.c
mod_negotiation.c mod_rewrite.c mod_rewrite.h
mod_so.c mod_speling.c mod_status.c mod_userdir.c
apache-nspr/os/unix os.c
apache-nspr/os/win32 modules.c util_win32.c
Removed: apache-nspr/include conf.h
Log:
painful conflict resolution... I have not tried to compile this
Revision Changes Path
1.3 +27 -20 apache-2.0/apache-nspr/Configuration.tmpl
Index: Configuration.tmpl
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/Configuration.tmpl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Configuration.tmpl 1998/06/30 08:57:04 1.2
+++ Configuration.tmpl 1998/09/22 18:05:05 1.3
@@ -58,6 +58,7 @@
EXTRA_DEPS=
#CC=
+#CPP=
#OPTIM=
#RANLIB=
@@ -72,8 +73,7 @@
# knowledge on how to compile these DSO files because this is
# heavily platform-dependent. The current state of supported and
# explicitly unsupported platforms can be found in the file
-# "htdocs/manual/sharedobjects.html", under
-# "Supported Platforms".
+# "htdocs/manual/dso.html", under "Supported Platforms".
#
# For other platforms where you want to use the DSO mechanism you
# first have to make sure it supports the pragmatic dlopen()
@@ -90,6 +90,19 @@
# Then enable the DSO feature for particular modules individually
# by replacing their `AddModule' command with `SharedModule' and
# change the filename extension from `.o' to `.so'.
+#
+# Sometimes the DSO files need to be linked against other shared
+# libraries to explicitly resolve symbols from them when the
+# httpd program not already contains references to them. For
+# instance when buidling mod_auth_db as a DSO you need to link
+# the DSO against the libdb explicity because the Apache kernel
+# has no references for this library. But the problem is that
+# this "chaining" is not supported on all platforms. Although one
+# usually can link a DSO against another DSO without linker
+# complains the linkage is not really done on these platforms.
+# So, when you receive "unresolved symbol" errors under runtime
+# when using the LoadModule directive for a particular module try
+# to enable the SHARED_CHAIN rule below.
#CFLAGS_SHLIB=
#LD_SHLIB=
@@ -97,6 +110,7 @@
#LDFLAGS_SHLIB_EXPORT=
Rule SHARED_CORE=default
+Rule SHARED_CHAIN=default
################################################################
# Rules configuration
@@ -105,7 +119,7 @@
# functions. The format is: Rule RULE=value
#
# At present, only the following RULES are known: WANTHSREGEX, SOCKS4,
-# SOCKS5, STATUS, IRIXNIS, IRIXN32 and PARANOID.
+# SOCKS5, IRIXNIS, IRIXN32 and PARANOID.
#
# For all Rules, if set to "yes", then Configure knows we want that
# capability and does what is required to add it in. If set to "default"
@@ -122,12 +136,6 @@
# location to EXTRA_LIBS, otherwise Configure will assume
# "-L/usr/local/lib -lsocks5"
#
-# STATUS:
-# If Configure determines that you are using the status_module,
-# it will automatically enable full status information if set
-# to 'yes'. If the status module is not included, having STATUS
-# set to 'yes' has no impact.
-#
# IRIXNIS:
# Only takes effect if Configure determines that you are running
# SGI IRIX. If you are using a (ancient) 4.x version of IRIX, you
@@ -148,7 +156,6 @@
# actually print-out the code that the modules execute
#
-Rule STATUS=yes
Rule SOCKS4=no
Rule SOCKS5=no
Rule IRIXNIS=no
@@ -188,6 +195,13 @@
# is and the more memory it will take, so if you are unlikely to use the
# functionality of a particular module you might wish to leave it out.
+## mod_mmap_static is an experimental module, you almost certainly
+## don't need it. It can make some webservers faster. No further
+## documentation is provided here because you'd be foolish
+## to use mod_mmap_static without reading the full documentation.
+
+# AddModule modules/experimental/mod_mmap_static.o
+
##
## Config manipulation modules
##
@@ -223,10 +237,10 @@
##
## The status module allows the server to display current details about
## how well it is performing and what it is doing. Consider also enabling
-## STATUS=yes (see the Rules section near the start of this file) to allow
-## full status information. Check conf/access.conf on how to enable this.
+## the 'ExtendedStatus On' directive to allow full status information.
+## Please note that doing so can result in a palpable performance hit.
-# AddModule modules/standard/mod_status.o
+AddModule modules/standard/mod_status.o
## The Info module displays configuration information for the server and
## all included modules. It's very useful for debugging.
@@ -358,13 +372,6 @@
## Don't change this entry to a 'SharedModule' variant (Bootstrapping!)
# AddModule modules/standard/mod_so.o
-
-## mod_mmap_static is an experimental module, you almost certainly
-## don't need it. It can make some webservers faster. No further
-## documentation is provided here because you'd be foolish
-## to use mod_mmap_static without reading the full documentation.
-
-# AddModule modules/experimental/mod_mmap_static.o
## mod_setenvif lets you set environment variables based on the HTTP header
## fields in the request; this is useful for conditional HTML, for example.
1.3 +10 -16 apache-2.0/apache-nspr/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/Makefile.tmpl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile.tmpl 1998/06/30 08:57:04 1.2
+++ Makefile.tmpl 1998/09/22 18:05:06 1.3
@@ -34,20 +34,20 @@
$(CC) $(INCLUDES) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_SHLIB_EXPORT) \
-o $(TARGET) -DSHARED_CORE_BOOTSTRAP main/http_main.c
-libhttpd.ep: libhttpd.so
+libhttpd.ep: libhttpd.$(SHLIB_SUFFIX_NAME)
$(CC) $(INCLUDES) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_SHLIB_EXPORT) \
-o libhttpd.ep -DSHARED_CORE_TIESTATIC main/http_main.c \
-L. -lhttpd $(LIBS)
-libhttpd.so: subdirs modules.o
+libhttpd.$(SHLIB_SUFFIX_NAME): subdirs modules.o
$(CC) -c $(INCLUDES) $(CFLAGS) buildmark.c
- $(LD_SHLIB) $(LDFLAGS_SHLIB) -o libhttpd.so buildmark.o $(OBJS) $(REGLIB)
+ $(LD_SHLIB) $(LDFLAGS_SHLIB) -o libhttpd.$(SHLIB_SUFFIX_NAME) buildmark.o $(OBJS) $(REGLIB)
@if [ ".$(SHLIB_SUFFIX_LIST)" != . ]; then \
- rm -f libhttpd.so.*; \
+ rm -f libhttpd.$(SHLIB_SUFFIX_NAME).*; \
for suffix in $(SHLIB_SUFFIX_LIST) ""; do \
[ ".$$suffix" = . ] && continue; \
- echo "ln libhttpd.so libhttpd.so.$$suffix"; \
- ln libhttpd.so libhttpd.so.$$suffix; \
+ echo "ln libhttpd.$(SHLIB_SUFFIX_NAME) libhttpd.$(SHLIB_SUFFIX_NAME).$$suffix"; \
+ ln libhttpd.$(SHLIB_SUFFIX_NAME) libhttpd.$(SHLIB_SUFFIX_NAME).$$suffix; \
done; \
fi
@@ -66,7 +66,7 @@
echo "<=== $(SDP)support"
clean:
- rm -f $(TARGET) libhttpd.* *.o
+ -rm -f $(TARGET) libhttpd.* *.o
@for i in $(SUBDIRS); do \
echo "===> $(SDP)$$i"; \
( cd $$i && $(MAKE) $(MFLAGS_STATIC) SDP='$(SDP)' $@ ) || exit 1; \
@@ -74,13 +74,13 @@
done
distclean:
- -rm -f $(TARGET) *.o
+ -rm -f $(TARGET) libhttpd.* *.o
@for i in $(SUBDIRS); do \
echo "===> $(SDP)$$i"; \
( cd $$i && $(MAKE) $(MFLAGS_STATIC) SDP='$(SDP)' $@ ) || exit 1; \
echo "<=== $(SDP)$$i"; \
done
- -rm -f include/ap_config.h
+ -rm -f include/ap_config_auto.h
-rm -f modules.c
-rm -f modules/Makefile
-rm -f regex/Makefile
@@ -108,12 +108,6 @@
#Dependencies
-$(OBJS): Makefile
+$(OBJS): Makefile subdirs
# DO NOT REMOVE
-buildmark.o: buildmark.c include/conf.h os/unix/os.h include/httpd.h \
- include/alloc.h include/buff.h include/ap.h include/util_uri.h
-iterate_components.o: iterate_components.c
-modules.o: modules.c include/httpd.h include/conf.h os/unix/os.h \
- include/alloc.h include/buff.h include/ap.h include/util_uri.h \
- include/http_config.h
1.3 +25 -16 apache-2.0/apache-nspr/ap/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/ap/Makefile.tmpl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile.tmpl 1998/06/30 08:57:05 1.2
+++ Makefile.tmpl 1998/09/22 18:05:07 1.3
@@ -6,7 +6,7 @@
LIB=libap.a
OBJS=ap_execve.o ap_cpystrn.o \
- ap_slack.o ap_snprintf.o
+ ap_slack.o ap_snprintf.o ap_fnmatch.o
.c.o:
$(CC) -c $(INCLUDES) $(CFLAGS) $<
@@ -39,18 +39,27 @@
&& rm Makefile.new
# DO NOT REMOVE
-ap_cpystrn.o: ap_cpystrn.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h
-ap_execve.o: ap_execve.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h
-ap_signal.o: ap_signal.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h
-ap_slack.o: ap_slack.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_log.h
-ap_snprintf.o: ap_snprintf.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h
+ap_cpystrn.o: ap_cpystrn.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
+ $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
+ $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h $(INCDIR)/alloc.h \
+ $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h
+ap_execve.o: ap_execve.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
+ $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
+ $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h $(INCDIR)/alloc.h \
+ $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h
+ap_fnmatch.o: ap_fnmatch.c $(INCDIR)/ap_config.h $(INCDIR)/ap_mmn.h \
+ $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h $(INCDIR)/ap_ctype.h \
+ $(INCDIR)/hsregex.h $(INCDIR)/fnmatch.h
+ap_signal.o: ap_signal.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
+ $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
+ $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h $(INCDIR)/alloc.h \
+ $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h
+ap_slack.o: ap_slack.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
+ $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
+ $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h $(INCDIR)/alloc.h \
+ $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
+ $(INCDIR)/http_log.h
+ap_snprintf.o: ap_snprintf.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \
+ $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \
+ $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h $(INCDIR)/alloc.h \
+ $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h
1.3 +4 -0 apache-2.0/apache-nspr/ap/ap.dsp
Index: ap.dsp
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/ap/ap.dsp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ap.dsp 1998/06/30 08:57:05 1.2
+++ ap.dsp 1998/09/22 18:05:07 1.3
@@ -83,6 +83,10 @@
# End Source File
# Begin Source File
+SOURCE=.\ap_fnmatch.c
+# End Source File
+# Begin Source File
+
SOURCE=.\ap_signal.c
# End Source File
# Begin Source File
1.3 +5 -5 apache-2.0/apache-nspr/ap/ap_snprintf.c
Index: ap_snprintf.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/ap/ap_snprintf.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ap_snprintf.c 1998/06/30 08:57:05 1.2
+++ ap_snprintf.c 1998/09/22 18:05:08 1.3
@@ -290,7 +290,7 @@
#define STR_TO_DEC( str, num ) \
num = NUM( *str++ ) ; \
- while ( isdigit( *str ) ) \
+ while ( ap_isdigit( *str ) ) \
{ \
num *= 10 ; \
num += NUM( *str++ ) ; \
@@ -450,7 +450,7 @@
/*
* Check for Infinity and NaN
*/
- if (isalpha(*p)) {
+ if (ap_isalpha(*p)) {
*len = strlen(strcpy(buf, p));
*is_negative = FALSE;
return (buf);
@@ -610,7 +610,7 @@
/*
* Try to avoid checking for flags, width or precision
*/
- if (isascii(*fmt) && !islower(*fmt)) {
+ if (!ap_islower(*fmt)) {
/*
* Recognize flags: -, #, BLANK, +
*/
@@ -632,7 +632,7 @@
/*
* Check if a width was specified
*/
- if (isdigit(*fmt)) {
+ if (ap_isdigit(*fmt)) {
STR_TO_DEC(fmt, min_width);
adjust_width = YES;
}
@@ -658,7 +658,7 @@
if (*fmt == '.') {
adjust_precision = YES;
fmt++;
- if (isdigit(*fmt)) {
+ if (ap_isdigit(*fmt)) {
STR_TO_DEC(fmt, precision);
}
else if (*fmt == '*') {
1.5 +26 -0 apache-2.0/apache-nspr/include/alloc.h
Index: alloc.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/alloc.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- alloc.h 1998/09/17 16:12:32 1.4
+++ alloc.h 1998/09/22 18:05:09 1.5
@@ -216,6 +216,32 @@
API_EXPORT(table *) ap_overlay_tables(pool *p, const table *overlay, const table *base);
+/* Conceptually, ap_overlap_tables does this:
+
+ array_header *barr = ap_table_elts(b);
+ table_entry *belt = (table_entry *)barr->elts;
+ int i;
+
+ for (i = 0; i < barr->nelts; ++i) {
+ if (flags & AP_OVERLAP_TABLES_MERGE) {
+ ap_table_mergen(a, belt[i].key, belt[i].val);
+ }
+ else {
+ ap_table_setn(a, belt[i].key, belt[i].val);
+ }
+ }
+
+ Except that it is more efficient (less space and cpu-time) especially
+ when b has many elements.
+
+ Notice the assumptions on the keys and values in b -- they must be
+ in an ancestor of a's pool. In practice b and a are usually from
+ the same pool.
+*/
+#define AP_OVERLAP_TABLES_SET (0)
+#define AP_OVERLAP_TABLES_MERGE (1)
+API_EXPORT(void) ap_overlap_tables(table *a, const table *b, unsigned flags);
+
/* XXX: these know about the definition of struct table in alloc.c. That
* definition is not here because it is supposed to be private, and by not
* placing it here we are able to get compile-time diagnostics from modules
1.4 +3 -3 apache-2.0/apache-nspr/include/ap.h
Index: ap.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/ap.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ap.h 1998/09/05 16:54:09 1.3
+++ ap.h 1998/09/22 18:05:09 1.4
@@ -53,9 +53,9 @@
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
- * This code is based on, and used with the permission of, the
- * SIO stdio-replacement strx_* functions by Panos Tsirigotis
- * <pa...@alumni.cs.colorado.edu> for xinetd.
+ * The ap_vsnprintf/ap_snprintf functions are based on, and used with the
+ * permission of, the SIO stdio-replacement strx_* functions by Panos
+ * Tsirigotis <pa...@alumni.cs.colorado.edu> for xinetd.
*/
#ifndef APACHE_AP_H
1.2 +19 -999 apache-2.0/apache-nspr/include/ap_config.h
Index: ap_config.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/ap_config.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ap_config.h 1998/09/22 16:46:32 1.1
+++ ap_config.h 1998/09/22 18:05:09 1.2
@@ -63,348 +63,22 @@
#endif
/*
- * ap_config.h: system-dependant #defines and includes...
+ * conf.h: system-dependant #defines and includes...
* See PORTING for a listing of what they mean
*/
-#include "ap_mmn.h" /* MODULE_MAGIC_NUMBER_ */
-
-/*
- * Support for platform dependent autogenerated defines
- */
-#ifndef WIN32
-#include "ap_config_auto.h"
-#else
-/* not available under WIN32, so provide important entries manually */
-#undef HAVE_UNISTD_H
-#endif
-
-/* Have to include sys/stat.h before ../os/win32/os.h so we can override
-stat() properly */
-#include <sys/types.h>
-#include <sys/stat.h>
+#include <stdlib.h>
+#include <string.h>
-#ifdef WIN32
-/* include process.h first so we can override spawn[lv]e* properly */
-#include <process.h>
-#include "../os/win32/os.h"
-#else
#include "os.h"
-#endif
-
-#if !defined(QNX) && !defined(MPE) && !defined(WIN32)
-#include <sys/param.h>
-#endif
/* Define one of these according to your system. */
-#if defined(MINT)
-typedef int rlim_t;
-#define JMP_BUF sigjmp_buf
-#define NO_LONG_DOUBLE
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define _BSD_SOURCE
-#define EAGAIN EWOULDBLOCK
-int initgroups (char *, int);
-char *crypt (const char *pw, const char *salt);
-int gethostname (char *name, int namelen);
-
-#elif defined(MPE)
-#include <sys/times.h>
-#define NO_SETSID
-#define NO_KILLPG
-#define NO_WRITEV
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define SHM_R 0400 /* Read permission */
-#define SHM_W 0200 /* Write permission */
-#define NEED_INITGROUPS
-#define NEED_STRCASECMP
-#define NEED_STRDUP
-#define NEED_STRNCASECMP
-extern void GETPRIVMODE();
-extern void GETUSERMODE();
-extern char *inet_ntoa();
-#define NO_SLACK
-#define NO_GETTIMEOFDAY
-#define S_IEXEC S_IXUSR
-#define S_IREAD S_IRUSR
-#define S_IWRITE S_IWUSR
-#define PF_INET AF_INET
-
-#elif defined(SUNOS4)
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#undef NO_SETSID
-char *crypt(const char *pw, const char *salt);
-char *mktemp(char *template);
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#include <sys/time.h>
-#define NEED_STRERROR
-typedef int rlim_t;
-#define memmove(a,b,c) bcopy(b,a,c)
-#define NO_LINGCLOSE
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define NEED_DIFFTIME
-#define HAVE_SYSLOG 1
-
-#elif defined(SOLARIS2)
-#undef HAVE_GMTOFF
-#define NO_KILLPG
-#undef NO_SETSID
-#define bzero(a,b) memset(a,0,b)
-#if !defined(USE_SYSVSEM_SERIALIZED_ACCEPT) && \
- !defined(USE_PTHREAD_SERIALIZED_ACCEPT)
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#endif
-#define NEED_UNION_SEMUN
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-int gethostname(char *name, int namelen);
-#define HAVE_SYSLOG 1
-#define SYS_SIGLIST _sys_siglist
-
-#elif defined(IRIX)
-#undef HAVE_GMTOFF
-/* IRIX has killpg, but it's only in _BSD_COMPAT, so don't use it in case
- * there's some weird conflict with non-BSD signals */
-#define NO_KILLPG
-#undef NO_SETSID
-#if !defined(USE_FLOCK_SERIALIZED_ACCEPT) && \
- !defined(USE_USLOCK_SERIALIZED_ACCEPT) && \
- !defined(USE_SYSVSEM_SERIALIZED_ACCEPT)
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#endif
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define HAVE_MMAP 1
-#define USE_MMAP_FILES
-#define NO_LONG_DOUBLE
-#define NO_LINGCLOSE
-#define HAVE_SYSLOG 1
-
-#elif defined(HIUX)
-#undef HAVE_GMTOFF
-#define NO_KILLPG
-#undef NO_SETSID
-#ifndef _HIUX_SOURCE
-#define _HIUX_SOURCE
-#endif
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define SELECT_NEEDS_CAST
-#define HAVE_SYSLOG 1
-
-#elif defined(HPUX) || defined(HPUX10)
-#undef HAVE_GMTOFF
-#define NO_KILLPG
-#undef NO_SETSID
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#ifndef _HPUX_SOURCE
-#define _HPUX_SOURCE
-#endif
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define HAVE_SYSLOG 1
-#ifndef HPUX10
-#define SELECT_NEEDS_CAST
-typedef int rlim_t;
-#endif
-
-#elif defined(HPUX11)
-#ifndef _HPUX_SOURCE
-#define _HPUX_SOURCE
-#endif
-#define HAVE_SHMGET
-#define USE_SHMGET_SCOREBOARD
-#undef HAVE_GMTOFF
-#define USE_FCNTL_SERIALIZED_ACCEPT
-/* feeling brave? want to try using POSIX mutexes? */
-/* #define HAVE_MMAP */
-/* #define USE_MMAP_SCOREBOARD */
-/* #define USE_MMAP_FILES */
-/* #define USE_PTHREAD_SERIALIZED_ACCEPT */
-#define NO_KILLPG
-#undef NO_SETSID
-#define HAVE_SYSLOG
-
-#elif defined(AIX)
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#undef NO_SETSID
-#ifndef __ps2__
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define HAVE_SYSLOG 1
-#ifndef DEFAULT_GROUP
-#define DEFAULT_GROUP "nobody"
-#endif
-#endif
-#ifndef DEFAULT_USER
-#define DEFAULT_USER "nobody"
-#endif
-#ifdef NEED_RLIM_T
-typedef int rlim_t;
-#endif
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#ifdef USEBCOPY
-#define memmove(a,b,c) bcopy(b,a,c)
-#endif
-#if AIX >= 42
-#define NET_SIZE_T size_t
-#endif
-
-#elif defined(ULTRIX)
-/* we don't want to use sys/resource.h under
- Ultrix although this header exists. */
-#undef HAVE_SYS_RESOURCE_H
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#undef NO_SETSID
-#define ULTRIX_BRAIN_DEATH
-#define NEED_STRDUP
-/* If you have Ultrix 4.3, and are using cc, const is broken */
-#ifndef __ultrix__ /* Hack to check for pre-Ultrix 4.4 cc */
-#define const /* Not implemented */
-#endif
-
-#elif defined(OSF1)
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#undef NO_SETSID
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define NO_LONG_DOUBLE
-#define HAVE_SYSLOG 1
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-
-#elif defined(PARAGON)
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#undef NO_SETSID
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define NO_LONG_DOUBLE
-#define HAVE_SYSLOG 1
-typedef int rlim_t;
-
-#elif defined(SEQUENT)
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#define NO_SETSID
-#define NEED_STRDUP
-#define HAVE_SYSLOG 1
-
-#elif defined(NEXT)
-typedef unsigned short mode_t;
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#define NO_SETSID
-#define NEED_STRDUP
-#define NO_LINGCLOSE
-#undef _POSIX_SOURCE
-#ifndef FD_CLOEXEC
-#define FD_CLOEXEC 1
-#endif
-#ifndef S_ISDIR
-#define S_ISDIR(m) (((m)&(S_IFMT)) == (S_IFDIR))
-#endif
-#ifndef S_ISREG
-#define S_ISREG(m) (((m)&(S_IFMT)) == (S_IFREG))
-#endif
-#ifndef S_IXUSR
-#define S_IXUSR 00100
-#endif
-#ifndef S_IRGRP
-#define S_IRGRP 00040
-#endif
-#ifndef S_IXGRP
-#define S_IXGRP 00010
-#endif
-#ifndef S_IROTH
-#define S_IROTH 00004
-#endif
-#ifndef S_IXOTH
-#define S_IXOTH 00001
-#endif
-#ifndef S_IRUSR
-#define S_IRUSR S_IREAD
-#endif
-#ifndef S_IWUSR
-#define S_IWUSR S_IWRITE
-#endif
-#ifndef S_IWGRP
-#define S_IWGRP 000020
-#endif
-#ifndef S_IWOTH
-#define S_IWOTH 000002
-#ifndef rlim_t
-typedef int rlim_t;
-#endif
-typedef u_long n_long;
-#endif
-
-#define STDIN_FILENO 0
-#define STDOUT_FILENO 1
-#define STDERR_FILENO 2
-
-/* PR#2293 fix */
-#define ap_wait_t union wait
-#define waitpid(a,b,c) wait4((a) == -1 ? 0 : (a),(union wait *)(b),c,NULL)
-#define WEXITSTATUS(status) (int)( WIFEXITED(status) ? ( (status).w_retcode ) : -1)
-#define WTERMSIG(status) (int)( (status).w_termsig )
-
-typedef int pid_t;
-#define USE_LONGJMP
-#define NO_USE_SIGACTION
-#define HAVE_SYSLOG 1
-
-#elif defined(RHAPSODY) /* Mac OS X Server */
-#define HAVE_GMTOFF
-#define HAVE_MMAP
-#define USE_MMAP_FILES
-#define USE_MMAP_SCOREBOARD
-#define MAP_TMPFILE
-#define HAVE_RESOURCE
-#define HAVE_SYS_RESOURCE_H /* apaci should catch this but doesn't */
-#define HAVE_SNPRINTF
-#define JMP_BUF jmp_buf
-#define USE_LONGJMP
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-/*
- * If you are using APACI, (you should be on Rhapsody) these
- * values are set at configure time. These are here as reference;
- * the apache that is built into Rhapsody is configured with
- * these values.
- */
-#if 0
-#define HTTPD_ROOT "/Local/Library/WebServer"
-#define DOCUMENT_LOCATION HTTPD_ROOT "/Documents"
-#define DEFAULT_XFERLOG "Logs/Access"
-#define DEFAULT_ERRORLOG "Logs/Errors"
-#define DEFAULT_PIDLOG "Logs/Process"
-#define DEFAULT_SCOREBOARD "Logs/Status"
-#define DEFAULT_LOCKFILE "Logs/Lock"
-#define SERVER_CONFIG_FILE "Configuration/Server"
-#define RESOURCE_CONFIG_FILE "Configuration/Resources"
-#define TYPES_CONFIG_FILE "Configuration/MIME"
-#define ACCESS_CONFIG_FILE "Configuration/Access"
-#define DEFAULT_USER_DIR "Library/Web Documents"
-#define DEFAULT_USER "nobody"
-#define DEFAULT_GROUP "nogroup"
-#define DEFAULT_PATH "/bin:/usr/bin:/usr/local/bin"
-#endif
-
-#elif defined(LINUX)
-#if LINUX > 1
+/* XXX: all the old defines removed... since most of it is not needed with
+ * an NSPR based system. The few things we do need we should find via
+ * autoconf. So take care to use autoconf-style defines here.
+ */
+#if defined(LINUX)
#include <features.h>
/* libc4 systems probably still work, it probably doesn't define
@@ -417,401 +91,13 @@
* all glibc based systems need crypt.h
*/
#if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1
-#include <crypt.h>
-#endif
-
-/* glibc 2.0.0 through 2.0.4 need size_t * here, where 2.0.5 needs socklen_t *
- * there's no way to discern between these two libraries. But using int should
- * be portable because otherwise these libs would be hopelessly broken with
- * reams of existing networking code. We'll use socklen_t * for 2.1.x and
- * later.
- *
- * int works for all the earlier libs, and is picked up by default later.
- */
-#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 0))
-#define NET_SIZE_T socklen_t
-#endif
-
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define HAVE_MMAP 1
-#define USE_MMAP_FILES
-
-/* glibc 2.1 and later finally define rlim_t */
-#if !defined(__GLIBC__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)
-typedef int rlim_t;
+#define HAVE_CRYPT_H 1
#endif
-/* flock is faster ... but hasn't been tested on 1.x systems */
-#define USE_FLOCK_SERIALIZED_ACCEPT
-
-#define SYS_SIGLIST _sys_siglist
-
#else
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#endif
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#undef NO_SETSID
-#undef NEED_STRDUP
-#include <sys/time.h>
-#define HAVE_SYSLOG 1
-
-#elif defined(SCO)
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#undef NO_SETSID
-#define NEED_INITGROUPS
-#define NO_WRITEV
-#include <sys/time.h>
-#define HAVE_SYSLOG 1
-
-#elif defined(SCO5)
-
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define SecureWare
-#define HAVE_SYSLOG 1
-
-/* Although SCO 5 defines these in <strings.h> (note the "s") they don't have
- consts. Sigh. */
-extern int strcasecmp(const char *, const char *);
-extern int strncasecmp(const char *, const char *, unsigned);
-
-#elif defined(AUX3)
-/* These are to let -Wall compile more cleanly */
-extern int strcasecmp(const char *, const char *);
-extern int strncasecmp(const char *, const char *, unsigned);
-extern int set42sig(), getopt(), getpeername(), bzero();
-extern int listen(), bind(), socket(), getsockname();
-extern int accept(), gethostname(), connect(), lstat();
-extern int select(), killpg(), shutdown();
-extern int initgroups(), setsockopt();
-extern char *shmat();
-extern int shmctl();
-extern int shmget();
-extern char *sbrk();
-extern char *crypt();
-#include <sys/time.h>
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#undef NO_SETSID
-#define NEED_STRDUP
-/* fcntl() locking is expensive with NFS */
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-/*
- * NOTE: If when you run Apache under A/UX and you get a warning
- * that httpd couldn't move break, then the below value for
- * MOVEBREAK (64megs) is too large for your setup. Try reducing
- * to 0x2000000 which is still PLENTY of space. I doubt if
- * even on heavy systems sbrk() would be called at all...
- */
-#define MOVEBREAK 0x4000000
-#define NO_LINGCLOSE
-#define NO_SLACK
-#define HAVE_SYSLOG 1
-#undef HAVE_SYS_RESOURCE_H /* exists but does not provide *rlimit funcs */
-
-#elif defined(SVR4)
-#define NO_KILLPG
-#undef NO_SETSID
-#undef NEED_STRDUP
-#ifndef MPRAS
-#define NEED_STRCASECMP
-#ifndef ENCORE
-#define NEED_STRNCASECMP
-#endif /* ENCORE */
-#endif /* MPRAS */
-#define bzero(a,b) memset(a,0,b)
-/* A lot of SVR4 systems need this */
-#ifndef USE_SYSVSEM_SERIALIZED_ACCEPT
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#endif
-#define HAVE_SYSLOG 1
-#define NET_SIZE_T size_t
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#ifdef _OSD_POSIX /* BS2000-POSIX mainframe needs initgroups */
-#define NEED_INITGROUPS
-#define NEED_HASHBANG_EMUL /* execve() doesn't start shell scripts by default */
-#undef HAVE_SHMGET
-#undef USE_SHMGET_SCOREBOARD
-#undef bzero
-#endif /*_OSD_POSIX*/
-
-#elif defined(UW)
-#define NO_LINGCLOSE
-#define NO_KILLPG
-#undef NO_SETSID
-#undef NEED_STRDUP
-#define NEED_STRCASECMP
-#define NEED_STRNCASECMP
-#define bzero(a,b) memset(a,0,b)
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define HAVE_SHMGET 1
-#undef USE_SHMGET_SCOREBOARD /* force use of mmap() scoreboard */
-#include <sys/time.h>
-#if UW >= 200
-#define _POSIX_SOURCE
-#endif
-#define NET_SIZE_T size_t
-#define HAVE_SYSLOG 1
-#define USE_FCNTL_SERIALIZED_ACCEPT
-
-#elif defined(DGUX)
-#define NO_KILLPG
-#undef NO_SETSID
-#undef NEED_STRDUP
-#define NEED_STRCASECMP
-#define NEED_STRNCASECMP
-#define bzero(a,b) memset(a,0,b)
-/* A lot of SVR4 systems need this */
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#define ap_inet_addr inet_network
-#define HAVE_SYSLOG 1
-
-#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(NETBSD)
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#undef NO_SETSID
-#define HAVE_SYSLOG 1
-#ifndef DEFAULT_USER
-#define DEFAULT_USER "nobody"
-#endif
-#ifndef DEFAULT_GROUP
-#define DEFAULT_GROUP "nogroup"
-#define HAVE_SHMGET 1
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#endif
-
-#elif defined(UTS21)
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#define NO_SETSID
-#define NEED_WAITPID
-#define STDIN_FILENO 0
-#define STDOUT_FILENO 1
-#define STDERR_FILENO 2
-#define HAVE_SYSLOG 1
-#define USE_LONGJMP
-#define JMP_BUF jmp_buf
-#define NO_USE_SIGACTION
-#define NEED_STRERROR
-#define NEED_STRSTR
-#define NEED_HASHBANG_EMUL
-#define NDELAY_PIPE_RETURNS_ZERO
-#define NO_DATA NO_ADDRESS
-#define ap_wait_t union wait
-#define WEXITSTATUS(status) (int)((status).w_retcode)
-#define WTERMSIG(status) (int)((status).w_termsig)
-#define strftime(buf,bufsize,fmt,tm) ascftime(buf,fmt,tm)
-#include <sys/types.h>
-#include <sys/time.h>
+/* nada */
-#elif defined(APOLLO)
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#undef NO_SETSID
-#define HAVE_SYSLOG 1
-
-#elif defined(__FreeBSD__) || defined(__bsdi__)
-#if defined(__FreeBSD__)
-#include <osreldate.h>
-#endif
-#define HAVE_GMTOFF 1
-#undef NO_KILLPG
-#undef NO_SETSID
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#ifndef DEFAULT_USER
-#define DEFAULT_USER "nobody"
-#endif
-#ifndef DEFAULT_GROUP
-#define DEFAULT_GROUP "nogroup"
-#endif
-#if defined(__bsdi__) || \
-(defined(__FreeBSD_version) && (__FreeBSD_version < 220000))
-typedef quad_t rlim_t;
-#endif
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define HAVE_SYSLOG 1
-#define SYS_SIGLIST sys_siglist
-
-#elif defined(QNX)
-#ifndef crypt
-char *crypt(const char *pw, const char *salt);
-#endif
-#ifndef initgroups
-int initgroups(char *, int);
-#endif
-#ifndef strncasecmp
-#define strncasecmp strnicmp
-#endif
-#undef NO_KILLPG
-#undef NO_SETSID
-#define NEED_INITGROUPS
-#define NEED_SELECT_H
-#define NEED_PROCESS_H
-#include <unix.h>
-#define HAVE_MMAP 1
-#define USE_POSIX_SCOREBOARD
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-#define HAVE_SYSLOG 1
-
-#elif defined(LYNXOS)
-#undef HAVE_GMTOFF
-#undef USE_MMAP_SCOREBOARD
-#undef USE_SHMGET_SCOREBOARD
-#undef USE_FCNTL_SERIALIZED_ACCEPT
-#undef USE_FLOCK_SERIALIZED_ACCEPT
-#define USE_LONGJMP
-#undef NO_KILLPG
-#undef NO_SETSID
-#undef NO_USE_SIGACTION
-#undef NO_LINGCLOSE
-extern char *crypt(char *pw, char *salt);
-typedef int rlim_t;
-#define HAVE_SYSLOG 1
-
-#elif defined(UXPDS)
-#undef NEED_STRCASECMP
-#undef NEED_STRNCASECMP
-#undef NEED_STRDUP
-#undef HAVE_GMTOFF
-#define NO_KILLPG
-#undef NO_SETSID
-#define bzero(a,b) memset(a,0,b)
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define HAVE_SYSLOG 1
-
-#elif defined(OS2)
-/* Defines required for EMX OS/2 port. */
-#define NO_KILLPG
-#define NEED_STRCASECMP
-#define NEED_STRNCASECMP
-#define NO_SETSID
-#define NO_TIMES
-/* ap_config_auto.h gets this wrong, force sys/select.h to be included */
-#define HAVE_SYS_SELECT_H
-#define CASE_BLIND_FILESYSTEM
-/* Add some drive name support */
-#define chdir _chdir2
-#include <sys/time.h>
-#define MAXSOCKETS 4096
-#define USE_OS2_SCOREBOARD
-#define NO_RELIABLE_PIPED_LOGS
-#define USE_OS2SEM_SERIALIZED_ACCEPT
-#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-
-#elif defined(__MACHTEN__)
-typedef int rlim_t;
-#undef NO_KILLPG
-#define NO_SETSID
-#define HAVE_GMTOFF 1
-#ifndef __MACHTEN_PPC__
-#ifndef __MACHTEN_68K__
-#define __MACHTEN_68K__
-#endif
-#define USE_FLOCK_SERIALIZED_ACCEPT
-#define NO_USE_SIGACTION
-#define JMP_BUF sigjmp_buf
-#define USE_LONGJMP
-#undef NEED_STRDUP
-#else
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#endif
-
-/* Convex OS v11 */
-#elif defined(CONVEXOS11)
-#undef HAVE_GMTOFF
-#undef NO_KILLPG
-#undef NO_SETSID
-#undef NEED_STRDUP
-#define HAVE_MMAP 1
-#define USE_MMAP_SCOREBOARD
-#define USE_MMAP_FILES
-#define HAVE_SYSLOG 1
-
-#define NO_TIMEZONE
-#include <stdio.h>
-#include <sys/types.h>
-typedef int rlim_t;
-
-#elif defined(ISC)
-#include <net/errno.h>
-#define NO_KILLPG
-#undef NO_SETSID
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define USE_FCNTL_SERIALIZED_ACCEPT
-#define HAVE_SYSLOG 1
-
-#elif defined(NEWSOS)
-#define HAVE_SHMGET 1
-#define USE_SHMGET_SCOREBOARD
-#define USE_LONGJMP
-#define NO_SETSID
-#define NO_USE_SIGACTION
-#define NEED_WAITPID
-#define NO_OTHER_CHILD
-#define HAVE_SYSLOG 1
-#include <sys/time.h>
-#include <stdlib.h>
-#include <sys/types.h>
-typedef int pid_t;
-typedef int rlim_t;
-typedef int mode_t;
-
-#elif defined(RISCIX)
-#include <sys/time.h>
-typedef int rlim_t;
-#define NO_USE_SIGACTION
-#define USE_LONGJMP
-#define NEED_STRCASECMP
-#define NEED_STRNCASECMP
-#define NEED_STRDUP
-
-#elif defined(BEOS)
-#include <stddef.h>
-
-#define NO_WRITEV
-#define NO_KILLPG
-#define NEED_INITGROUPS
-
-#elif defined(WIN32)
-
-/* All windows stuff is now in os/win32/os.h */
-
-#else
-/* Unknown system - Edit these to match */
-#ifdef BSD
-#define HAVE_GMTOFF 1
-#else
-#undef HAVE_GMTOFF
-#endif
-/* NO_KILLPG is set on systems that don't have killpg */
-#undef NO_KILLPG
-/* NO_SETSID is set on systems that don't have setsid */
-#undef NO_SETSID
-/* NEED_STRDUP is set on stupid systems that don't have strdup. */
-#undef NEED_STRDUP
#endif
/* stuff marked API_EXPORT is part of the API, and intended for use
@@ -847,17 +133,6 @@
#define CORE_EXPORT_NONSTD API_EXPORT_NONSTD
#endif
-/* On OpenStep and Rhapsody, symbols that conflict with loaded dylibs
- * (eg. System framework) need to be declared as private symbols with
- * __private_extern__.
- * For other systems, make that a no-op.
- */
-#if defined(RHAPSODY) || defined(NEXT)
-#define ap_private_extern __private_extern__
-#else
-#define ap_private_extern
-#endif
-
/* So that we can use inline on some critical functions, and use
* GNUC attributes (such as to get -Wall warnings for printf-like
* functions). Only do this in gcc 2.7 or later ... it may work
@@ -878,187 +153,23 @@
#define USE_GNU_INLINE
#define ENUM_BITFIELD(e,n,w) e n : w
#endif
-
-/*
- * The particular directory style your system supports. If you have dirent.h
- * in /usr/include (POSIX) or /usr/include/sys (SYSV), #include
- * that file and define DIR_TYPE to be dirent. Otherwise, if you have
- * /usr/include/sys/dir.h, define DIR_TYPE to be direct and include that
- * file. If you have neither, I'm confused.
- */
-
-#include <sys/types.h>
-#include <stdarg.h>
-#if !defined(NEXT) && !defined(WIN32)
-#include <dirent.h>
-#define DIR_TYPE dirent
-#elif !defined(WIN32)
-#include <sys/dir.h>
-#define DIR_TYPE direct
-#else
-#define DIR_TYPE dirent
+/* Do we have sys/resource.h; assume that BSD does. */
+#ifndef HAVE_SYS_RESOURCE_H
+#ifdef BSD
+#define HAVE_SYS_RESOURCE_H 1
#endif
+#endif /* HAVE_SYS_RESOURCE_H */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "ap_ctype.h"
-#if !defined(MPE) && !defined(WIN32)
-#include <sys/file.h>
-#endif
-#ifndef WIN32
-#include <sys/socket.h>
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif /* HAVE_SYS_SELECT_H */
-#include <netinet/in.h>
-#include <netdb.h>
-#include <sys/ioctl.h>
-#if !defined(MPE) && !defined(BEOS)
-#include <arpa/inet.h> /* for inet_ntoa */
-#endif
-#include <sys/wait.h>
-#include <pwd.h>
-#include <grp.h>
-#include <fcntl.h>
-#include <limits.h>
-#define closesocket(s) close(s)
-#ifndef O_BINARY
-#define O_BINARY (0)
-#endif
-
-#else /* WIN32 */
-#include <winsock.h>
-#include <malloc.h>
-#include <io.h>
-#include <fcntl.h>
-#endif /* ndef WIN32 */
-
-#include <time.h> /* for ctime */
-#include <signal.h>
-#include <errno.h>
-#if !defined(QNX) && !defined(CONVEXOS11) && !defined(NEXT)
-#include <memory.h>
-#endif
-
-#ifdef NEED_PROCESS_H
-#include <process.h>
-#endif
-
-#ifdef WIN32
-#include "../include/hsregex.h"
-#elif defined(USE_HSREGEX)
+#if defined(USE_HSREGEX)
#include "hsregex.h"
#else
+#include <sys/types.h>
#include <regex.h>
#endif
-
-#ifdef HAVE_SYS_RESOURCE_H
-#include <sys/resource.h>
-#ifdef SUNOS4
-int getrlimit(int, struct rlimit *);
-int setrlimit(int, struct rlimit *);
-#endif
-#endif
-#ifdef USE_MMAP_SCOREBOARD
-#if !defined(OS2) && !defined(WIN32)
-/* This file is not needed for OS/2 */
-#include <sys/mman.h>
-#endif
-#endif
-#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
-#define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#if defined(USE_MMAP_FILES) && (defined(NO_MMAP) || !defined(HAVE_MMAP))
-#undef USE_MMAP_FILES
-#endif
-
-#if defined(USE_MMAP_SCOREBOARD) && (defined(NO_MMAP) || !defined(HAVE_MMAP))
-#undef USE_MMAP_SCOREBOARD
-#endif
-
-#if defined(USE_SHMGET_SCOREBOARD) && (defined(NO_SHMGET) || !defined(HAVE_SHMGET))
-#undef USE_SHMGET_SCOREBOARD
-#endif
-
-#ifndef LOGNAME_MAX
-#define LOGNAME_MAX 25
-#endif
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef ultrix
-#define ULTRIX_BRAIN_DEATH
-#endif
-
-#ifndef S_ISLNK
-#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
-#endif
-
-#ifndef INADDR_NONE
-#define INADDR_NONE ((unsigned long) -1)
-#endif
-
-/*
- * Replace signal function with sigaction equivalent
- */
-#ifndef NO_USE_SIGACTION
-typedef void Sigfunc(int);
-
-#if defined(SIG_IGN) && !defined(SIG_ERR)
-#define SIG_ERR ((Sigfunc *)-1)
-#endif
-
-/*
- * For some strange reason, QNX defines signal to signal. Eliminate it.
- */
-#ifdef signal
-#undef signal
-#endif
-#define signal(s,f) ap_signal(s,f)
-Sigfunc *signal(int signo, Sigfunc * func);
-#endif
-#include <setjmp.h>
-
-#if defined(USE_LONGJMP)
-#define ap_longjmp(x, y) longjmp((x), (y))
-#define ap_setjmp(x) setjmp(x)
-#ifndef JMP_BUF
-#define JMP_BUF jmp_buf
-#endif
-#else
-#define ap_longjmp(x, y) siglongjmp((x), (y))
-#define ap_setjmp(x) sigsetjmp((x), 1)
-#ifndef JMP_BUF
-#define JMP_BUF sigjmp_buf
-#endif
-#endif
-
-#ifdef SELECT_NEEDS_CAST
-#define ap_select(_a, _b, _c, _d, _e) \
- select((_a), (int *)(_b), (int *)(_c), (int *)(_d), (_e))
-#else
-#define ap_select select
-#endif
-
-#ifdef ULTRIX_BRAIN_DEATH
-#define ap_fdopen(d,m) fdopen((d), (char *)(m))
-#else
-#define ap_fdopen(d,m) fdopen((d), (m))
-#endif
-
-#ifndef ap_inet_addr
-#define ap_inet_addr inet_addr
-#endif
-
-#ifdef NO_OTHER_CHILD
+/* XXX: some day we'll get this working with NSPR */
#define NO_RELIABLE_PIPED_LOGS
-#endif
/* When the underlying OS doesn't support exec() of scripts which start
* with a HASHBANG (#!) followed by interpreter name and args, define this.
@@ -1104,97 +215,6 @@
#define XtOffsetOf(s_type,field) XtOffset(s_type*,field)
#endif
-/*
- * NET_SIZE_T exists because of shortsightedness on the POSIX committee. BSD
- * systems used "int *" as the parameter to accept(), getsockname(),
- * getpeername() et al. Consequently many unixes took an int * for that
- * parameter. The POSIX committee decided that "int" was just too generic and
- * had to be replaced with size_t almost everywhere. There's no problem with
- * that when you're passing by value. But when you're passing by reference
- * this creates a gross source incompatibility with existing programs. On
- * 32-bit architectures it creates only a warning. On 64-bit architectures it
- * creates broken code -- because "int *" is a pointer to a 64-bit quantity and
- * "size_t *" is frequently a pointer to a 32-bit quantity.
- *
- * Some Unixes adopted "size_t *" for the sake of POSIX compliance. Others
- * ignored it because it was such a broken interface. Chaos ensued. POSIX
- * finally woke up and decided that it was wrong and created a new type
- * socklen_t. The only useful value for socklen_t is int, and that's how
- * everyone who has a clue implements it. It is almost always the case that
- * NET_SIZE_T should be defined to be an int, unless the system being compiled
- * for was created in the window of POSIX madness.
- */
-#ifndef NET_SIZE_T
-#define NET_SIZE_T int
-#endif
-
-/* Linux defines __WCOREDUMP, but doesn't define WCOREDUMP unless __USE_BSD
- * is in use... we'd prefer to just use WCOREDUMP everywhere.
- */
-#if defined(__WCOREDUMP) && !defined(WCOREDUMP)
-#define WCOREDUMP __WCOREDUMP
-#endif
-
-#ifdef SUNOS_LIB_PROTOTYPES
-/* Prototypes needed to get a clean compile with gcc -Wall.
- * Believe it or not, these do have to be declared, at least on SunOS,
- * because they aren't mentioned in the relevant system headers.
- * Sun Quality Software. Gotta love it. This section is not
- * currently (13Nov97) used.
- */
-
-int getopt(int, char **, char *);
-
-int strcasecmp(const char *, const char *);
-int strncasecmp(const char *, const char *, int);
-int toupper(int);
-int tolower(int);
-
-int printf(char *,...);
-int fprintf(FILE *, char *,...);
-int fputs(char *, FILE *);
-int fread(char *, int, int, FILE *);
-int fwrite(char *, int, int, FILE *);
-int fgetc(FILE *);
-char *fgets(char *s, int, FILE*);
-int fflush(FILE *);
-int fclose(FILE *);
-int ungetc(int, FILE *);
-int _filbuf(FILE *); /* !!! */
-int _flsbuf(unsigned char, FILE *); /* !!! */
-int sscanf(char *, char *,...);
-void setbuf(FILE *, char *);
-void perror(char *);
-
-time_t time(time_t *);
-int strftime(char *, int, const char *, struct tm *);
-
-int initgroups(char *, int);
-int wait3(int *, int, void *); /* Close enough for us... */
-int lstat(const char *, struct stat *);
-int stat(const char *, struct stat *);
-int flock(int, int);
-#ifndef NO_KILLPG
-int killpg(int, int);
-#endif
-int socket(int, int, int);
-int setsockopt(int, int, int, const char *, int);
-int listen(int, int);
-int bind(int, struct sockaddr *, int);
-int connect(int, struct sockaddr *, int);
-int accept(int, struct sockaddr *, int *);
-int shutdown(int, int);
-
-int getsockname(int s, struct sockaddr *name, int *namelen);
-int getpeername(int s, struct sockaddr *name, int *namelen);
-int gethostname(char *name, int namelen);
-void syslog(int, char *,...);
-char *mktemp(char *);
-
-long vfprintf(FILE *, const char *, va_list);
-
-#endif /* SUNOS_LIB_PROTOTYPES */
-
/* The assumption is that when the functions are missing,
* then there's no matching prototype available either.
* Declare what is needed exactly as the replacement routines implement it.
@@ -1229,4 +249,4 @@
}
#endif
-#endif /* !AP_CONFIG_H */
+#endif /* !APACHE_CONF_H */
1.3 +1 -1 apache-2.0/apache-nspr/include/buff.h
Index: buff.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/buff.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- buff.h 1998/06/30 08:57:05 1.2
+++ buff.h 1998/09/22 18:05:09 1.3
@@ -127,7 +127,7 @@
API_EXPORT(int) ap_bsetflag(BUFF *fb, int flag, int value);
API_EXPORT(PRStatus) ap_bclose(BUFF *fb);
-#define bgetflag(fb, flag) ((fb)->flags & (flag))
+#define ap_bgetflag(fb, flag) ((fb)->flags & (flag))
/* Error handling */
API_EXPORT(void) ap_bonerror(BUFF *fb, void (*error) (BUFF *, int, void *),
1.3 +9 -1 apache-2.0/apache-nspr/include/hsregex.h
Index: hsregex.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/hsregex.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- hsregex.h 1998/06/30 08:57:05 1.2
+++ hsregex.h 1998/09/22 18:05:10 1.3
@@ -1,3 +1,5 @@
+/* DON'T EVEN THINK ABOUT EDITING THIS, go see regex/Makefile,
+ * search for mkh */
#ifndef _REGEX_H_
#define _REGEX_H_ /* never again */
/* ========= begin header generated by ./mkh ========= */
@@ -14,7 +16,13 @@
#endif
#endif
-typedef long regoff_t;
+#if defined(RHAPSODY) || defined(NEXT)
+#define ap_private_extern __private_extern__
+#else
+#define ap_private_extern
+#endif
+
+typedef off_t regoff_t;
typedef struct {
int re_magic;
size_t re_nsub; /* number of parenthesized subexpressions */
1.3 +1 -0 apache-2.0/apache-nspr/include/http_conf_globals.h
Index: http_conf_globals.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/http_conf_globals.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_conf_globals.h 1998/06/30 08:57:05 1.2
+++ http_conf_globals.h 1998/09/22 18:05:10 1.3
@@ -86,6 +86,7 @@
extern MODULE_VAR_EXPORT int ap_suexec_enabled;
extern int ap_listenbacklog;
extern int ap_dump_settings;
+extern API_VAR_EXPORT int ap_extended_status;
extern char *ap_pid_fname;
extern char *ap_scoreboard_fname;
1.3 +3 -0 apache-2.0/apache-nspr/include/http_log.h
Index: http_log.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/http_log.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_log.h 1998/06/30 08:57:06 1.2
+++ http_log.h 1998/09/22 18:05:10 1.3
@@ -108,6 +108,9 @@
API_EXPORT(void) ap_log_error(const char *file, int line, int level,
const server_rec *s, const char *fmt, ...)
__attribute__((format(printf,5,6)));
+API_EXPORT(void) ap_log_rerror(const char *file, int line, int level,
+ const request_rec *s, const char *fmt, ...)
+ __attribute__((format(printf,5,6)));
API_EXPORT(void) ap_error_log2stderr (server_rec *);
void ap_log_pid (pool *p, char *fname);
1.3 +3 -3 apache-2.0/apache-nspr/include/http_protocol.h
Index: http_protocol.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/http_protocol.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_protocol.h 1998/06/30 08:57:06 1.2
+++ http_protocol.h 1998/09/22 18:05:10 1.3
@@ -91,12 +91,12 @@
/* Send the response to special method requests */
-int ap_send_http_trace(request_rec *r);
+API_EXPORT(int) ap_send_http_trace(request_rec *r);
int ap_send_http_options(request_rec *r);
/* Finish up stuff after a request */
-void ap_finalize_request_protocol(request_rec *r);
+API_EXPORT(void) ap_finalize_request_protocol(request_rec *r);
/* Send error back to client... last arg indicates error status in case
* we get an error in the process of trying to deal with an ErrorDocument
@@ -197,7 +197,7 @@
API_EXPORT(void) ap_note_auth_failure(request_rec *r);
API_EXPORT(void) ap_note_basic_auth_failure(request_rec *r);
API_EXPORT(void) ap_note_digest_auth_failure(request_rec *r);
-API_EXPORT(int) ap_get_basic_auth_pw(request_rec *r, char **pw);
+API_EXPORT(int) ap_get_basic_auth_pw(request_rec *r, const char **pw);
/*
* Setting up the protocol fields for subsidiary requests...
1.3 +1 -1 apache-2.0/apache-nspr/include/http_request.h
Index: http_request.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/http_request.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_request.h 1998/06/30 08:57:06 1.2
+++ http_request.h 1998/09/22 18:05:11 1.3
@@ -106,7 +106,7 @@
#ifdef CORE_PRIVATE
/* Function called by main.c to handle first-level request */
void ap_process_request(request_rec *);
-void ap_die(int type, request_rec *r);
+API_EXPORT(void) ap_die(int type, request_rec *r);
#endif
#ifdef __cplusplus
1.3 +53 -20 apache-2.0/apache-nspr/include/httpd.h
Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/httpd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- httpd.h 1998/06/30 08:57:06 1.2
+++ httpd.h 1998/09/22 18:05:11 1.3
@@ -73,7 +73,7 @@
/* Headers in which EVERYONE has an interest... */
-#include "conf.h"
+#include "ap_config.h"
#include "alloc.h"
#include "buff.h"
#include "ap.h"
@@ -93,7 +93,7 @@
* file with a relative pathname will have this added.
*/
#ifndef HTTPD_ROOT
-#ifdef __EMX__
+#ifdef OS2
/* Set default for OS/2 file system */
#define HTTPD_ROOT "/os2httpd"
#elif defined(WIN32)
@@ -108,7 +108,7 @@
* directive.
*/
#ifndef DOCUMENT_LOCATION
-#ifdef __EMX__
+#ifdef OS2
/* Set default for OS/2 file system */
#define DOCUMENT_LOCATION HTTPD_ROOT "/docs"
#else
@@ -136,6 +136,8 @@
/* -- Internal representation for a HTTP protocol number, e.g., HTTP/1.1 -- */
#define HTTP_VERSION(major,minor) (1000*(major)+(minor))
+#define HTTP_VERSION_MAJOR(number) ((number)/1000)
+#define HTTP_VERSION_MINOR(number) ((number)%1000)
/* -------------- Port number for server running standalone --------------- */
@@ -158,7 +160,7 @@
/* The name of the log files */
#ifndef DEFAULT_XFERLOG
-#ifdef __EMX__
+#ifdef OS2
/* Set default for OS/2 file system */
#define DEFAULT_XFERLOG "logs/access.log"
#else
@@ -167,7 +169,7 @@
#endif /* DEFAULT_XFERLOG */
#ifndef DEFAULT_ERRORLOG
-#ifdef __EMX__
+#ifdef OS2
/* Set default for OS/2 file system */
#define DEFAULT_ERRORLOG "logs/error.log"
#else
@@ -203,7 +205,7 @@
/* Define this to be what your per-directory security files are called */
#ifndef DEFAULT_ACCESS_FNAME
-#ifdef __EMX__
+#ifdef OS2
/* Set default for OS/2 file system */
#define DEFAULT_ACCESS_FNAME "htaccess"
#else
@@ -247,7 +249,7 @@
/* The path to the shell interpreter, for parsed docs */
#ifndef SHELL_PATH
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
/* Set default for OS/2 and Windows file system */
#define SHELL_PATH "CMD.EXE"
#else
@@ -383,6 +385,32 @@
#define DEFAULT_LISTENBACKLOG 511
#endif
+/* Limits on the size of various request items. These limits primarily
+ * exist to prevent simple denial-of-service attacks on a server based
+ * on misuse of the protocol. The recommended values will depend on the
+ * nature of the server resources -- CGI scripts and database backends
+ * might require large values, but most servers could get by with much
+ * smaller limits than we use below. The request message body size can
+ * be limited by the per-dir config directive LimitRequestBody.
+ *
+ * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE
+ * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190.
+ * These two limits can be lowered (but not raised) by the server config
+ * directives LimitRequestLine and LimitRequestFieldsize, respectively.
+ *
+ * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by
+ * the server config directive LimitRequestFields.
+ */
+#ifndef DEFAULT_LIMIT_REQUEST_LINE
+#define DEFAULT_LIMIT_REQUEST_LINE 8190
+#endif /* default limit on bytes in Request-Line (Method+URI+HTTP-version) */
+#ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE
+#define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190
+#endif /* default limit on bytes in any one header field */
+#ifndef DEFAULT_LIMIT_REQUEST_FIELDS
+#define DEFAULT_LIMIT_REQUEST_FIELDS 100
+#endif /* default limit on number of request header fields */
+
/*
* The below defines the base string of the Server: header. Additional
* tokens can be added via the ap_add_version_component() API call.
@@ -396,7 +424,7 @@
* Example: "Apache/1.1.0 MrWidget/0.1-alpha"
*/
-#define SERVER_BASEVERSION "Apache/1.3.1-dev" /* SEE COMMENTS ABOVE */
+#define SERVER_BASEVERSION "Apache/1.3.3-dev" /* SEE COMMENTS ABOVE */
#define SERVER_VERSION SERVER_BASEVERSION
enum server_token_type {
SrvTk_MIN, /* eg: Apache/1.3.0 */
@@ -413,7 +441,7 @@
* For a final release, 'betaseq' should be set to '99'.
* For example, Apache 1.4.2 should be '1040299'
*/
-#define APACHE_RELEASE 1030101
+#define APACHE_RELEASE 1030301
#define SERVER_PROTOCOL "HTTP/1.1"
#ifndef SERVER_SUPPORT
@@ -489,12 +517,12 @@
#define BAD_GATEWAY HTTP_BAD_GATEWAY
#define VARIANT_ALSO_VARIES HTTP_VARIANT_ALSO_VARIES
-#define is_HTTP_INFO(x) (((x) >= 100)&&((x) < 200))
-#define is_HTTP_SUCCESS(x) (((x) >= 200)&&((x) < 300))
-#define is_HTTP_REDIRECT(x) (((x) >= 300)&&((x) < 400))
-#define is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600))
-#define is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500))
-#define is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600))
+#define ap_is_HTTP_INFO(x) (((x) >= 100)&&((x) < 200))
+#define ap_is_HTTP_SUCCESS(x) (((x) >= 200)&&((x) < 300))
+#define ap_is_HTTP_REDIRECT(x) (((x) >= 300)&&((x) < 400))
+#define ap_is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600))
+#define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500))
+#define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600))
#define status_drops_connection(x) (((x) == HTTP_BAD_REQUEST) || \
((x) == HTTP_REQUEST_TIME_OUT) || \
@@ -848,9 +876,13 @@
array_header *names; /* Normal names for ServerAlias servers */
array_header *wild_names; /* Wildcarded names for ServerAlias servers */
+
+ uid_t server_uid; /* effective user id when calling exec wrapper */
+ gid_t server_gid; /* effective group id when calling exec wrapper */
- uid_t server_uid; /* effective user id when calling exec wrapper */
- gid_t server_gid; /* effective group id when calling exec wrapper */
+ int limit_req_line; /* limit on size of the HTTP request line */
+ int limit_req_fieldsize; /* limit on size of any request header field */
+ int limit_req_fields; /* limit on number of request header fields */
};
/* These are more like real hosts than virtual hosts */
@@ -915,7 +947,8 @@
API_EXPORT(int) ap_strcmp_match(const char *str, const char *exp);
API_EXPORT(int) ap_strcasecmp_match(const char *str, const char *exp);
API_EXPORT(char *) ap_uudecode(pool *, const char *);
-#ifdef __EMX__
+API_EXPORT(char *) ap_uuencode(pool *p, char *string);
+#ifdef OS2
void os2pathname(char *path);
#endif
@@ -981,12 +1014,12 @@
#endif
#ifdef _OSD_POSIX
-extern const char *os_set_authfile(pool *p, const char *filename);
+extern const char *os_set_account(pool *p, const char *account);
extern int os_init_job_environment(server_rec *s, const char *user_name);
#endif /* _OSD_POSIX */
char *ap_get_local_host(pool *);
-PRUint32 ap_get_virthost_addr(const char *hostname, PRUint16 *port);
+PRUint32 ap_get_virthost_addr(char *hostname, PRUint16 *port);
extern API_VAR_EXPORT PRTime ap_restart_time;
1.4 +0 -2 apache-2.0/apache-nspr/include/scoreboard.h
Index: scoreboard.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/scoreboard.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- scoreboard.h 1998/09/22 16:12:06 1.3
+++ scoreboard.h 1998/09/22 18:05:11 1.4
@@ -88,7 +88,6 @@
/* stuff which the children generally write, and the parent mainly reads */
typedef struct {
unsigned char status;
-#if defined(STATUS)
unsigned long access_count;
unsigned long bytes_served;
unsigned long my_access_count;
@@ -104,7 +103,6 @@
char client[32]; /* Keep 'em small... */
char request[64]; /* We just want an idea... */
char vhost[32]; /* What virtual host is being accessed? */
-#endif
} short_score;
typedef struct {
1.3 +2 -1 apache-2.0/apache-nspr/include/util_md5.h
Index: util_md5.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/include/util_md5.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- util_md5.h 1998/06/30 08:57:06 1.2
+++ util_md5.h 1998/09/22 18:05:11 1.3
@@ -66,7 +66,8 @@
#include "ap_md5.h"
-API_EXPORT(char *) ap_md5(pool *a, unsigned char *string);
+API_EXPORT(char *) ap_md5(pool *a, const unsigned char *string);
+API_EXPORT(char *) ap_md5_binary(pool *a, const unsigned char *buf, int len);
API_EXPORT(char *) ap_md5contextTo64(pool *p, AP_MD5_CTX * context);
API_EXPORT(char *) ap_md5digest(pool *p, PRFileDesc *infile);
1.3 +1 -81 apache-2.0/apache-nspr/main/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/Makefile.tmpl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile.tmpl 1998/06/30 08:57:06 1.2
+++ Makefile.tmpl 1998/09/22 18:05:15 1.3
@@ -11,7 +11,7 @@
http_config.o http_core.o http_log.o http_main.o \
http_protocol.o http_request.o http_vhost.o \
util.o util_date.o util_script.o util_uri.o util_md5.o \
- md5c.o rfc1413.o fnmatch.o
+ md5c.o rfc1413.o
.c.o:
$(CC) -c $(INCLUDES) $(CFLAGS) $<
@@ -58,83 +58,3 @@
$(OBJS): Makefile
# DO NOT REMOVE
-alloc.o: alloc.c $(INCDIR)/httpd.h $(INCDIR)/conf.h $(OSDIR)/os.h \
- $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_log.h
-buff.o: buff.c $(INCDIR)/httpd.h $(INCDIR)/conf.h $(OSDIR)/os.h \
- $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_main.h $(INCDIR)/http_log.h
-fnmatch.o: fnmatch.c $(INCDIR)/conf.h $(OSDIR)/os.h \
- $(INCDIR)/fnmatch.h
-gen_test_char.o: gen_test_char.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h
-gen_uri_delims.o: gen_uri_delims.c
-http_config.o: http_config.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_conf_globals.h $(INCDIR)/http_vhost.h \
- $(INCDIR)/explain.h
-http_core.o: http_core.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_protocol.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_conf_globals.h $(INCDIR)/http_vhost.h \
- $(INCDIR)/http_main.h $(INCDIR)/http_log.h $(INCDIR)/rfc1413.h \
- $(INCDIR)/util_md5.h $(INCDIR)/ap_md5.h $(INCDIR)/scoreboard.h \
- $(INCDIR)/fnmatch.h
-http_log.o: http_log.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_main.h
-http_main.o: http_main.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_main.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_request.h $(INCDIR)/http_conf_globals.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_vhost.h \
- $(INCDIR)/util_script.h $(INCDIR)/scoreboard.h $(INCDIR)/explain.h
-http_protocol.o: http_protocol.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_protocol.h $(INCDIR)/http_main.h \
- $(INCDIR)/http_request.h $(INCDIR)/http_vhost.h \
- $(INCDIR)/http_log.h $(INCDIR)/util_date.h \
- $(INCDIR)/http_conf_globals.h
-http_request.o: http_request.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h \
- $(INCDIR)/http_request.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_protocol.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_main.h $(INCDIR)/scoreboard.h $(INCDIR)/fnmatch.h
-http_vhost.o: http_vhost.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h \
- $(INCDIR)/http_conf_globals.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_vhost.h $(INCDIR)/http_protocol.h
-md5c.o: md5c.c $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/ap_md5.h
-rfc1413.o: rfc1413.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_log.h $(INCDIR)/rfc1413.h \
- $(INCDIR)/http_main.h
-util.o: util.c $(INCDIR)/httpd.h $(INCDIR)/conf.h $(OSDIR)/os.h \
- $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_conf_globals.h \
- $(INCDIR)/http_log.h test_char.h
-util_date.o: util_date.c $(INCDIR)/conf.h $(OSDIR)/os.h \
- $(INCDIR)/util_date.h
-util_md5.o: util_md5.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/util_md5.h $(INCDIR)/ap_md5.h
-util_script.o: util_script.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_config.h \
- $(INCDIR)/http_conf_globals.h $(INCDIR)/http_main.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_request.h \
- $(INCDIR)/util_script.h $(INCDIR)/util_date.h
-util_uri.o: util_uri.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h $(INCDIR)/ap.h \
- $(INCDIR)/util_uri.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_conf_globals.h uri_delims.h
1.3 +157 -0 apache-2.0/apache-nspr/main/alloc.c
Index: alloc.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/alloc.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- alloc.c 1998/06/30 08:57:06 1.2
+++ alloc.c 1998/09/22 18:05:15 1.3
@@ -1378,6 +1378,163 @@
va_end(vp);
}
+/* Curse libc and the fact that it doesn't guarantee a stable sort. We
+ * have to enforce stability ourselves by using the order field. If it
+ * provided a stable sort then we wouldn't even need temporary storage to
+ * do the work below. -djg
+ *
+ * ("stable sort" means that equal keys retain their original relative
+ * ordering in the output.)
+ */
+typedef struct {
+ char *key;
+ char *val;
+ int order;
+} overlap_key;
+
+static int sort_overlap(const void *va, const void *vb)
+{
+ const overlap_key *a = va;
+ const overlap_key *b = vb;
+ int r;
+
+ r = strcasecmp(a->key, b->key);
+ if (r) {
+ return r;
+ }
+ return a->order - b->order;
+}
+
+/* prefer to use the stack for temp storage for overlaps smaller than this */
+#ifndef AP_OVERLAP_TABLES_ON_STACK
+#define AP_OVERLAP_TABLES_ON_STACK (512)
+#endif
+
+API_EXPORT(void) ap_overlap_tables(table *a, const table *b, unsigned flags)
+{
+ overlap_key cat_keys_buf[AP_OVERLAP_TABLES_ON_STACK];
+ overlap_key *cat_keys;
+ int nkeys;
+ table_entry *e;
+ table_entry *last_e;
+ overlap_key *left;
+ overlap_key *right;
+ overlap_key *last;
+
+ nkeys = a->a.nelts + b->a.nelts;
+ if (nkeys < AP_OVERLAP_TABLES_ON_STACK) {
+ cat_keys = cat_keys_buf;
+ }
+ else {
+ /* XXX: could use scratch free space in a or b's pool instead...
+ * which could save an allocation in b's pool.
+ */
+ cat_keys = ap_palloc(b->a.pool, sizeof(overlap_key) * nkeys);
+ }
+
+ nkeys = 0;
+
+ /* Create a list of the entries from a concatenated with the entries
+ * from b.
+ */
+ e = (table_entry *)a->a.elts;
+ last_e = e + a->a.nelts;
+ while (e < last_e) {
+ cat_keys[nkeys].key = e->key;
+ cat_keys[nkeys].val = e->val;
+ cat_keys[nkeys].order = nkeys;
+ ++nkeys;
+ ++e;
+ }
+
+ e = (table_entry *)b->a.elts;
+ last_e = e + b->a.nelts;
+ while (e < last_e) {
+ cat_keys[nkeys].key = e->key;
+ cat_keys[nkeys].val = e->val;
+ cat_keys[nkeys].order = nkeys;
+ ++nkeys;
+ ++e;
+ }
+
+ qsort(cat_keys, nkeys, sizeof(overlap_key), sort_overlap);
+
+ /* Now iterate over the sorted list and rebuild a.
+ * Start by making sure it has enough space.
+ */
+ a->a.nelts = 0;
+ if (a->a.nalloc < nkeys) {
+ a->a.elts = ap_palloc(a->a.pool, a->a.elt_size * nkeys * 2);
+ a->a.nalloc = nkeys * 2;
+ }
+
+ /*
+ * In both the merge and set cases we retain the invariant:
+ *
+ * left->key, (left+1)->key, (left+2)->key, ..., (right-1)->key
+ * are all equal keys. (i.e. strcasecmp returns 0)
+ *
+ * We essentially need to find the maximal
+ * right for each key, then we can do a quick merge or set as
+ * appropriate.
+ */
+
+ if (flags & AP_OVERLAP_TABLES_MERGE) {
+ left = cat_keys;
+ last = left + nkeys;
+ while (left < last) {
+ right = left + 1;
+ if (right == last
+ || strcasecmp(left->key, right->key)) {
+ ap_table_addn(a, left->key, left->val);
+ left = right;
+ }
+ else {
+ char *strp;
+ char *value;
+ size_t len;
+
+ /* Have to merge some headers. Let's re-use the order field,
+ * since it's handy... we'll store the length of val there.
+ */
+ left->order = strlen(left->val);
+ len = left->order;
+ do {
+ right->order = strlen(right->val);
+ len += 2 + right->order;
+ ++right;
+ } while (right < last
+ && !strcasecmp(left->key, right->key));
+ /* right points one past the last header to merge */
+ value = ap_palloc(a->a.pool, len + 1);
+ strp = value;
+ for (;;) {
+ memcpy(strp, left->val, left->order);
+ strp += left->order;
+ ++left;
+ if (left == right) break;
+ *strp++ = ',';
+ *strp++ = ' ';
+ }
+ *strp = 0;
+ ap_table_addn(a, (left-1)->key, value);
+ }
+ }
+ }
+ else {
+ left = cat_keys;
+ last = left + nkeys;
+ while (left < last) {
+ right = left + 1;
+ while (right < last && !strcasecmp(left->key, right->key)) {
+ ++right;
+ }
+ ap_table_addn(a, (right-1)->key, (right-1)->val);
+ left = right;
+ }
+ }
+}
+
/*****************************************************************
*
* Managing generic cleanups.
1.3 +20 -14 apache-2.0/apache-nspr/main/buff.c
Index: buff.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/buff.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- buff.c 1998/06/30 08:57:06 1.2
+++ buff.c 1998/09/22 18:05:17 1.3
@@ -221,7 +221,7 @@
/* already chunking */
return;
}
- if (!(fb->flags & B_WR) || (fb->flags & (B_WRERR | B_EOUT))) {
+ if ((fb->flags & (B_WRERR | B_EOUT | B_WR)) != B_WR) {
/* unbuffered writes */
return;
}
@@ -399,7 +399,7 @@
}
i = read_with_errors(fb, buf, nbyte);
#ifdef CHARSET_EBCDIC
- if (i > 0 && bgetflag(fb, B_ASCII2EBCDIC))
+ if (i > 0 && ap_bgetflag(fb, B_ASCII2EBCDIC))
ascii2ebcdic(buf, buf, i);
#endif /*CHARSET_EBCDIC*/
return i;
@@ -438,7 +438,7 @@
/* read directly into caller's buffer */
i = read_with_errors(fb, buf, nbyte);
#ifdef CHARSET_EBCDIC
- if (i > 0 && bgetflag(fb, B_ASCII2EBCDIC))
+ if (i > 0 && ap_bgetflag(fb, B_ASCII2EBCDIC))
ascii2ebcdic(buf, buf, i);
#endif /*CHARSET_EBCDIC*/
if (i == -1) {
@@ -643,7 +643,8 @@
}
/*
- * Empty the buffer after putting a single character in it
+ * output a single character. Used by ap_bputs when the buffer
+ * is full... and so it'll cause the buffer to be flushed first.
*/
API_EXPORT(PRInt32) ap_bflsbuf(PRInt32 c, BUFF *fb)
{
@@ -794,8 +795,15 @@
#ifdef CHARSET_EBCDIC
static char *cbuf = NULL;
static int csize = 0;
+#endif /*CHARSET_EBCDIC*/
+
+ if (fb->flags & (B_WRERR | B_EOUT))
+ return -1;
+ if (nbyte == 0)
+ return 0;
- if (bgetflag(fb, B_EBCDIC2ASCII)) {
+#ifdef CHARSET_EBCDIC
+ if (ap_bgetflag(fb, B_EBCDIC2ASCII)) {
if (nbyte > csize) {
if (cbuf != NULL)
free(cbuf);
@@ -808,11 +816,6 @@
}
#endif /*CHARSET_EBCDIC*/
- if (fb->flags & (B_WRERR | B_EOUT))
- return -1;
- if (nbyte == 0)
- return 0;
-
if (!(fb->flags & B_WR)) {
/* unbuffered write -- have to use bcwrite since we aren't taking care
* of chunking any other way */
@@ -961,10 +964,7 @@
{
PRInt32 ret;
- if (!(fb->flags & B_WR) || (fb->flags & B_EOUT))
- return 0;
-
- if (fb->flags & B_WRERR)
+ if ((fb->flags & (B_WRERR | B_EOUT | B_WR)) != B_WR)
return -1;
if (fb->flags & B_CHUNK)
@@ -1095,6 +1095,9 @@
PRInt32 res;
struct bprintf_data b;
+ /* XXX: only works with buffered writes */
+ if ((fb->flags & (B_WRERR | B_EOUT | B_WR)) != B_WR)
+ return -1;
b.vbuff.curpos = (char *)&fb->outbase[fb->outcnt];
b.vbuff.endpos = (char *)&fb->outbase[fb->bufsiz];
b.fb = fb;
@@ -1119,6 +1122,9 @@
struct bprintf_data b;
PRInt32 res;
+ /* XXX: only works with buffered writes */
+ if ((fb->flags & (B_WRERR | B_EOUT | B_WR)) != B_WR)
+ return -1;
b.vbuff.curpos = (char *)&fb->outbase[fb->outcnt];
b.vbuff.endpos = (char *)&fb->outbase[fb->bufsiz];
b.fb = fb;
1.3 +27 -8 apache-2.0/apache-nspr/main/http_config.c
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/http_config.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_config.c 1998/06/30 08:57:07 1.2
+++ http_config.c 1998/09/22 18:05:17 1.3
@@ -483,6 +483,7 @@
const char *handler;
char *p;
size_t handler_len;
+ int result = NOT_IMPLEMENTED;
if (r->handler) {
handler = r->handler;
@@ -505,19 +506,24 @@
for (handp = handlers; handp->hr.content_type; ++handp) {
if (handler_len == handp->len
&& !strncmp(handler, handp->hr.content_type, handler_len)) {
- int result = (*handp->hr.handler) (r);
+ result = (*handp->hr.handler) (r);
if (result != DECLINED)
return result;
}
}
+ if (result == NOT_IMPLEMENTED && r->handler) {
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, r,
+ "handler \"%s\" not found for: %s", r->handler, r->filename);
+ }
+
/* Pass two --- wildcard matches */
for (handp = wildhandlers; handp->hr.content_type; ++handp) {
if (handler_len >= handp->len
&& !strncmp(handler, handp->hr.content_type, handp->len)) {
- int result = (*handp->hr.handler) (r);
+ result = (*handp->hr.handler) (r);
if (result != DECLINED)
return result;
@@ -541,7 +547,7 @@
* though, we don't.
*/
- if (m->version != MODULE_MAGIC_NUMBER) {
+ if (m->version != MODULE_MAGIC_NUMBER_MAJOR) {
PR_fprintf(PR_STDERR, "httpd: module \"%s\" is not compatible with this "
"version of Apache.\n", m->name);
PR_fprintf(PR_STDERR, "Please contact the author for the correct version.\n");
@@ -601,6 +607,7 @@
if (modp == m) {
/* We are the top module, special case */
top_module = modp->next;
+ m->next = NULL;
}
else {
/* Not the top module, find use. When found modp will
@@ -1239,8 +1246,8 @@
ap_cfg_closefile(f);
if (errmsg) {
- ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, r->server, "%s: %s",
- filename, errmsg);
+ ap_log_rerror(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, r, "%s: %s",
+ filename, errmsg);
return HTTP_INTERNAL_SERVER_ERROR;
}
@@ -1254,9 +1261,13 @@
dc = NULL;
break;
default:
- ap_log_error(APLOG_MARK, APLOG_CRIT, r->server,
- "%s pcfg_openfile: unable to check htaccess file, ensure it is readable",
- filename);
+ ap_log_rerror(APLOG_MARK, APLOG_CRIT, r,
+ "%s pcfg_openfile: unable to check htaccess file, "
+ "ensure it is readable",
+ filename);
+ ap_table_setn(r->notes, "error-notes",
+ "Server unable to read htaccess file, denying "
+ "access to be safe");
return HTTP_FORBIDDEN;
}
}
@@ -1317,6 +1328,10 @@
s->server_uid = ap_user_id;
s->server_gid = ap_group_id;
+ s->limit_req_line = main_server->limit_req_line;
+ s->limit_req_fieldsize = main_server->limit_req_fieldsize;
+ s->limit_req_fields = main_server->limit_req_fields;
+
*ps = s;
return ap_parse_vhost_addrs(p, hostname, s);
@@ -1389,6 +1404,7 @@
PR_InitializeNetAddr(PR_IpAddrAny, 0, &ap_bind_address);
ap_listeners = NULL;
ap_listenbacklog = DEFAULT_LISTENBACKLOG;
+ ap_extended_status = 0;
/* Global virtual host hash bucket pointers. Init to null. */
ap_init_vhost_config(p);
@@ -1408,6 +1424,9 @@
s->loglevel = DEFAULT_LOGLEVEL;
s->srm_confname = RESOURCE_CONFIG_FILE;
s->access_confname = ACCESS_CONFIG_FILE;
+ s->limit_req_line = DEFAULT_LIMIT_REQUEST_LINE;
+ s->limit_req_fieldsize = DEFAULT_LIMIT_REQUEST_FIELDSIZE;
+ s->limit_req_fields = DEFAULT_LIMIT_REQUEST_FIELDS;
s->timeout_interval = PR_SecondsToInterval(DEFAULT_TIMEOUT);
s->keep_alive_timeout_interval = PR_SecondsToInterval(DEFAULT_KEEPALIVE_TIMEOUT);
s->keep_alive_max = DEFAULT_KEEPALIVE;
1.3 +1169 -612 apache-2.0/apache-nspr/main/http_core.c
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/http_core.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_core.c 1998/06/30 08:57:07 1.2
+++ http_core.c 1998/09/22 18:05:17 1.3
@@ -86,16 +86,22 @@
* the http_conf_globals.
*/
-static void *create_core_dir_config (pool *a, char *dir)
+static void *create_core_dir_config(pool *a, char *dir)
{
- core_dir_config *conf =
- (core_dir_config *)ap_pcalloc(a, sizeof(core_dir_config));
-
- if (!dir || dir[strlen(dir) - 1] == '/') conf->d = dir;
- else if (strncmp(dir,"proxy:",6)==0) conf->d = ap_pstrdup (a, dir);
- else conf->d = ap_pstrcat (a, dir, "/", NULL);
- conf->d_is_fnmatch = conf->d ? (ap_is_fnmatch (conf->d) != 0) : 0;
- conf->d_components = conf->d ? ap_count_dirs (conf->d) : 0;
+ core_dir_config *conf;
+
+ conf = (core_dir_config *)ap_pcalloc(a, sizeof(core_dir_config));
+ if (!dir || dir[strlen(dir) - 1] == '/') {
+ conf->d = dir;
+ }
+ else if (strncmp(dir, "proxy:", 6) == 0) {
+ conf->d = ap_pstrdup(a, dir);
+ }
+ else {
+ conf->d = ap_pstrcat(a, dir, "/", NULL);
+ }
+ conf->d_is_fnmatch = conf->d ? (ap_is_fnmatch(conf->d) != 0) : 0;
+ conf->d_components = conf->d ? ap_count_dirs(conf->d) : 0;
conf->opts = dir ? OPT_UNSET : OPT_UNSET|OPT_ALL;
conf->opts_add = conf->opts_remove = OPT_NONE;
@@ -106,7 +112,7 @@
conf->use_canonical_name = 1 | 2; /* 2 = unset, default on */
conf->hostname_lookups = HOSTNAME_LOOKUP_UNSET;
- conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate default */
+ conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate default */
conf->satisfy = SATISFY_NOSPEC;
#ifdef RLIMIT_CPU
@@ -119,25 +125,27 @@
conf->limit_nproc = NULL;
#endif
- conf->sec = ap_make_array (a, 2, sizeof(void *));
+ conf->limit_req_body = 0;
+ conf->sec = ap_make_array(a, 2, sizeof(void *));
return (void *)conf;
}
-static void *merge_core_dir_configs (pool *a, void *basev, void *newv)
+static void *merge_core_dir_configs(pool *a, void *basev, void *newv)
{
core_dir_config *base = (core_dir_config *)basev;
core_dir_config *new = (core_dir_config *)newv;
- core_dir_config *conf =
- (core_dir_config *)ap_palloc (a, sizeof(core_dir_config));
+ core_dir_config *conf;
int i;
- memcpy ((char *)conf, (const char *)base, sizeof(core_dir_config));
- if( base->response_code_strings ) {
- conf->response_code_strings = ap_palloc(a,
- sizeof(*conf->response_code_strings) * RESPONSE_CODES );
- memcpy( conf->response_code_strings, base->response_code_strings,
- sizeof(*conf->response_code_strings) * RESPONSE_CODES );
+ conf = (core_dir_config *)ap_palloc(a, sizeof(core_dir_config));
+ memcpy((char *)conf, (const char *)base, sizeof(core_dir_config));
+ if (base->response_code_strings) {
+ conf->response_code_strings =
+ ap_palloc(a, sizeof(*conf->response_code_strings)
+ * RESPONSE_CODES);
+ memcpy(conf->response_code_strings, base->response_code_strings,
+ sizeof(*conf->response_code_strings) * RESPONSE_CODES);
}
conf->d = new->d;
@@ -150,10 +158,12 @@
* preserve the invariant (opts_add & opts_remove) == 0
*/
conf->opts_add = (conf->opts_add & ~new->opts_remove) | new->opts_add;
- conf->opts_remove = (conf->opts_remove & ~new->opts_add) | new->opts_remove;
+ conf->opts_remove = (conf->opts_remove & ~new->opts_add)
+ | new->opts_remove;
conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add;
- if ((base->opts & OPT_INCNOEXEC) && (new->opts & OPT_INCLUDES))
- conf->opts = (conf->opts & ~OPT_INCNOEXEC) | OPT_INCLUDES;
+ if ((base->opts & OPT_INCNOEXEC) && (new->opts & OPT_INCLUDES)) {
+ conf->opts = (conf->opts & ~OPT_INCNOEXEC) | OPT_INCLUDES;
+ }
}
else {
/* otherwise we just copy, because an explicit opts setting
@@ -164,75 +174,112 @@
conf->opts_remove = new->opts_remove;
}
- if (!(new->override & OR_UNSET)) conf->override = new->override;
- if (new->ap_default_type) conf->ap_default_type = new->ap_default_type;
+ if (!(new->override & OR_UNSET)) {
+ conf->override = new->override;
+ }
+ if (new->ap_default_type) {
+ conf->ap_default_type = new->ap_default_type;
+ }
- if (new->ap_auth_type) conf->ap_auth_type = new->ap_auth_type;
- if (new->ap_auth_name) conf->ap_auth_name = new->ap_auth_name;
- if (new->ap_requires) conf->ap_requires = new->ap_requires;
+ if (new->ap_auth_type) {
+ conf->ap_auth_type = new->ap_auth_type;
+ }
+ if (new->ap_auth_name) {
+ conf->ap_auth_name = new->ap_auth_name;
+ }
+ if (new->ap_requires) {
+ conf->ap_requires = new->ap_requires;
+ }
- if( new->response_code_strings ) {
- if( conf->response_code_strings == NULL ) {
+ if (new->response_code_strings) {
+ if (conf->response_code_strings == NULL) {
conf->response_code_strings = ap_palloc(a,
- sizeof(*conf->response_code_strings) * RESPONSE_CODES );
- memcpy( conf->response_code_strings, new->response_code_strings,
- sizeof(*conf->response_code_strings) * RESPONSE_CODES );
- } else {
- for (i = 0; i < RESPONSE_CODES; ++i)
- if (new->response_code_strings[i] != NULL)
- conf->response_code_strings[i] = new->response_code_strings[i];
+ sizeof(*conf->response_code_strings) * RESPONSE_CODES);
+ memcpy(conf->response_code_strings, new->response_code_strings,
+ sizeof(*conf->response_code_strings) * RESPONSE_CODES);
}
+ else {
+ for (i = 0; i < RESPONSE_CODES; ++i) {
+ if (new->response_code_strings[i] != NULL) {
+ conf->response_code_strings[i]
+ = new->response_code_strings[i];
+ }
+ }
+ }
}
- if (new->hostname_lookups != HOSTNAME_LOOKUP_UNSET)
+ if (new->hostname_lookups != HOSTNAME_LOOKUP_UNSET) {
conf->hostname_lookups = new->hostname_lookups;
- if ((new->do_rfc1413 & 2) == 0) conf->do_rfc1413 = new->do_rfc1413;
- if ((new->content_md5 & 2) == 0) conf->content_md5 = new->content_md5;
+ }
+ if ((new->do_rfc1413 & 2) == 0) {
+ conf->do_rfc1413 = new->do_rfc1413;
+ }
+ if ((new->content_md5 & 2) == 0) {
+ conf->content_md5 = new->content_md5;
+ }
if ((new->use_canonical_name & 2) == 0) {
conf->use_canonical_name = new->use_canonical_name;
}
#ifdef RLIMIT_CPU
- if (new->limit_cpu) conf->limit_cpu = new->limit_cpu;
+ if (new->limit_cpu) {
+ conf->limit_cpu = new->limit_cpu;
+ }
#endif
#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
- if (new->limit_mem) conf->limit_mem = new->limit_mem;
+ if (new->limit_mem) {
+ conf->limit_mem = new->limit_mem;
+ }
#endif
#ifdef RLIMIT_NPROC
- if (new->limit_nproc) conf->limit_nproc = new->limit_nproc;
+ if (new->limit_nproc) {
+ conf->limit_nproc = new->limit_nproc;
+ }
#endif
- conf->sec = ap_append_arrays (a, base->sec, new->sec);
+ if (new->limit_req_body) {
+ conf->limit_req_body = new->limit_req_body;
+ }
+ conf->sec = ap_append_arrays(a, base->sec, new->sec);
- if (new->satisfy != SATISFY_NOSPEC) conf->satisfy = new->satisfy;
+ if (new->satisfy != SATISFY_NOSPEC) {
+ conf->satisfy = new->satisfy;
+ }
return (void*)conf;
}
-static void *create_core_server_config (pool *a, server_rec *s)
+static void *create_core_server_config(pool *a, server_rec *s)
{
- core_server_config *conf =
- (core_server_config *)ap_pcalloc(a, sizeof(core_server_config));
+ core_server_config *conf;
int is_virtual = s->is_virtual;
+ conf = (core_server_config *)ap_pcalloc(a, sizeof(core_server_config));
+#ifdef GPROF
+ conf->gprof_dir = NULL;
+#endif
conf->access_name = is_virtual ? NULL : DEFAULT_ACCESS_FNAME;
conf->ap_document_root = is_virtual ? NULL : DOCUMENT_LOCATION;
- conf->sec = ap_make_array (a, 40, sizeof(void *));
- conf->sec_url = ap_make_array (a, 40, sizeof(void *));
+ conf->sec = ap_make_array(a, 40, sizeof(void *));
+ conf->sec_url = ap_make_array(a, 40, sizeof(void *));
return (void *)conf;
}
-static void *merge_core_server_configs (pool *p, void *basev, void *virtv)
+static void *merge_core_server_configs(pool *p, void *basev, void *virtv)
{
core_server_config *base = (core_server_config *)basev;
core_server_config *virt = (core_server_config *)virtv;
- core_server_config *conf =
- (core_server_config *)ap_pcalloc(p, sizeof(core_server_config));
+ core_server_config *conf;
+ conf = (core_server_config *)ap_pcalloc(p, sizeof(core_server_config));
*conf = *virt;
- if (!conf->access_name) conf->access_name = base->access_name;
- if (!conf->ap_document_root) conf->ap_document_root = base->ap_document_root;
- conf->sec = ap_append_arrays (p, base->sec, virt->sec);
- conf->sec_url = ap_append_arrays (p, base->sec_url, virt->sec_url);
+ if (!conf->access_name) {
+ conf->access_name = base->access_name;
+ }
+ if (!conf->ap_document_root) {
+ conf->ap_document_root = base->ap_document_root;
+ }
+ conf->sec = ap_append_arrays(p, base->sec, virt->sec);
+ conf->sec_url = ap_append_arrays(p, base->sec_url, virt->sec_url);
return conf;
}
@@ -241,27 +288,27 @@
* these are part of the core server config.
*/
-CORE_EXPORT(void) ap_add_per_dir_conf (server_rec *s, void *dir_config)
+CORE_EXPORT(void) ap_add_per_dir_conf(server_rec *s, void *dir_config)
{
- core_server_config *sconf = ap_get_module_config (s->module_config,
- &core_module);
- void **new_space = (void **) ap_push_array (sconf->sec);
+ core_server_config *sconf = ap_get_module_config(s->module_config,
+ &core_module);
+ void **new_space = (void **)ap_push_array(sconf->sec);
*new_space = dir_config;
}
-CORE_EXPORT(void) ap_add_per_url_conf (server_rec *s, void *url_config)
+CORE_EXPORT(void) ap_add_per_url_conf(server_rec *s, void *url_config)
{
- core_server_config *sconf = ap_get_module_config (s->module_config,
- &core_module);
- void **new_space = (void **) ap_push_array (sconf->sec_url);
+ core_server_config *sconf = ap_get_module_config(s->module_config,
+ &core_module);
+ void **new_space = (void **)ap_push_array(sconf->sec_url);
*new_space = url_config;
}
-static void add_file_conf (core_dir_config *conf, void *url_config)
+static void add_file_conf(core_dir_config *conf, void *url_config)
{
- void **new_space = (void **) ap_push_array (conf->sec);
+ void **new_space = (void **)ap_push_array(conf->sec);
*new_space = url_config;
}
@@ -274,7 +321,7 @@
* See directory_walk().
*/
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
#define IS_SPECIAL(entry_core) \
((entry_core)->r != NULL \
|| ((entry_core)->d[0] != '/' && (entry_core)->d[1] != ':'))
@@ -293,26 +340,29 @@
int orig_index;
};
-static int reorder_sorter (const void *va, const void *vb)
+static int reorder_sorter(const void *va, const void *vb)
{
const struct reorder_sort_rec *a = va;
const struct reorder_sort_rec *b = vb;
core_dir_config *core_a;
core_dir_config *core_b;
- core_a = (core_dir_config *)ap_get_module_config (a->elt, &core_module);
- core_b = (core_dir_config *)ap_get_module_config (b->elt, &core_module);
+ core_a = (core_dir_config *)ap_get_module_config(a->elt, &core_module);
+ core_b = (core_dir_config *)ap_get_module_config(b->elt, &core_module);
if (IS_SPECIAL(core_a)) {
if (!IS_SPECIAL(core_b)) {
return 1;
}
- } else if (IS_SPECIAL(core_b)) {
+ }
+ else if (IS_SPECIAL(core_b)) {
return -1;
- } else {
+ }
+ else {
/* we know they're both not special */
if (core_a->d_components < core_b->d_components) {
return -1;
- } else if (core_a->d_components > core_b->d_components) {
+ }
+ else if (core_a->d_components > core_b->d_components) {
return 1;
}
}
@@ -322,7 +372,7 @@
return a->orig_index - b->orig_index;
}
-void ap_core_reorder_directories (pool *p, server_rec *s)
+void ap_core_reorder_directories(pool *p, server_rec *s)
{
core_server_config *sconf;
array_header *sec;
@@ -335,24 +385,24 @@
* and we need some scratch space to do it. The old array and the
* scratch space are never freed.
*/
- sconf = ap_get_module_config (s->module_config, &core_module);
+ sconf = ap_get_module_config(s->module_config, &core_module);
sec = sconf->sec;
nelts = sec->nelts;
elts = (void **)sec->elts;
/* build our sorting space */
- sortbin = ap_palloc (p, sec->nelts * sizeof (*sortbin));
+ sortbin = ap_palloc(p, sec->nelts * sizeof(*sortbin));
for (i = 0; i < nelts; ++i) {
sortbin[i].orig_index = i;
sortbin[i].elt = elts[i];
}
- qsort (sortbin, nelts, sizeof (*sortbin), reorder_sorter);
+ qsort(sortbin, nelts, sizeof(*sortbin), reorder_sorter);
/* and now build a new array */
- sec = ap_make_array (p, nelts, sizeof (void *));
+ sec = ap_make_array(p, nelts, sizeof(void *));
for (i = 0; i < nelts; ++i) {
- *(void **)ap_push_array (sec) = sortbin[i].elt;
+ *(void **)ap_push_array(sec) = sortbin[i].elt;
}
sconf->sec = sec;
@@ -366,7 +416,7 @@
* here...
*/
-API_EXPORT(int) ap_allow_options (request_rec *r)
+API_EXPORT(int) ap_allow_options(request_rec *r)
{
core_dir_config *conf =
(core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
@@ -374,60 +424,69 @@
return conf->opts;
}
-API_EXPORT(int) ap_allow_overrides (request_rec *r)
+API_EXPORT(int) ap_allow_overrides(request_rec *r)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
return conf->override;
}
-API_EXPORT(char *) ap_auth_type (request_rec *r)
+API_EXPORT(const char *) ap_auth_type(request_rec *r)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
return conf->ap_auth_type;
}
-API_EXPORT(char *) ap_auth_name (request_rec *r)
+API_EXPORT(const char *) ap_auth_name(request_rec *r)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
return conf->ap_auth_name;
}
-API_EXPORT(char *) ap_default_type (request_rec *r)
+API_EXPORT(const char *) ap_default_type(request_rec *r)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
- return conf->ap_default_type ? conf->ap_default_type : DEFAULT_CONTENT_TYPE;
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
+ return conf->ap_default_type
+ ? conf->ap_default_type
+ : DEFAULT_CONTENT_TYPE;
}
-API_EXPORT(char *) ap_document_root (request_rec *r) /* Don't use this!!! */
+API_EXPORT(const char *) ap_document_root(request_rec *r) /* Don't use this! */
{
- core_server_config *conf =
- (core_server_config *)ap_get_module_config(r->server->module_config,
- &core_module);
+ core_server_config *conf;
+ conf = (core_server_config *)ap_get_module_config(r->server->module_config,
+ &core_module);
return conf->ap_document_root;
}
-API_EXPORT(array_header *) ap_requires (request_rec *r)
+API_EXPORT(const array_header *) ap_requires(request_rec *r)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
return conf->ap_requires;
}
-API_EXPORT(int) ap_satisfies (request_rec *r)
+API_EXPORT(int) ap_satisfies(request_rec *r)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
+
return conf->satisfy;
}
@@ -436,12 +495,14 @@
* modules).
*/
-char *ap_response_code_string (request_rec *r, int error_index)
+char *ap_response_code_string(request_rec *r, int error_index)
{
- core_dir_config *conf =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
+
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
- if( conf->response_code_strings == NULL ) {
+ if (conf->response_code_strings == NULL) {
return NULL;
}
return conf->response_code_strings[error_index];
@@ -483,14 +544,13 @@
conn->double_reverse = -1;
}
-API_EXPORT(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type)
+API_EXPORT(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config,
+ int type)
{
char hentbuf[PR_NETDB_BUF_SIZE];
PRHostEnt hent;
int hostname_lookups;
-#ifdef STATUS
int old_stat = SERVER_DEAD; /* we shouldn't ever be in this state */
-#endif
/* If we haven't checked the host name, and we want to */
if (dir_config) {
@@ -500,7 +560,8 @@
if (hostname_lookups == HOSTNAME_LOOKUP_UNSET) {
hostname_lookups = HOSTNAME_LOOKUP_OFF;
}
- } else {
+ }
+ else {
/* the default */
hostname_lookups = HOSTNAME_LOOKUP_OFF;
}
@@ -509,7 +570,6 @@
&& conn->remote_host == NULL
&& (type == REMOTE_DOUBLE_REV
|| hostname_lookups != HOSTNAME_LOOKUP_OFF)) {
-#ifdef STATUS
old_stat = ap_update_child_status(conn->child_num, SERVER_BUSY_DNS,
(request_rec*)NULL);
#endif /* STATUS */
@@ -526,7 +586,9 @@
}
}
/* if failed, set it to the NULL string to indicate error */
- if (conn->remote_host == NULL) conn->remote_host = "";
+ if (conn->remote_host == NULL) {
+ conn->remote_host = "";
+ }
}
if (type == REMOTE_DOUBLE_REV) {
do_double_reverse (conn, hentbuf, &hent);
@@ -534,41 +596,47 @@
return NULL;
}
}
-#ifdef STATUS
if (old_stat != SERVER_DEAD) {
- (void)ap_update_child_status(conn->child_num,old_stat,(request_rec*)NULL);
+ (void)ap_update_child_status(conn->child_num, old_stat,
+ (request_rec*)NULL);
}
-#endif /* STATUS */
/*
* Return the desired information; either the remote DNS name, if found,
* or either NULL (if the hostname was requested) or the IP address
* (if any identifier was requested).
*/
- if (conn->remote_host != NULL && conn->remote_host[0] != '\0')
+ if (conn->remote_host != NULL && conn->remote_host[0] != '\0') {
return conn->remote_host;
- else
- {
- if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) return NULL;
- else return conn->remote_ip;
}
+ else {
+ if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) {
+ return NULL;
+ }
+ else {
+ return conn->remote_ip;
+ }
+ }
}
API_EXPORT(const char *) ap_get_remote_logname(request_rec *r)
{
core_dir_config *dir_conf;
- if (r->connection->remote_logname != NULL)
+ if (r->connection->remote_logname != NULL) {
return r->connection->remote_logname;
+ }
/* If we haven't checked the identity, and we want to */
- dir_conf = (core_dir_config *)
- ap_get_module_config(r->per_dir_config, &core_module);
+ dir_conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
- if (dir_conf->do_rfc1413 & 1)
+ if (dir_conf->do_rfc1413 & 1) {
return ap_rfc1413(r->connection, r->server);
- else
+ }
+ else {
return NULL;
+ }
}
/* There are two options regarding what the "name" of a server is. The
@@ -579,9 +647,10 @@
*/
API_EXPORT(const char *) ap_get_server_name(const request_rec *r)
{
- core_dir_config *d =
- (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
-
+ core_dir_config *d;
+
+ d = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
if (d->use_canonical_name & 1) {
return r->server->server_hostname;
}
@@ -604,7 +673,8 @@
: port;
}
-API_EXPORT(char *) ap_construct_url(pool *p, const char *uri, const request_rec *r)
+API_EXPORT(char *) ap_construct_url(pool *p, const char *uri,
+ const request_rec *r)
{
unsigned port;
const char *host;
@@ -619,10 +689,12 @@
if (r->hostname)
/* XXX: ipv6 */
port = PR_ntohs(r->connection->local_addr.inet.port);
- else if (r->server->port)
+ else if (r->server->port) {
port = r->server->port;
- else
+ }
+ else {
port = ap_default_port(r);
+ }
host = r->hostname ? r->hostname : r->server->server_hostname;
}
@@ -632,6 +704,14 @@
return ap_psprintf(p, "%s://%s:%u%s", ap_http_method(r), host, port, uri);
}
+API_EXPORT(unsigned long) ap_get_limit_req_body(const request_rec *r)
+{
+ core_dir_config *d =
+ (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
+
+ return d->limit_req_body;
+}
+
/*****************************************************************
*
* Commands... this module handles almost all of the NCSA httpd.conf
@@ -649,61 +729,95 @@
static const char end_ifdefine_section[] = "</IfDefine>";
-API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
+API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd,
+ unsigned forbidden)
{
const char *gt = (cmd->cmd->name[0] == '<'
- && cmd->cmd->name[strlen(cmd->cmd->name)-1] != '>') ? ">" : "";
+ && cmd->cmd->name[strlen(cmd->cmd->name)-1] != '>')
+ ? ">" : "";
- if ((forbidden & NOT_IN_VIRTUALHOST) && cmd->server->is_virtual)
+ if ((forbidden & NOT_IN_VIRTUALHOST) && cmd->server->is_virtual) {
return ap_pstrcat(cmd->pool, cmd->cmd->name, gt,
- " cannot occur within <VirtualHost> section", NULL);
+ " cannot occur within <VirtualHost> section", NULL);
+ }
- if ((forbidden & NOT_IN_LIMIT) && cmd->limited != -1)
+ if ((forbidden & NOT_IN_LIMIT) && cmd->limited != -1) {
return ap_pstrcat(cmd->pool, cmd->cmd->name, gt,
- " cannot occur within <Limit> section", NULL);
+ " cannot occur within <Limit> section", NULL);
+ }
- if ((forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE && cmd->path != NULL)
+ if ((forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE
+ && cmd->path != NULL) {
return ap_pstrcat(cmd->pool, cmd->cmd->name, gt,
- " cannot occur within <Directory/Location/Files> section", NULL);
+ " cannot occur within <Directory/Location/Files> "
+ "section", NULL);
+ }
- if (((forbidden & NOT_IN_DIRECTORY) && (cmd->end_token == end_directory_section
- || cmd->end_token == end_directorymatch_section)) ||
- ((forbidden & NOT_IN_LOCATION) && (cmd->end_token == end_location_section
- || cmd->end_token == end_locationmatch_section)) ||
- ((forbidden & NOT_IN_FILES) && (cmd->end_token == end_files_section
- || cmd->end_token == end_filesmatch_section)))
-
+ if (((forbidden & NOT_IN_DIRECTORY)
+ && (cmd->end_token == end_directory_section
+ || cmd->end_token == end_directorymatch_section))
+ || ((forbidden & NOT_IN_LOCATION)
+ && (cmd->end_token == end_location_section
+ || cmd->end_token == end_locationmatch_section))
+ || ((forbidden & NOT_IN_FILES)
+ && (cmd->end_token == end_files_section
+ || cmd->end_token == end_filesmatch_section))) {
return ap_pstrcat(cmd->pool, cmd->cmd->name, gt,
- " cannot occur within <", cmd->end_token+2,
- " section", NULL);
+ " cannot occur within <", cmd->end_token+2,
+ " section", NULL);
+ }
return NULL;
}
-static const char *set_access_name (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_access_name(cmd_parms *cmd, void *dummy, char *arg)
{
void *sconf = cmd->server->module_config;
- core_server_config *conf = ap_get_module_config (sconf, &core_module);
+ core_server_config *conf = ap_get_module_config(sconf, &core_module);
- const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
conf->access_name = ap_pstrdup(cmd->pool, arg);
return NULL;
}
-static const char *set_document_root (cmd_parms *cmd, void *dummy, char *arg)
+#ifdef GPROF
+static const char *set_gprof_dir(cmd_parms *cmd, void *dummy, char *arg)
{
void *sconf = cmd->server->module_config;
- core_server_config *conf = ap_get_module_config (sconf, &core_module);
+ core_server_config *conf = ap_get_module_config(sconf, &core_module);
+
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
+
+ conf->gprof_dir = ap_pstrdup(cmd->pool, arg);
+ return NULL;
+}
+#endif /*GPROF*/
+
+static const char *set_document_root(cmd_parms *cmd, void *dummy, char *arg)
+{
+ void *sconf = cmd->server->module_config;
+ core_server_config *conf = ap_get_module_config(sconf, &core_module);
- const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
arg = ap_os_canonical_filename(cmd->pool, arg);
- if (!ap_is_directory (arg)) {
+ if (!ap_is_directory(arg)) {
if (cmd->server->is_virtual) {
- PR_fprintf (PR_STDERR, "Warning: DocumentRoot [%s] does not exist\n", arg);
+ PR_fprintf (PR_STDERR, "Warning: DocumentRoot [%s] does not exist\n",
+ arg);
}
else {
return "DocumentRoot must be a directory";
@@ -714,36 +828,62 @@
return NULL;
}
-static const char *set_error_document (cmd_parms *cmd, core_dir_config *conf,
- char *line)
+API_EXPORT(void) ap_custom_response(request_rec *r, int status, char *string)
{
+ core_dir_config *conf =
+ ap_get_module_config(r->per_dir_config, &core_module);
+ int idx;
+
+ if(conf->response_code_strings == NULL) {
+ conf->response_code_strings =
+ ap_pcalloc(r->pool,
+ sizeof(*conf->response_code_strings) *
+ RESPONSE_CODES);
+ }
+
+ idx = ap_index_of_response(status);
+
+ conf->response_code_strings[idx] =
+ ((ap_is_url(string) || (*string == '/')) && (*string != '"')) ?
+ ap_pstrdup(r->pool, string) : ap_pstrcat(r->pool, "\"", string, NULL);
+}
+
+static const char *set_error_document(cmd_parms *cmd, core_dir_config *conf,
+ char *line)
+{
int error_number, index_number, idx500;
char *w;
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
/* 1st parameter should be a 3 digit number, which we recognize;
* convert it into an array index
*/
- w = ap_getword_conf_nc (cmd->pool, &line);
+ w = ap_getword_conf_nc(cmd->pool, &line);
error_number = atoi(w);
idx500 = ap_index_of_response(HTTP_INTERNAL_SERVER_ERROR);
- if (error_number == HTTP_INTERNAL_SERVER_ERROR)
+ if (error_number == HTTP_INTERNAL_SERVER_ERROR) {
index_number = idx500;
- else if ((index_number = ap_index_of_response(error_number)) == idx500)
- return ap_pstrcat(cmd->pool, "Unsupported HTTP response code ", w, NULL);
+ }
+ else if ((index_number = ap_index_of_response(error_number)) == idx500) {
+ return ap_pstrcat(cmd->pool, "Unsupported HTTP response code ",
+ w, NULL);
+ }
/* Store it... */
- if( conf->response_code_strings == NULL ) {
- conf->response_code_strings = ap_pcalloc(cmd->pool,
- sizeof(*conf->response_code_strings) * RESPONSE_CODES );
+ if (conf->response_code_strings == NULL) {
+ conf->response_code_strings =
+ ap_pcalloc(cmd->pool,
+ sizeof(*conf->response_code_strings) * RESPONSE_CODES);
}
- conf->response_code_strings[index_number] = ap_pstrdup (cmd->pool, line);
+ conf->response_code_strings[index_number] = ap_pstrdup(cmd->pool, line);
return NULL;
}
@@ -757,7 +897,8 @@
* discards as harmless. Cheesy, but it works.
*/
-static const char *set_override (cmd_parms *cmd, core_dir_config *d, const char *l)
+static const char *set_override(cmd_parms *cmd, core_dir_config *d,
+ const char *l)
{
char *w;
@@ -767,69 +908,90 @@
}
d->override = OR_NONE;
- while(l[0]) {
- w = ap_getword_conf (cmd->pool, &l);
- if(!strcasecmp(w,"Limit"))
+ while (l[0]) {
+ w = ap_getword_conf(cmd->pool, &l);
+ if (!strcasecmp(w, "Limit")) {
d->override |= OR_LIMIT;
- else if(!strcasecmp(w,"Options"))
+ }
+ else if (!strcasecmp(w, "Options")) {
d->override |= OR_OPTIONS;
- else if(!strcasecmp(w,"FileInfo"))
+ }
+ else if (!strcasecmp(w, "FileInfo")) {
d->override |= OR_FILEINFO;
- else if(!strcasecmp(w,"AuthConfig"))
+ }
+ else if (!strcasecmp(w, "AuthConfig")) {
d->override |= OR_AUTHCFG;
- else if(!strcasecmp(w,"Indexes"))
+ }
+ else if (!strcasecmp(w, "Indexes")) {
d->override |= OR_INDEXES;
- else if(!strcasecmp(w,"None"))
+ }
+ else if (!strcasecmp(w, "None")) {
d->override = OR_NONE;
- else if(!strcasecmp(w,"All"))
+ }
+ else if (!strcasecmp(w, "All")) {
d->override = OR_ALL;
- else
- return ap_pstrcat (cmd->pool, "Illegal override option ", w, NULL);
+ }
+ else {
+ return ap_pstrcat(cmd->pool, "Illegal override option ", w, NULL);
+ }
d->override &= ~OR_UNSET;
}
return NULL;
}
-static const char *set_options (cmd_parms *cmd, core_dir_config *d, const char *l)
+static const char *set_options(cmd_parms *cmd, core_dir_config *d,
+ const char *l)
{
allow_options_t opt;
int first = 1;
char action;
- while(l[0]) {
+ while (l[0]) {
char *w = ap_getword_conf(cmd->pool, &l);
action = '\0';
- if (*w == '+' || *w == '-')
+ if (*w == '+' || *w == '-') {
action = *(w++);
+ }
else if (first) {
d->opts = OPT_NONE;
first = 0;
}
- if(!strcasecmp(w,"Indexes"))
+ if (!strcasecmp(w, "Indexes")) {
opt = OPT_INDEXES;
- else if(!strcasecmp(w,"Includes"))
+ }
+ else if (!strcasecmp(w, "Includes")) {
opt = OPT_INCLUDES;
- else if(!strcasecmp(w,"IncludesNOEXEC"))
+ }
+ else if (!strcasecmp(w, "IncludesNOEXEC")) {
opt = (OPT_INCLUDES | OPT_INCNOEXEC);
- else if(!strcasecmp(w,"FollowSymLinks"))
+ }
+ else if (!strcasecmp(w, "FollowSymLinks")) {
opt = OPT_SYM_LINKS;
- else if(!strcasecmp(w,"SymLinksIfOwnerMatch"))
+ }
+ else if (!strcasecmp(w, "SymLinksIfOwnerMatch")) {
opt = OPT_SYM_OWNER;
- else if(!strcasecmp(w,"execCGI"))
+ }
+ else if (!strcasecmp(w, "execCGI")) {
opt = OPT_EXECCGI;
- else if (!strcasecmp(w,"MultiViews"))
+ }
+ else if (!strcasecmp(w, "MultiViews")) {
opt = OPT_MULTI;
- else if (!strcasecmp(w,"RunScripts")) /* AI backcompat. Yuck */
+ }
+ else if (!strcasecmp(w, "RunScripts")) { /* AI backcompat. Yuck */
opt = OPT_MULTI|OPT_EXECCGI;
- else if(!strcasecmp(w,"None"))
+ }
+ else if (!strcasecmp(w, "None")) {
opt = OPT_NONE;
- else if(!strcasecmp(w,"All"))
+ }
+ else if (!strcasecmp(w, "All")) {
opt = OPT_ALL;
- else
- return ap_pstrcat (cmd->pool, "Illegal option ", w, NULL);
+ }
+ else {
+ return ap_pstrcat(cmd->pool, "Illegal option ", w, NULL);
+ }
/* we ensure the invariant (d->opts_add & d->opts_remove) == 0 */
if (action == '-') {
@@ -850,61 +1012,84 @@
return NULL;
}
-static const char *satisfy (cmd_parms *cmd, core_dir_config *c, char *arg)
+static const char *satisfy(cmd_parms *cmd, core_dir_config *c, char *arg)
{
- if(!strcasecmp(arg,"all"))
+ if (!strcasecmp(arg, "all")) {
c->satisfy = SATISFY_ALL;
- else if(!strcasecmp(arg,"any"))
+ }
+ else if (!strcasecmp(arg, "any")) {
c->satisfy = SATISFY_ANY;
- else
+ }
+ else {
return "Satisfy either 'any' or 'all'.";
+ }
return NULL;
}
-static const char *require (cmd_parms *cmd, core_dir_config *c, char *arg)
+static const char *require(cmd_parms *cmd, core_dir_config *c, char *arg)
{
require_line *r;
- if (!c->ap_requires)
- c->ap_requires = ap_make_array (cmd->pool, 2, sizeof(require_line));
-
- r = (require_line *)ap_push_array (c->ap_requires);
- r->requirement = ap_pstrdup (cmd->pool, arg);
+ if (!c->ap_requires) {
+ c->ap_requires = ap_make_array(cmd->pool, 2, sizeof(require_line));
+ }
+ r = (require_line *)ap_push_array(c->ap_requires);
+ r->requirement = ap_pstrdup(cmd->pool, arg);
r->method_mask = cmd->limited;
return NULL;
}
-CORE_EXPORT_NONSTD(const char *) ap_limit_section (cmd_parms *cmd, void *dummy, const char *arg)
+CORE_EXPORT_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, void *dummy,
+ const char *arg)
{
- const char *limited_methods = ap_getword(cmd->pool,&arg,'>');
+ const char *limited_methods = ap_getword(cmd->pool, &arg, '>');
int limited = 0;
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
/* XXX: NB: Currently, we have no way of checking
* whether <Limit> sections are closed properly.
* (If we would add a srm_command_loop() here we might...)
*/
- while(limited_methods[0]) {
- char *method = ap_getword_conf (cmd->pool, &limited_methods);
- if(!strcasecmp(method,"GET")) limited |= (1 << M_GET);
- else if(!strcasecmp(method,"PUT")) limited |= (1 << M_PUT);
- else if(!strcasecmp(method,"POST")) limited |= (1 << M_POST);
- else if(!strcasecmp(method,"DELETE")) limited |= (1 << M_DELETE);
- else if(!strcasecmp(method,"CONNECT")) limited |= (1 << M_CONNECT);
- else if(!strcasecmp(method,"OPTIONS")) limited |= (1 << M_OPTIONS);
- else return "unknown method in <Limit>";
+ while (limited_methods[0]) {
+ char *method = ap_getword_conf(cmd->pool, &limited_methods);
+ if (!strcmp(method, "GET")) {
+ limited |= (1 << M_GET);
+ }
+ else if (!strcmp(method, "PUT")) {
+ limited |= (1 << M_PUT);
+ }
+ else if (!strcmp(method, "POST")) {
+ limited |= (1 << M_POST);
+ }
+ else if (!strcmp(method, "DELETE")) {
+ limited |= (1 << M_DELETE);
+ }
+ else if (!strcmp(method, "CONNECT")) {
+ limited |= (1 << M_CONNECT);
+ }
+ else if (!strcmp(method, "OPTIONS")) {
+ limited |= (1 << M_OPTIONS);
+ }
+ else {
+ return ap_pstrcat(cmd->pool, "unknown method \"",
+ method, "\" in <Limit>", NULL);
+ }
}
cmd->limited = limited;
return NULL;
}
-static const char *endlimit_section (cmd_parms *cmd, void *dummy, void *dummy2)
+static const char *endlimit_section(cmd_parms *cmd, void *dummy, void *dummy2)
{
- if (cmd->limited == -1) return "</Limit> unexpected";
+ if (cmd->limited == -1) {
+ return "</Limit> unexpected";
+ }
cmd->limited = -1;
return NULL;
@@ -914,13 +1099,14 @@
* When a section is not closed properly when end-of-file is reached,
* then an error message should be printed:
*/
-static const char *missing_endsection (cmd_parms *cmd, int nest)
+static const char *missing_endsection(cmd_parms *cmd, int nest)
{
- if (nest < 2)
+ if (nest < 2) {
return ap_psprintf(cmd->pool, "Missing %s directive at end-of-file",
- cmd->end_token);
+ cmd->end_token);
+ }
return ap_psprintf(cmd->pool, "%d missing %s directives at end-of-file",
- nest, cmd->end_token);
+ nest, cmd->end_token);
}
/* We use this in <DirectoryMatch> and <FilesMatch>, to ensure that
@@ -936,35 +1122,46 @@
static const char *end_nested_section(cmd_parms *cmd, void *dummy)
{
if (cmd->end_token == NULL) {
- return ap_pstrcat(cmd->pool, cmd->cmd->name,
- " without matching <", cmd->cmd->name + 2, " section", NULL);
- }
+ return ap_pstrcat(cmd->pool, cmd->cmd->name,
+ " without matching <", cmd->cmd->name + 2,
+ " section", NULL);
+ }
+ /*
+ * This '!=' may look weird on a string comparison, but it's correct --
+ * it's been set up so that checking for two pointers to the same datum
+ * is valid here. And faster.
+ */
if (cmd->cmd->name != cmd->end_token) {
return ap_pstrcat(cmd->pool, "Expected ", cmd->end_token, " but saw ",
- cmd->cmd->name, NULL);
+ cmd->cmd->name, NULL);
}
return cmd->end_token;
}
-static const char *dirsection (cmd_parms *cmd, void *dummy, const char *arg)
+static const char *dirsection(cmd_parms *cmd, void *dummy, const char *arg)
{
const char *errmsg;
- char *endp = strrchr (arg, '>');
+ char *endp = strrchr(arg, '>');
int old_overrides = cmd->override;
char *old_path = cmd->path;
core_dir_config *conf;
- void *new_dir_conf = ap_create_per_dir_config (cmd->pool);
+ void *new_dir_conf = ap_create_per_dir_config(cmd->pool);
regex_t *r = NULL;
const char *old_end_token;
const command_rec *thiscmd = cmd->cmd;
- const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
- if (endp) *endp = '\0';
+ if (endp) {
+ *endp = '\0';
+ }
- cmd->path = ap_getword_conf (cmd->pool, &arg);
-#ifdef __EMX__
+ cmd->path = ap_getword_conf(cmd->pool, &arg);
+#ifdef OS2
/* Fix OS/2 HPFS filename case problem. */
cmd->path = strlwr(cmd->path);
#endif
@@ -974,7 +1171,7 @@
r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
}
else if (!strcmp(cmd->path, "~")) {
- cmd->path = ap_getword_conf (cmd->pool, &arg);
+ cmd->path = ap_getword_conf(cmd->pool, &arg);
r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
}
else {
@@ -984,22 +1181,26 @@
old_end_token = cmd->end_token;
cmd->end_token = thiscmd->cmd_data ? end_directorymatch_section : end_directory_section;
- errmsg = ap_srm_command_loop (cmd, new_dir_conf);
+ errmsg = ap_srm_command_loop(cmd, new_dir_conf);
if (errmsg == NULL) {
errmsg = missing_endsection(cmd, 1);
}
cmd->end_token = old_end_token;
- if (errmsg != (thiscmd->cmd_data ? end_directorymatch_section : end_directory_section))
+ if (errmsg != (thiscmd->cmd_data
+ ? end_directorymatch_section
+ : end_directory_section)) {
return errmsg;
+ }
conf = (core_dir_config *)ap_get_module_config(new_dir_conf, &core_module);
conf->r = r;
- ap_add_per_dir_conf (cmd->server, new_dir_conf);
+ ap_add_per_dir_conf(cmd->server, new_dir_conf);
- if (*arg != '\0')
- return ap_pstrcat (cmd->pool, "Multiple ", thiscmd->name,
- "> arguments not (yet) supported.", NULL);
+ if (*arg != '\0') {
+ return ap_pstrcat(cmd->pool, "Multiple ", thiscmd->name,
+ "> arguments not (yet) supported.", NULL);
+ }
cmd->path = old_path;
cmd->override = old_overrides;
@@ -1007,10 +1208,10 @@
return NULL;
}
-static const char *urlsection (cmd_parms *cmd, void *dummy, const char *arg)
+static const char *urlsection(cmd_parms *cmd, void *dummy, const char *arg)
{
const char *errmsg;
- char *endp = strrchr (arg, '>');
+ char *endp = strrchr(arg, '>');
int old_overrides = cmd->override;
char *old_path = cmd->path;
core_dir_config *conf;
@@ -1018,44 +1219,54 @@
const char *old_end_token;
const command_rec *thiscmd = cmd->cmd;
- void *new_url_conf = ap_create_per_dir_config (cmd->pool);
+ void *new_url_conf = ap_create_per_dir_config(cmd->pool);
- const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
- if (endp) *endp = '\0';
+ if (endp) {
+ *endp = '\0';
+ }
- cmd->path = ap_getword_conf (cmd->pool, &arg);
+ cmd->path = ap_getword_conf(cmd->pool, &arg);
cmd->override = OR_ALL|ACCESS_CONF;
if (thiscmd->cmd_data) { /* <LocationMatch> */
r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED);
}
else if (!strcmp(cmd->path, "~")) {
- cmd->path = ap_getword_conf (cmd->pool, &arg);
+ cmd->path = ap_getword_conf(cmd->pool, &arg);
r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED);
}
old_end_token = cmd->end_token;
- cmd->end_token = thiscmd->cmd_data ? end_locationmatch_section : end_location_section;
- errmsg = ap_srm_command_loop (cmd, new_url_conf);
+ cmd->end_token = thiscmd->cmd_data ? end_locationmatch_section
+ : end_location_section;
+ errmsg = ap_srm_command_loop(cmd, new_url_conf);
if (errmsg == NULL) {
errmsg = missing_endsection(cmd, 1);
}
cmd->end_token = old_end_token;
- if (errmsg != (thiscmd->cmd_data ? end_locationmatch_section : end_location_section))
+ if (errmsg != (thiscmd->cmd_data
+ ? end_locationmatch_section
+ : end_location_section)) {
return errmsg;
+ }
conf = (core_dir_config *)ap_get_module_config(new_url_conf, &core_module);
conf->d = ap_pstrdup(cmd->pool, cmd->path); /* No mangling, please */
- conf->d_is_fnmatch = ap_is_fnmatch( conf->d ) != 0;
+ conf->d_is_fnmatch = ap_is_fnmatch(conf->d) != 0;
conf->r = r;
- ap_add_per_url_conf (cmd->server, new_url_conf);
+ ap_add_per_url_conf(cmd->server, new_url_conf);
- if (*arg != '\0')
- return ap_pstrcat (cmd->pool, "Multiple ", thiscmd->name,
- "> arguments not (yet) supported.", NULL);
+ if (*arg != '\0') {
+ return ap_pstrcat(cmd->pool, "Multiple ", thiscmd->name,
+ "> arguments not (yet) supported.", NULL);
+ }
cmd->path = old_path;
cmd->override = old_overrides;
@@ -1063,10 +1274,11 @@
return NULL;
}
-static const char *filesection (cmd_parms *cmd, core_dir_config *c, const char *arg)
+static const char *filesection(cmd_parms *cmd, core_dir_config *c,
+ const char *arg)
{
const char *errmsg;
- char *endp = strrchr (arg, '>');
+ char *endp = strrchr(arg, '>');
int old_overrides = cmd->override;
char *old_path = cmd->path;
core_dir_config *conf;
@@ -1074,23 +1286,28 @@
const char *old_end_token;
const command_rec *thiscmd = cmd->cmd;
- void *new_file_conf = ap_create_per_dir_config (cmd->pool);
+ void *new_file_conf = ap_create_per_dir_config(cmd->pool);
- const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT | NOT_IN_LOCATION);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT|NOT_IN_LOCATION);
+ if (err != NULL) {
+ return err;
+ }
- if (endp) *endp = '\0';
+ if (endp) {
+ *endp = '\0';
+ }
- cmd->path = ap_getword_conf (cmd->pool, &arg);
+ cmd->path = ap_getword_conf(cmd->pool, &arg);
/* Only if not an .htaccess file */
- if (!old_path)
+ if (!old_path) {
cmd->override = OR_ALL|ACCESS_CONF;
+ }
if (thiscmd->cmd_data) { /* <FilesMatch> */
r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
}
else if (!strcmp(cmd->path, "~")) {
- cmd->path = ap_getword_conf (cmd->pool, &arg);
+ cmd->path = ap_getword_conf(cmd->pool, &arg);
r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
}
else {
@@ -1100,24 +1317,29 @@
old_end_token = cmd->end_token;
cmd->end_token = thiscmd->cmd_data ? end_filesmatch_section : end_files_section;
- errmsg = ap_srm_command_loop (cmd, new_file_conf);
+ errmsg = ap_srm_command_loop(cmd, new_file_conf);
if (errmsg == NULL) {
errmsg = missing_endsection(cmd, 1);
}
cmd->end_token = old_end_token;
- if (errmsg != (thiscmd->cmd_data ? end_filesmatch_section : end_files_section))
+ if (errmsg != (thiscmd->cmd_data
+ ? end_filesmatch_section
+ : end_files_section)) {
return errmsg;
+ }
- conf = (core_dir_config *)ap_get_module_config(new_file_conf, &core_module);
+ conf = (core_dir_config *)ap_get_module_config(new_file_conf,
+ &core_module);
conf->d = cmd->path;
conf->d_is_fnmatch = ap_is_fnmatch(conf->d) != 0;
conf->r = r;
- add_file_conf (c, new_file_conf);
+ add_file_conf(c, new_file_conf);
- if (*arg != '\0')
- return ap_pstrcat (cmd->pool, "Multiple ", thiscmd->name,
- "> arguments not (yet) supported.", NULL);
+ if (*arg != '\0') {
+ return ap_pstrcat(cmd->pool, "Multiple ", thiscmd->name,
+ "> arguments not (yet) supported.", NULL);
+ }
cmd->path = old_path;
cmd->override = old_overrides;
@@ -1130,31 +1352,39 @@
* Extra (redundant, unpaired) </IfModule> directives are
* simply silently ignored.
*/
-static const char *end_ifmod (cmd_parms *cmd, void *dummy) {
+static const char *end_ifmod(cmd_parms *cmd, void *dummy)
+{
return NULL;
}
-static const char *start_ifmod (cmd_parms *cmd, void *dummy, char *arg)
+static const char *start_ifmod(cmd_parms *cmd, void *dummy, char *arg)
{
- char *endp = strrchr (arg, '>');
+ char *endp = strrchr(arg, '>');
char l[MAX_STRING_LEN];
int not = (arg[0] == '!');
module *found;
int nest = 1;
- if (endp) *endp = '\0';
- if (not) arg++;
+ if (endp) {
+ *endp = '\0';
+ }
+ if (not) {
+ arg++;
+ }
found = ap_find_linked_module(arg);
- if ((!not && found) || (not && !found))
- return NULL;
+ if ((!not && found) || (not && !found)) {
+ return NULL;
+ }
while (nest && !(ap_cfg_getline (l, sizeof(l), cmd->config_file))) {
- if (!strncasecmp(l, "<IfModule", 9))
- nest++;
- if (!strcasecmp(l, "</IfModule>"))
+ if (!strncasecmp(l, "<IfModule", 9)) {
+ nest++;
+ }
+ if (!strcasecmp(l, "</IfModule>")) {
nest--;
+ }
}
if (nest) {
@@ -1171,8 +1401,9 @@
defines = (char **)ap_server_config_defines->elts;
for (i = 0; i < ap_server_config_defines->nelts; i++) {
- if (strcmp(defines[i], name) == 0)
+ if (strcmp(defines[i], name) == 0) {
return 1;
+ }
}
return 0;
}
@@ -1191,8 +1422,9 @@
int nest = 1;
endp = strrchr(arg, '>');
- if (endp)
+ if (endp) {
*endp = '\0';
+ }
if (arg[0] == '!') {
not = 1;
arg++;
@@ -1200,14 +1432,17 @@
defined = ap_exists_config_define(arg);
- if ((!not && defined) || (not && !defined))
+ if ((!not && defined) || (not && !defined)) {
return NULL;
+ }
while (nest && !(ap_cfg_getline(l, MAX_STRING_LEN, cmd->config_file))) {
- if (!strncasecmp(l, "<IfDefine", 9))
- nest++;
- if (!strcasecmp(l, "</IfDefine>"))
- nest--;
+ if (!strncasecmp(l, "<IfDefine", 9)) {
+ nest++;
+ }
+ if (!strcasecmp(l, "</IfDefine>")) {
+ nest--;
+ }
}
if (nest) {
cmd->end_token = end_ifdefine_section;
@@ -1218,30 +1453,36 @@
/* httpd.conf commands... beginning with the <VirtualHost> business */
-static const char *virtualhost_section (cmd_parms *cmd, void *dummy, char *arg)
+static const char *virtualhost_section(cmd_parms *cmd, void *dummy, char *arg)
{
server_rec *main_server = cmd->server, *s;
const char *errmsg;
- char *endp = strrchr (arg, '>');
+ char *endp = strrchr(arg, '>');
pool *p = cmd->pool, *ptemp = cmd->temp_pool;
const char *old_end_token;
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (endp) *endp = '\0';
+ if (endp) {
+ *endp = '\0';
+ }
/* FIXME: There's another feature waiting to happen here -- since you
can now put multiple addresses/names on a single <VirtualHost>
you might want to use it to group common definitions and then
define other "subhosts" with their individual differences. But
personally I'd rather just do it with a macro preprocessor. -djg */
- if (main_server->is_virtual)
+ if (main_server->is_virtual) {
return "<VirtualHost> doesn't nest!";
+ }
- errmsg = ap_init_virtual_host (p, arg, main_server, &s);
- if (errmsg)
+ errmsg = ap_init_virtual_host(p, arg, main_server, &s);
+ if (errmsg) {
return errmsg;
+ }
s->next = main_server->next;
main_server->next = s;
@@ -1252,124 +1493,157 @@
old_end_token = cmd->end_token;
cmd->end_token = end_virtualhost_section;
cmd->server = s;
- errmsg = ap_srm_command_loop (cmd, s->lookup_defaults);
+ errmsg = ap_srm_command_loop(cmd, s->lookup_defaults);
cmd->server = main_server;
if (errmsg == NULL) {
errmsg = missing_endsection(cmd, 1);
}
cmd->end_token = old_end_token;
- if (s->srm_confname)
- ap_process_resource_config (s, s->srm_confname, p, ptemp);
+ if (s->srm_confname) {
+ ap_process_resource_config(s, s->srm_confname, p, ptemp);
+ }
- if (s->access_confname)
- ap_process_resource_config (s, s->access_confname, p, ptemp);
+ if (s->access_confname) {
+ ap_process_resource_config(s, s->access_confname, p, ptemp);
+ }
- if (errmsg == end_virtualhost_section)
+ if (errmsg == end_virtualhost_section) {
return NULL;
+ }
return errmsg;
}
-static const char *set_server_alias(cmd_parms *cmd, void *dummy, const char *arg)
+static const char *set_server_alias(cmd_parms *cmd, void *dummy,
+ const char *arg)
{
- if (!cmd->server->names)
+ if (!cmd->server->names) {
return "ServerAlias only used in <VirtualHost>";
+ }
while (*arg) {
char **item, *name = ap_getword_conf(cmd->pool, &arg);
- if (ap_is_matchexp(name))
- item = (char **) ap_push_array(cmd->server->wild_names);
- else
- item = (char **) ap_push_array(cmd->server->names);
+ if (ap_is_matchexp(name)) {
+ item = (char **)ap_push_array(cmd->server->wild_names);
+ }
+ else {
+ item = (char **)ap_push_array(cmd->server->names);
+ }
*item = name;
}
return NULL;
}
-static const char *add_module_command (cmd_parms *cmd, void *dummy, char *arg)
+static const char *add_module_command(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (!ap_add_named_module(arg))
+ if (!ap_add_named_module(arg)) {
return ap_pstrcat(cmd->pool, "Cannot add module via name '", arg,
"': not in list of loaded modules", NULL);
+ }
return NULL;
}
-static const char *clear_module_list_command (cmd_parms *cmd, void *dummy)
+static const char *clear_module_list_command(cmd_parms *cmd, void *dummy)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ap_clear_module_list ();
+ ap_clear_module_list();
return NULL;
}
-static const char *set_server_string_slot (cmd_parms *cmd, void *dummy,
- char *arg)
+static const char *set_server_string_slot(cmd_parms *cmd, void *dummy,
+ char *arg)
{
/* This one's pretty generic... */
int offset = (int)(long)cmd->info;
char *struct_ptr = (char *)cmd->server;
- const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
*(char **)(struct_ptr + offset) = arg;
return NULL;
}
-static const char *server_type (cmd_parms *cmd, void *dummy, char *arg)
+static const char *server_type(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (!strcasecmp (arg, "inetd")) ap_standalone = 0;
- else if (!strcasecmp (arg, "standalone")) ap_standalone = 1;
- else return "ServerType must be either 'inetd' or 'standalone'";
+ if (!strcasecmp(arg, "inetd")) {
+ ap_standalone = 0;
+ }
+ else if (!strcasecmp(arg, "standalone")) {
+ ap_standalone = 1;
+ }
+ else {
+ return "ServerType must be either 'inetd' or 'standalone'";
+ }
return NULL;
}
-static const char *server_port (cmd_parms *cmd, void *dummy, char *arg)
+static const char *server_port(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
int port;
- if (err != NULL)
+ if (err != NULL) {
return err;
+ }
port = atoi(arg);
- if (port <= 0 || port >= 65536) /* 65536 == 1<<16 */
+ if (port <= 0 || port >= 65536) { /* 65536 == 1<<16 */
return ap_pstrcat(cmd->temp_pool, "The port number \"", arg,
- "\" is outside the appropriate range (i.e. 1..65535).",
- NULL);
+ "\" is outside the appropriate range "
+ "(i.e., 1..65535).", NULL);
+ }
cmd->server->port = port;
return NULL;
}
-static const char *set_signature_flag (cmd_parms *cmd, core_dir_config *d,
- char *arg)
+static const char *set_signature_flag(cmd_parms *cmd, core_dir_config *d,
+ char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (strcasecmp(arg, "On") == 0)
+ if (strcasecmp(arg, "On") == 0) {
d->server_signature = srv_sig_on;
- else if (strcasecmp(arg, "Off") == 0)
- d->server_signature = srv_sig_off;
- else if (strcasecmp(arg, "EMail") == 0)
+ }
+ else if (strcasecmp(arg, "Off") == 0) {
+ d->server_signature = srv_sig_off;
+ }
+ else if (strcasecmp(arg, "EMail") == 0) {
d->server_signature = srv_sig_withmail;
- else
+ }
+ else {
return "ServerSignature: use one of: off | on | email";
+ }
return NULL;
}
-static const char *set_send_buffer_size (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_send_buffer_size(cmd_parms *cmd, void *dummy, char *arg)
{
- int s = atoi (arg);
+ int s = atoi(arg);
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
if (s < 512 && s != 0) {
return "SendBufferSize must be >= 512 bytes, or 0 for system default.";
@@ -1378,18 +1652,21 @@
return NULL;
}
-static const char *set_user (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_user(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
if (!cmd->server->is_virtual) {
ap_user_name = arg;
cmd->server->server_uid = ap_user_id = ap_uname2id(arg);
}
else {
- if (ap_suexec_enabled)
+ if (ap_suexec_enabled) {
cmd->server->server_uid = ap_uname2id(arg);
+ }
else {
cmd->server->server_uid = ap_user_id;
PR_fprintf(PR_STDERR,
@@ -1397,7 +1674,7 @@
"requires SUEXEC wrapper.\n");
}
}
-#if !defined (BIG_SECURITY_HOLE) && !defined (__EMX__)
+#if !defined (BIG_SECURITY_HOLE) && !defined (OS2)
if (cmd->server->server_uid == 0) {
PR_fprintf (PR_STDERR,
"Error:\tApache has not been designed to serve pages while running\n"
@@ -1414,16 +1691,20 @@
return NULL;
}
-static const char *set_group (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_group(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (!cmd->server->is_virtual)
+ if (!cmd->server->is_virtual) {
cmd->server->server_gid = ap_group_id = ap_gname2id(arg);
+ }
else {
- if (ap_suexec_enabled)
+ if (ap_suexec_enabled) {
cmd->server->server_gid = ap_gname2id(arg);
+ }
else {
cmd->server->server_gid = ap_group_id;
PR_fprintf(PR_STDERR,
@@ -1434,158 +1715,204 @@
return NULL;
}
-static const char *set_server_root (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_server_root(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
- if (!ap_is_directory (arg)) return "ServerRoot must be a valid directory";
- ap_cpystrn (ap_server_root, ap_os_canonical_filename(cmd->pool, arg), sizeof(ap_server_root));
+ if (err != NULL) {
+ return err;
+ }
+
+ arg = ap_os_canonical_filename(cmd->pool, arg);
+
+ if (!ap_is_directory(arg)) {
+ return "ServerRoot must be a valid directory";
+ }
+ ap_cpystrn(ap_server_root, arg,
+ sizeof(ap_server_root));
return NULL;
}
-static const char *set_timeout (cmd_parms *cmd, void *dummy, char *arg) {
+static const char *set_timeout(cmd_parms *cmd, void *dummy, char *arg)
+{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
cmd->server->timeout_interval = PR_SecondsToInterval(atoi(arg));
return NULL;
}
-static const char *set_keep_alive_timeout (cmd_parms *cmd, void *dummy,
- char *arg)
+static const char *set_keep_alive_timeout(cmd_parms *cmd, void *dummy,
+ char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
cmd->server->keep_alive_timeout_interval = PR_SecondsToInterval(atoi(arg));
return NULL;
}
-static const char *set_keep_alive (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_keep_alive(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
/* We've changed it to On/Off, but used to use numbers
* so we accept anything but "Off" or "0" as "On"
*/
- if (!strcasecmp(arg, "off") || !strcmp(arg, "0"))
+ if (!strcasecmp(arg, "off") || !strcmp(arg, "0")) {
cmd->server->keep_alive = 0;
- else
+ }
+ else {
cmd->server->keep_alive = 1;
+ }
return NULL;
}
-static const char *set_keep_alive_max (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_keep_alive_max(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- cmd->server->keep_alive_max = atoi (arg);
+ cmd->server->keep_alive_max = atoi(arg);
return NULL;
}
-static const char *set_pidfile (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_pidfile(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (cmd->server->is_virtual)
+ if (cmd->server->is_virtual) {
return "PidFile directive not allowed in <VirtualHost>";
+ }
ap_pid_fname = arg;
return NULL;
}
-static const char *set_scoreboard (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_scoreboard(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
ap_scoreboard_fname = arg;
return NULL;
}
-static const char *set_lockfile (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_lockfile(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
ap_lock_fname = arg;
return NULL;
}
-static const char *set_idcheck (cmd_parms *cmd, core_dir_config *d, int arg)
+static const char *set_idcheck(cmd_parms *cmd, core_dir_config *d, int arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
d->do_rfc1413 = arg != 0;
return NULL;
}
-static const char *set_hostname_lookups (cmd_parms *cmd, core_dir_config *d,
- char *arg)
+static const char *set_hostname_lookups(cmd_parms *cmd, core_dir_config *d,
+ char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (!strcasecmp (arg, "on")) {
+ if (!strcasecmp(arg, "on")) {
d->hostname_lookups = HOSTNAME_LOOKUP_ON;
- } else if (!strcasecmp (arg, "off")) {
+ }
+ else if (!strcasecmp(arg, "off")) {
d->hostname_lookups = HOSTNAME_LOOKUP_OFF;
- } else if (!strcasecmp (arg, "double")) {
+ }
+ else if (!strcasecmp(arg, "double")) {
d->hostname_lookups = HOSTNAME_LOOKUP_DOUBLE;
- } else {
+ }
+ else {
return "parameter must be 'on', 'off', or 'double'";
}
return NULL;
}
-static const char *set_serverpath (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_serverpath(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
cmd->server->path = arg;
- cmd->server->pathlen = strlen (arg);
+ cmd->server->pathlen = strlen(arg);
return NULL;
}
-static const char *set_content_md5 (cmd_parms *cmd, core_dir_config *d, int arg)
+static const char *set_content_md5(cmd_parms *cmd, core_dir_config *d, int arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
d->content_md5 = arg != 0;
return NULL;
}
-static const char *set_use_canonical_name (cmd_parms *cmd, core_dir_config *d,
- int arg)
+static const char *set_use_canonical_name(cmd_parms *cmd, core_dir_config *d,
+ int arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
- if (err != NULL)
+ if (err != NULL) {
return err;
+ }
d->use_canonical_name = arg != 0;
return NULL;
}
-static const char *set_daemons_to_start (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, char *arg)
{
+#ifdef WIN32
+ fprintf(stderr, "WARNING: StartServers has no effect on Win32\n");
+#else
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ap_daemons_to_start = atoi (arg);
+ ap_daemons_to_start = atoi(arg);
+#endif
return NULL;
}
-static const char *set_min_free_servers (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_min_free_servers(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
ap_daemons_min_free = atoi (arg);
if (ap_daemons_min_free < 0) {
@@ -1598,21 +1925,25 @@
return NULL;
}
-static const char *set_max_free_servers (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_max_free_servers(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ap_daemons_max_free = atoi (arg);
+ ap_daemons_max_free = atoi(arg);
return NULL;
}
static const char *set_server_limit (cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ap_daemons_limit = atoi (arg);
+ ap_daemons_limit = atoi(arg);
if (ap_daemons_limit > HARD_SERVER_LIMIT) {
PR_fprintf(PR_STDERR, "WARNING: MaxClients of %d exceeds compile time limit "
"of %d servers,\n", ap_daemons_limit, HARD_SERVER_LIMIT);
@@ -1620,32 +1951,46 @@
"see the\n", HARD_SERVER_LIMIT);
PR_fprintf(PR_STDERR, " HARD_SERVER_LIMIT define in src/httpd.h.\n");
ap_daemons_limit = HARD_SERVER_LIMIT;
- } else if (ap_daemons_limit < 1) {
+ }
+ else if (ap_daemons_limit < 1) {
PR_fprintf (PR_STDERR, "WARNING: Require MaxClients > 0, setting to 1\n");
ap_daemons_limit = 1;
}
return NULL;
}
-static const char *set_threads (cmd_parms *cmd, void *dummy, char *arg) {
+static const char *set_threads(cmd_parms *cmd, void *dummy, char *arg)
+{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ap_threads_per_child = atoi (arg);
-#ifdef WIN32
- if(ap_threads_per_child > 64)
- return "Can't have more than 64 threads in Windows (for now)";
-#endif
+ ap_threads_per_child = atoi(arg);
+ if (ap_threads_per_child > HARD_SERVER_LIMIT) {
+ PR_fprintf(PR_STDERR, "WARNING: ThreadsPerChild of %d exceeds compile time limit "
+ "of %d threads,\n", ap_threads_per_child, HARD_SERVER_LIMIT);
+ PR_fprintf(PR_STDERR, " lowering ThreadsPerChild to %d. To increase, please "
+ "see the\n", HARD_SERVER_LIMIT);
+ PR_fprintf(PR_STDERR, " HARD_SERVER_LIMIT define in src/include/httpd.h.\n");
+ ap_threads_per_child = HARD_SERVER_LIMIT;
+ }
+ else if (ap_threads_per_child < 1) {
+ PR_fprintf(PR_STDERR, "WARNING: Require ThreadsPerChild > 0, setting to 1\n");
+ ap_threads_per_child = 1;
+ }
return NULL;
}
-static const char *set_excess_requests (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_excess_requests(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ap_excess_requests_per_child = atoi (arg);
+ ap_excess_requests_per_child = atoi(arg);
return NULL;
}
@@ -1656,16 +2001,16 @@
{
char *str;
struct rlimit *limit;
- /* If your platform doesn't define rlim_t then typedef it in conf.h */
+ /* If your platform doesn't define rlim_t then typedef it in ap_config.h */
rlim_t cur = 0;
rlim_t max = 0;
- *plimit = (struct rlimit *)ap_pcalloc(cmd->pool,sizeof **plimit);
+ *plimit = (struct rlimit *)ap_pcalloc(cmd->pool, sizeof(**plimit));
limit = *plimit;
if ((getrlimit(type, limit)) != 0) {
*plimit = NULL;
ap_log_error(APLOG_MARK, APLOG_ERR, cmd->server,
- "%s: getrlimit failed", cmd->cmd->name);
+ "%s: getrlimit failed", cmd->cmd->name);
return;
}
@@ -1679,32 +2024,36 @@
}
else {
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, cmd->server,
- "Invalid parameters for %s", cmd->cmd->name);
+ "Invalid parameters for %s", cmd->cmd->name);
return;
}
- if (arg2 && (str = ap_getword_conf(cmd->pool, &arg2)))
+ if (arg2 && (str = ap_getword_conf(cmd->pool, &arg2))) {
max = atol(str);
+ }
/* if we aren't running as root, cannot increase max */
if (geteuid()) {
limit->rlim_cur = cur;
- if (max)
+ if (max) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, cmd->server,
- "Must be uid 0 to raise maximum %s", cmd->cmd->name);
+ "Must be uid 0 to raise maximum %s", cmd->cmd->name);
+ }
}
else {
- if (cur)
+ if (cur) {
limit->rlim_cur = cur;
- if (max)
+ }
+ if (max) {
limit->rlim_max = max;
+ }
}
}
#endif
#if !defined (RLIMIT_CPU) || !(defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS)) || !defined (RLIMIT_NPROC)
-static const char *no_set_limit (cmd_parms *cmd, core_dir_config *conf,
- char *arg, char *arg2)
+static const char *no_set_limit(cmd_parms *cmd, core_dir_config *conf,
+ char *arg, char *arg2)
{
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, cmd->server,
"%s not supported on this platform", cmd->cmd->name);
@@ -1713,42 +2062,44 @@
#endif
#ifdef RLIMIT_CPU
-static const char *set_limit_cpu (cmd_parms *cmd, core_dir_config *conf,
- char *arg, char *arg2)
+static const char *set_limit_cpu(cmd_parms *cmd, core_dir_config *conf,
+ char *arg, char *arg2)
{
- set_rlimit(cmd,&conf->limit_cpu,arg,arg2,RLIMIT_CPU);
+ set_rlimit(cmd, &conf->limit_cpu, arg, arg2, RLIMIT_CPU);
return NULL;
}
#endif
#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS)
-static const char *set_limit_mem (cmd_parms *cmd, core_dir_config *conf,
- char *arg, char * arg2)
+static const char *set_limit_mem(cmd_parms *cmd, core_dir_config *conf,
+ char *arg, char * arg2)
{
#if defined(RLIMIT_AS)
- set_rlimit(cmd,&conf->limit_mem,arg,arg2,RLIMIT_AS);
+ set_rlimit(cmd, &conf->limit_mem, arg, arg2 ,RLIMIT_AS);
#elif defined(RLIMIT_DATA)
- set_rlimit(cmd,&conf->limit_mem,arg,arg2,RLIMIT_DATA);
+ set_rlimit(cmd, &conf->limit_mem, arg, arg2, RLIMIT_DATA);
#elif defined(RLIMIT_VMEM)
- set_rlimit(cmd,&conf->limit_mem,arg,arg2,RLIMIT_VMEM);
+ set_rlimit(cmd, &conf->limit_mem, arg, arg2, RLIMIT_VMEM);
#endif
return NULL;
}
#endif
#ifdef RLIMIT_NPROC
-static const char *set_limit_nproc (cmd_parms *cmd, core_dir_config *conf,
- char *arg, char * arg2)
+static const char *set_limit_nproc(cmd_parms *cmd, core_dir_config *conf,
+ char *arg, char * arg2)
{
- set_rlimit(cmd,&conf->limit_nproc,arg,arg2,RLIMIT_NPROC);
+ set_rlimit(cmd, &conf->limit_nproc, arg, arg2, RLIMIT_NPROC);
return NULL;
}
#endif
-static const char *set_bind_address (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_bind_address(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
/* XXX: ipv6 */
ap_bind_address.inet.ip = ap_get_virthost_addr (arg, NULL);
@@ -1762,17 +2113,23 @@
unsigned short port;
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- ports=strchr(ips, ':');
- if (ports != NULL)
- {
- if (ports == ips) return "Missing IP address";
- else if (ports[1] == '\0')
+ ports = strchr(ips, ':');
+ if (ports != NULL) {
+ if (ports == ips) {
+ return "Missing IP address";
+ }
+ else if (ports[1] == '\0') {
return "Address must end in :<port-number>";
+ }
*(ports++) = '\0';
- } else
+ }
+ else {
ports = ips;
+ }
new=ap_pcalloc(cmd->pool, sizeof(listen_rec));
/* XXX: ipv6 */
@@ -1783,9 +2140,10 @@
else {
new->local_addr.inet.ip = ap_get_virthost_addr(ips, NULL);
}
- port=atoi(ports);
- if(!port)
+ port = atoi(ports);
+ if (!port) {
return "Port must be numeric";
+ }
new->local_addr.inet.port = PR_htons(port);
new->fd = NULL;
new->index = 0;
@@ -1794,15 +2152,19 @@
return NULL;
}
-static const char *set_listenbacklog (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_listenbacklog(cmd_parms *cmd, void *dummy, char *arg)
{
int b;
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- b = atoi (arg);
- if (b < 1) return "ListenBacklog must be > 0";
+ b = atoi(arg);
+ if (b < 1) {
+ return "ListenBacklog must be > 0";
+ }
ap_listenbacklog = b;
return NULL;
}
@@ -1811,13 +2173,15 @@
{
PRFileInfo finfo;
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
arg = ap_server_root_relative(cmd->pool, arg);
if (PR_GetFileInfo(arg, &finfo) != PR_SUCCESS
|| finfo.type != PR_FILE_DIRECTORY) {
return ap_pstrcat(cmd->pool, "CoreDumpDirectory ", arg,
- " does not exist or is not a directory", NULL);
+ " does not exist or is not a directory", NULL);
}
ap_cpystrn(ap_coredump_dir, arg, sizeof(ap_coredump_dir));
return NULL;
@@ -1832,59 +2196,76 @@
return NULL;
}
-static const char *set_loglevel (cmd_parms *cmd, void *dummy, const char *arg)
+static const char *set_loglevel(cmd_parms *cmd, void *dummy, const char *arg)
{
- char *str;
+ char *str;
- const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- if (err != NULL) return err;
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
- if ((str = ap_getword_conf(cmd->pool, &arg))) {
- if (!strcasecmp(str, "emerg"))
- cmd->server->loglevel = APLOG_EMERG;
- else if (!strcasecmp(str, "alert"))
- cmd->server->loglevel = APLOG_ALERT;
- else if (!strcasecmp(str, "crit"))
- cmd->server->loglevel = APLOG_CRIT;
- else if (!strcasecmp(str, "error"))
- cmd->server->loglevel = APLOG_ERR;
- else if (!strcasecmp(str, "warn"))
- cmd->server->loglevel = APLOG_WARNING;
- else if (!strcasecmp(str, "notice"))
- cmd->server->loglevel = APLOG_NOTICE;
- else if (!strcasecmp(str, "info"))
- cmd->server->loglevel = APLOG_INFO;
- else if (!strcasecmp(str, "debug"))
- cmd->server->loglevel = APLOG_DEBUG;
- else
- return "LogLevel requires level keyword: one of emerg/alert/crit/error/warn/notice/info/debug";
- }
- else
- return "LogLevel requires level keyword";
-
- return NULL;
+ if ((str = ap_getword_conf(cmd->pool, &arg))) {
+ if (!strcasecmp(str, "emerg")) {
+ cmd->server->loglevel = APLOG_EMERG;
+ }
+ else if (!strcasecmp(str, "alert")) {
+ cmd->server->loglevel = APLOG_ALERT;
+ }
+ else if (!strcasecmp(str, "crit")) {
+ cmd->server->loglevel = APLOG_CRIT;
+ }
+ else if (!strcasecmp(str, "error")) {
+ cmd->server->loglevel = APLOG_ERR;
+ }
+ else if (!strcasecmp(str, "warn")) {
+ cmd->server->loglevel = APLOG_WARNING;
+ }
+ else if (!strcasecmp(str, "notice")) {
+ cmd->server->loglevel = APLOG_NOTICE;
+ }
+ else if (!strcasecmp(str, "info")) {
+ cmd->server->loglevel = APLOG_INFO;
+ }
+ else if (!strcasecmp(str, "debug")) {
+ cmd->server->loglevel = APLOG_DEBUG;
+ }
+ else {
+ return "LogLevel requires level keyword: one of "
+ "emerg/alert/crit/error/warn/notice/info/debug";
+ }
+ }
+ else {
+ return "LogLevel requires level keyword";
+ }
+
+ return NULL;
}
API_EXPORT(const char *) ap_psignature(const char *prefix, request_rec *r)
{
char sport[20];
- core_dir_config *conf =
- (core_dir_config *) ap_get_module_config(r->per_dir_config, &core_module);
+ core_dir_config *conf;
- if (conf->server_signature == srv_sig_off)
+ conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
+ if (conf->server_signature == srv_sig_off) {
return "";
+ }
ap_snprintf(sport, sizeof sport, "%u", (unsigned) ap_get_server_port(r));
if (conf->server_signature == srv_sig_withmail) {
return ap_pstrcat(r->pool, prefix, "<ADDRESS>" SERVER_BASEVERSION
- " Server at <A HREF=\"mailto:", r->server->server_admin, "\">",
- ap_get_server_name(r), "</A> Port ", sport,
- "</ADDRESS>\n", NULL);
+ " Server at <A HREF=\"mailto:",
+ r->server->server_admin, "\">",
+ ap_get_server_name(r), "</A> Port ", sport,
+ "</ADDRESS>\n", NULL);
}
return ap_pstrcat(r->pool, prefix, "<ADDRESS>" SERVER_BASEVERSION
- " Server at ", ap_get_server_name(r), " Port ", sport,
- "</ADDRESS>\n", NULL);
+ " Server at ", ap_get_server_name(r), " Port ", sport,
+ "</ADDRESS>\n", NULL);
}
/*
@@ -1900,12 +2281,14 @@
}
#ifdef _OSD_POSIX /* BS2000 Logon Passwd file */
-static const char *set_bs2000_authfile (cmd_parms *cmd, void *dummy, char *name)
+static const char *set_bs2000_account(cmd_parms *cmd, void *dummy, char *name)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- return os_set_authfile(cmd->pool, name);
+ return os_set_account(cmd->pool, name);
}
#endif /*_OSD_POSIX*/
@@ -1917,20 +2300,108 @@
* string.
*/
-static const char *set_serv_tokens (cmd_parms *cmd, void *dummy, char *arg)
+static const char *set_serv_tokens(cmd_parms *cmd, void *dummy, char *arg)
{
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
- if (err != NULL) return err;
+ if (err != NULL) {
+ return err;
+ }
- if (!strcasecmp(arg, "OS"))
+ if (!strcasecmp(arg, "OS")) {
ap_server_tokens = SrvTk_OS;
- else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal"))
+ }
+ else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal")) {
ap_server_tokens = SrvTk_MIN;
- else
+ }
+ else {
ap_server_tokens = SrvTk_FULL;
+ }
+ return NULL;
+}
+
+static const char *set_limit_req_line(cmd_parms *cmd, void *dummy, char *arg)
+{
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ int lim;
+
+ if (err != NULL) {
+ return err;
+ }
+ lim = atoi(arg);
+ if (lim < 0) {
+ return ap_pstrcat(cmd->temp_pool, "LimitRequestLine \"", arg,
+ "\" must be a non-negative integer", NULL);
+ }
+ if (lim > DEFAULT_LIMIT_REQUEST_LINE) {
+ return ap_psprintf(cmd->temp_pool, "LimitRequestLine \"%s\" "
+ "must not exceed the precompiled maximum of %d",
+ arg, DEFAULT_LIMIT_REQUEST_LINE);
+ }
+ cmd->server->limit_req_line = lim;
+ return NULL;
+}
+
+static const char *set_limit_req_fieldsize(cmd_parms *cmd, void *dummy,
+ char *arg)
+{
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ int lim;
+
+ if (err != NULL) {
+ return err;
+ }
+ lim = atoi(arg);
+ if (lim < 0) {
+ return ap_pstrcat(cmd->temp_pool, "LimitRequestFieldsize \"", arg,
+ "\" must be a non-negative integer (0 = no limit)",
+ NULL);
+ }
+ if (lim > DEFAULT_LIMIT_REQUEST_FIELDSIZE) {
+ return ap_psprintf(cmd->temp_pool, "LimitRequestFieldsize \"%s\" "
+ "must not exceed the precompiled maximum of %d",
+ arg, DEFAULT_LIMIT_REQUEST_FIELDSIZE);
+ }
+ cmd->server->limit_req_fieldsize = lim;
return NULL;
}
+static const char *set_limit_req_fields(cmd_parms *cmd, void *dummy, char *arg)
+{
+ const char *err = ap_check_cmd_context(cmd,
+ NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+ int lim;
+
+ if (err != NULL) {
+ return err;
+ }
+ lim = atoi(arg);
+ if (lim < 0) {
+ return ap_pstrcat(cmd->temp_pool, "LimitRequestFields \"", arg,
+ "\" must be a non-negative integer (0 = no limit)",
+ NULL);
+ }
+ cmd->server->limit_req_fields = lim;
+ return NULL;
+}
+
+static const char *set_limit_req_body(cmd_parms *cmd, core_dir_config *conf,
+ char *arg)
+{
+ const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
+ if (err != NULL) {
+ return err;
+ }
+
+ /* WTF: If strtoul is not portable, then write a replacement.
+ * Instead we have an idiotic define in httpd.h that prevents
+ * it from being used even when it is available. Sheesh.
+ */
+ conf->limit_req_body = (unsigned long)strtol(arg, (char **)NULL, 10);
+ return NULL;
+}
+
/* Note --- ErrorDocument will now work from .htaccess files.
* The AllowOverride of Fileinfo allows webmasters to turn it off
*/
@@ -1942,51 +2413,91 @@
{ "<Directory", dirsection, NULL, RSRC_CONF, RAW_ARGS,
"Container for directives affecting resources located in the specified "
"directories" },
-{ end_directory_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS, "Marks end of <Directory>" },
-{ "<Location", urlsection, NULL, RSRC_CONF, RAW_ARGS, "Container for directives affecting resources accessed through the specified URL paths" },
-{ end_location_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS, "Marks end of <Location>" },
-{ "<VirtualHost", virtualhost_section, NULL, RSRC_CONF, RAW_ARGS, "Container to map directives to a particular virtual host, takes one or more host addresses" },
-{ end_virtualhost_section, end_nested_section, NULL, RSRC_CONF, NO_ARGS, "Marks end of <VirtualHost>" },
-{ "<Files", filesection, NULL, OR_ALL, RAW_ARGS, "Container for directives affecting files matching specified patterns" },
-{ end_files_section, end_nested_section, NULL, OR_ALL, NO_ARGS, "Marks end of <Files>" },
-{ "<Limit", ap_limit_section, NULL, OR_ALL, RAW_ARGS, "Container for authentication directives when accessed using specified HTTP methods" },
-{ "</Limit>", endlimit_section, NULL, OR_ALL, NO_ARGS, "Marks end of <Limit>" },
-{ "<IfModule", start_ifmod, NULL, OR_ALL, RAW_ARGS, "Container for directives based on existance of specified modules" },
-{ end_ifmodule_section, end_ifmod, NULL, OR_ALL, NO_ARGS, "Marks end of <IfModule>" },
-{ "<IfDefine", start_ifdefine, NULL, OR_ALL, RAW_ARGS, "Container for directives based on existance of command line defines" },
-{ end_ifdefine_section, end_ifdefine, NULL, OR_ALL, NO_ARGS, "Marks end of <IfDefine>" },
-{ "<DirectoryMatch", dirsection, (void*)1, RSRC_CONF, RAW_ARGS, "Container for directives affecting resources located in the specified directories" },
-{ end_directorymatch_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS, "Marks end of <DirectoryMatch>" },
-{ "<LocationMatch", urlsection, (void*)1, RSRC_CONF, RAW_ARGS, "Container for directives affecting resources accessed through the specified URL paths" },
-{ end_locationmatch_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS, "Marks end of <LocationMatch>" },
-{ "<FilesMatch", filesection, (void*)1, OR_ALL, RAW_ARGS, "Container for directives affecting files matching specified patterns" },
-{ end_filesmatch_section, end_nested_section, NULL, OR_ALL, NO_ARGS, "Marks end of <FilesMatch>" },
-{ "AuthType", ap_set_string_slot, (void*)XtOffsetOf(core_dir_config, ap_auth_type),
- OR_AUTHCFG, TAKE1, "An HTTP authorization type (e.g., \"Basic\")" },
+{ end_directory_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS,
+ "Marks end of <Directory>" },
+{ "<Location", urlsection, NULL, RSRC_CONF, RAW_ARGS,
+ "Container for directives affecting resources accessed through the "
+ "specified URL paths" },
+{ end_location_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS,
+ "Marks end of <Location>" },
+{ "<VirtualHost", virtualhost_section, NULL, RSRC_CONF, RAW_ARGS,
+ "Container to map directives to a particular virtual host, takes one or "
+ "more host addresses" },
+{ end_virtualhost_section, end_nested_section, NULL, RSRC_CONF, NO_ARGS,
+ "Marks end of <VirtualHost>" },
+{ "<Files", filesection, NULL, OR_ALL, RAW_ARGS, "Container for directives "
+ "affecting files matching specified patterns" },
+{ end_files_section, end_nested_section, NULL, OR_ALL, NO_ARGS,
+ "Marks end of <Files>" },
+{ "<Limit", ap_limit_section, NULL, OR_ALL, RAW_ARGS, "Container for "
+ "authentication directives when accessed using specified HTTP methods" },
+{ "</Limit>", endlimit_section, NULL, OR_ALL, NO_ARGS,
+ "Marks end of <Limit>" },
+{ "<IfModule", start_ifmod, NULL, OR_ALL, TAKE1,
+ "Container for directives based on existance of specified modules" },
+{ end_ifmodule_section, end_ifmod, NULL, OR_ALL, NO_ARGS,
+ "Marks end of <IfModule>" },
+{ "<IfDefine", start_ifdefine, NULL, OR_ALL, TAKE1,
+ "Container for directives based on existance of command line defines" },
+{ end_ifdefine_section, end_ifdefine, NULL, OR_ALL, NO_ARGS,
+ "Marks end of <IfDefine>" },
+{ "<DirectoryMatch", dirsection, (void*)1, RSRC_CONF, RAW_ARGS,
+ "Container for directives affecting resources located in the "
+ "specified directories" },
+{ end_directorymatch_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS,
+ "Marks end of <DirectoryMatch>" },
+{ "<LocationMatch", urlsection, (void*)1, RSRC_CONF, RAW_ARGS,
+ "Container for directives affecting resources accessed through the "
+ "specified URL paths" },
+{ end_locationmatch_section, end_nested_section, NULL, ACCESS_CONF, NO_ARGS,
+ "Marks end of <LocationMatch>" },
+{ "<FilesMatch", filesection, (void*)1, OR_ALL, RAW_ARGS,
+ "Container for directives affecting files matching specified patterns" },
+{ end_filesmatch_section, end_nested_section, NULL, OR_ALL, NO_ARGS,
+ "Marks end of <FilesMatch>" },
+{ "AuthType", ap_set_string_slot,
+ (void*)XtOffsetOf(core_dir_config, ap_auth_type), OR_AUTHCFG, TAKE1,
+ "An HTTP authorization type (e.g., \"Basic\")" },
{ "AuthName", set_authname, NULL, OR_AUTHCFG, TAKE1,
- "The authentication realm (e.g. \"Members Only\")" },
-{ "Require", require, NULL, OR_AUTHCFG, RAW_ARGS, "Selects which authenticated users or groups may access a protected space" },
+ "The authentication realm (e.g. \"Members Only\")" },
+{ "Require", require, NULL, OR_AUTHCFG, RAW_ARGS,
+ "Selects which authenticated users or groups may access a protected space" },
{ "Satisfy", satisfy, NULL, OR_AUTHCFG, TAKE1,
- "access policy if both allow and require used ('all' or 'any')" },
+ "access policy if both allow and require used ('all' or 'any')" },
+#ifdef GPROF
+{ "GprofDir", set_gprof_dir, NULL, RSRC_CONF, TAKE1,
+ "Directory to plop gmon.out files" },
+#endif
/* Old resource config file commands */
-{ "AccessFileName", set_access_name, NULL, RSRC_CONF, RAW_ARGS, "Name(s) of per-directory config files (default: .htaccess)" },
-{ "DocumentRoot", set_document_root, NULL, RSRC_CONF, TAKE1, "Root directory of the document tree" },
-{ "ErrorDocument", set_error_document, NULL, OR_FILEINFO, RAW_ARGS, "Change responses for HTTP errors" },
-{ "AllowOverride", set_override, NULL, ACCESS_CONF, RAW_ARGS, "Controls what groups of directives can be configured by per-directory config files" },
-{ "Options", set_options, NULL, OR_OPTIONS, RAW_ARGS, "Set a number of attributes for a given directory" },
+{ "AccessFileName", set_access_name, NULL, RSRC_CONF, RAW_ARGS,
+ "Name(s) of per-directory config files (default: .htaccess)" },
+{ "DocumentRoot", set_document_root, NULL, RSRC_CONF, TAKE1,
+ "Root directory of the document tree" },
+{ "ErrorDocument", set_error_document, NULL, OR_FILEINFO, RAW_ARGS,
+ "Change responses for HTTP errors" },
+{ "AllowOverride", set_override, NULL, ACCESS_CONF, RAW_ARGS,
+ "Controls what groups of directives can be configured by per-directory "
+ "config files" },
+{ "Options", set_options, NULL, OR_OPTIONS, RAW_ARGS,
+ "Set a number of attributes for a given directory" },
{ "DefaultType", ap_set_string_slot,
- (void*)XtOffsetOf (core_dir_config, ap_default_type),
- OR_FILEINFO, TAKE1, "the default MIME type for untypable files" },
+ (void*)XtOffsetOf (core_dir_config, ap_default_type),
+ OR_FILEINFO, TAKE1, "the default MIME type for untypable files" },
/* Old server config file commands */
-{ "ServerType", server_type, NULL, RSRC_CONF, TAKE1,"'inetd' or 'standalone'"},
+{ "ServerType", server_type, NULL, RSRC_CONF, TAKE1,
+ "'inetd' or 'standalone'"},
{ "Port", server_port, NULL, RSRC_CONF, TAKE1, "A TCP port number"},
-{ "HostnameLookups", set_hostname_lookups, NULL, ACCESS_CONF|RSRC_CONF, TAKE1, "\"on\" to enable, \"off\" to disable reverse DNS lookups, or \"double\" to enable double-reverse DNS lookups" },
-{ "User", set_user, NULL, RSRC_CONF, TAKE1, "Effective user id for this server"},
-{ "Group", set_group, NULL, RSRC_CONF, TAKE1, "Effective group id for this server"},
+{ "HostnameLookups", set_hostname_lookups, NULL, ACCESS_CONF|RSRC_CONF, TAKE1,
+ "\"on\" to enable, \"off\" to disable reverse DNS lookups, or \"double\" to "
+ "enable double-reverse DNS lookups" },
+{ "User", set_user, NULL, RSRC_CONF, TAKE1,
+ "Effective user id for this server"},
+{ "Group", set_group, NULL, RSRC_CONF, TAKE1,
+ "Effective group id for this server"},
{ "ServerAdmin", set_server_string_slot,
(void *)XtOffsetOf (server_rec, server_admin), RSRC_CONF, TAKE1,
"The email address of the server administrator" },
@@ -1995,7 +2506,8 @@
"The hostname of the server" },
{ "ServerSignature", set_signature_flag, NULL, ACCESS_CONF|RSRC_CONF, TAKE1,
"En-/disable server signature (on|off|email)" },
-{ "ServerRoot", set_server_root, NULL, RSRC_CONF, TAKE1, "Common directory of server-related files (logs, confs, etc)" },
+{ "ServerRoot", set_server_root, NULL, RSRC_CONF, TAKE1,
+ "Common directory of server-related files (logs, confs, etc.)" },
{ "ErrorLog", set_server_string_slot,
(void *)XtOffsetOf (server_rec, error_fname), RSRC_CONF, TAKE1,
"The filename of the error log" },
@@ -2015,66 +2527,100 @@
"A name or names alternately used to access the server" },
{ "ServerPath", set_serverpath, NULL, RSRC_CONF, TAKE1,
"The pathname the server can be reached at" },
-{ "Timeout", set_timeout, NULL, RSRC_CONF, TAKE1, "Timeout duration (sec)"},
-{ "KeepAliveTimeout", set_keep_alive_timeout, NULL, RSRC_CONF, TAKE1, "Keep-Alive timeout duration (sec)"},
-{ "MaxKeepAliveRequests", set_keep_alive_max, NULL, RSRC_CONF, TAKE1, "Maximum number of Keep-Alive requests per connection, or 0 for infinite" },
-{ "KeepAlive", set_keep_alive, NULL, RSRC_CONF, TAKE1, "Whether persistent connections should be On or Off" },
-{ "IdentityCheck", set_idcheck, NULL, RSRC_CONF|ACCESS_CONF, FLAG, "Enable identd (RFC 1413) user lookups - SLOW" },
-{ "ContentDigest", set_content_md5, NULL, RSRC_CONF|ACCESS_CONF|OR_AUTHCFG, FLAG, "whether or not to send a Content-MD5 header with each request" },
-{ "UseCanonicalName", set_use_canonical_name, NULL, RSRC_CONF|ACCESS_CONF|OR_AUTHCFG, FLAG, "whether or not to always use the canonical ServerName : Port when constructing URLs" },
-{ "StartServers", set_daemons_to_start, NULL, RSRC_CONF, TAKE1, "Number of child processes launched at server startup" },
-{ "MinSpareServers", set_min_free_servers, NULL, RSRC_CONF, TAKE1, "Minimum number of idle children, to handle request spikes" },
-{ "MaxSpareServers", set_max_free_servers, NULL, RSRC_CONF, TAKE1, "Maximum number of idle children" },
-{ "MaxServers", set_max_free_servers, NULL, RSRC_CONF, TAKE1, "Deprecated equivalent to MaxSpareServers" },
-{ "ServersSafetyLimit", set_server_limit, NULL, RSRC_CONF, TAKE1, "Deprecated equivalent to MaxClients" },
-{ "MaxClients", set_server_limit, NULL, RSRC_CONF, TAKE1, "Maximum number of children alive at the same time" },
+{ "Timeout", set_timeout, NULL, RSRC_CONF, TAKE1, "Timeout duration (sec)" },
+{ "KeepAliveTimeout", set_keep_alive_timeout, NULL, RSRC_CONF, TAKE1,
+ "Keep-Alive timeout duration (sec)"},
+{ "MaxKeepAliveRequests", set_keep_alive_max, NULL, RSRC_CONF, TAKE1,
+ "Maximum number of Keep-Alive requests per connection, or 0 for infinite" },
+{ "KeepAlive", set_keep_alive, NULL, RSRC_CONF, TAKE1,
+ "Whether persistent connections should be On or Off" },
+{ "IdentityCheck", set_idcheck, NULL, RSRC_CONF|ACCESS_CONF, FLAG,
+ "Enable identd (RFC 1413) user lookups - SLOW" },
+{ "ContentDigest", set_content_md5, NULL, RSRC_CONF|ACCESS_CONF|OR_AUTHCFG,
+ FLAG, "whether or not to send a Content-MD5 header with each request" },
+{ "UseCanonicalName", set_use_canonical_name, NULL,
+ RSRC_CONF|ACCESS_CONF|OR_AUTHCFG, FLAG,
+ "Whether or not to always use the canonical ServerName : Port when "
+ "constructing URLs" },
+{ "StartServers", set_daemons_to_start, NULL, RSRC_CONF, TAKE1,
+ "Number of child processes launched at server startup" },
+{ "MinSpareServers", set_min_free_servers, NULL, RSRC_CONF, TAKE1,
+ "Minimum number of idle children, to handle request spikes" },
+{ "MaxSpareServers", set_max_free_servers, NULL, RSRC_CONF, TAKE1,
+ "Maximum number of idle children" },
+{ "MaxServers", set_max_free_servers, NULL, RSRC_CONF, TAKE1,
+ "Deprecated equivalent to MaxSpareServers" },
+{ "ServersSafetyLimit", set_server_limit, NULL, RSRC_CONF, TAKE1,
+ "Deprecated equivalent to MaxClients" },
+{ "MaxClients", set_server_limit, NULL, RSRC_CONF, TAKE1,
+ "Maximum number of children alive at the same time" },
#if 0
/* XXX: document that this doesn't exist any longer */
-{ "MaxRequestsPerChild", set_max_requests, NULL, RSRC_CONF, TAKE1, "Maximum number of requests a particular child serves before dying." },
+{ "MaxRequestsPerChild", set_max_requests, NULL, RSRC_CONF, TAKE1,
+ "Maximum number of requests a particular child serves before dying." },
#endif
{ "RLimitCPU",
#ifdef RLIMIT_CPU
- set_limit_cpu, (void*)XtOffsetOf(core_dir_config, limit_cpu),
+ set_limit_cpu, (void*)XtOffsetOf(core_dir_config, limit_cpu),
#else
- no_set_limit, NULL,
+ no_set_limit, NULL,
#endif
- OR_ALL, TAKE12, "soft/hard limits for max CPU usage in seconds" },
+ OR_ALL, TAKE12, "Soft/hard limits for max CPU usage in seconds" },
{ "RLimitMEM",
#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined (RLIMIT_AS)
- set_limit_mem, (void*)XtOffsetOf(core_dir_config, limit_mem),
+ set_limit_mem, (void*)XtOffsetOf(core_dir_config, limit_mem),
#else
- no_set_limit, NULL,
+ no_set_limit, NULL,
#endif
- OR_ALL, TAKE12, "soft/hard limits for max memory usage per process" },
+ OR_ALL, TAKE12, "Soft/hard limits for max memory usage per process" },
{ "RLimitNPROC",
#ifdef RLIMIT_NPROC
- set_limit_nproc, (void*)XtOffsetOf(core_dir_config, limit_nproc),
+ set_limit_nproc, (void*)XtOffsetOf(core_dir_config, limit_nproc),
#else
- no_set_limit, NULL,
+ no_set_limit, NULL,
#endif
- OR_ALL, TAKE12, "soft/hard limits for max number of processes per uid" },
+ OR_ALL, TAKE12, "soft/hard limits for max number of processes per uid" },
{ "BindAddress", set_bind_address, NULL, RSRC_CONF, TAKE1,
"'*', a numeric IP address, or the name of a host with a unique IP address"},
{ "Listen", set_listener, NULL, RSRC_CONF, TAKE1,
- "a port number or a numeric IP address and a port number"},
-{ "SendBufferSize", set_send_buffer_size, NULL, RSRC_CONF, TAKE1, "send buffer size in bytes"},
+ "A port number or a numeric IP address and a port number"},
+{ "SendBufferSize", set_send_buffer_size, NULL, RSRC_CONF, TAKE1,
+ "Send buffer size in bytes"},
{ "AddModule", add_module_command, NULL, RSRC_CONF, ITERATE,
- "the name of a module" },
-{ "ClearModuleList", clear_module_list_command, NULL, RSRC_CONF, NO_ARGS, NULL },
-{ "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" },
-{ "Include", include_config, NULL, RSRC_CONF, TAKE1, "config file to be included" },
-{ "LogLevel", set_loglevel, NULL, RSRC_CONF, TAKE1, "set level of verbosity in error logging" },
+ "The name of a module" },
+{ "ClearModuleList", clear_module_list_command, NULL, RSRC_CONF, NO_ARGS,
+ NULL },
+{ "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" },
+{ "Include", include_config, NULL, (RSRC_CONF | ACCESS_CONF), TAKE1,
+ "Name of the config file to be included" },
+{ "LogLevel", set_loglevel, NULL, RSRC_CONF, TAKE1,
+ "Level of verbosity in error logging" },
{ "NameVirtualHost", ap_set_name_virtual_host, NULL, RSRC_CONF, TAKE1,
- "a numeric ip address:port, or the name of a host" },
+ "A numeric IP address:port, or the name of a host" },
#ifdef _OSD_POSIX
-{ "BS2000AuthFile", set_bs2000_authfile, NULL, RSRC_CONF, TAKE1,
- "server User's bs2000 logon password file (read-protected)" },
+{ "BS2000Account", set_bs2000_account, NULL, RSRC_CONF, TAKE1,
+ "Name of server User's bs2000 logon account name" },
#endif
{ "ServerTokens", set_serv_tokens, NULL, RSRC_CONF, TAKE1,
"Determine tokens displayed in the Server: header - Min(imal), OS or Full" },
+{ "LimitRequestLine", set_limit_req_line, NULL, RSRC_CONF, TAKE1,
+ "Limit on maximum size of an HTTP request line"},
+{ "LimitRequestFieldsize", set_limit_req_fieldsize, NULL, RSRC_CONF, TAKE1,
+ "Limit on maximum size of an HTTP request header field"},
+{ "LimitRequestFields", set_limit_req_fields, NULL, RSRC_CONF, TAKE1,
+ "Limit (0 = unlimited) on max number of header fields in a request message"},
+{ "LimitRequestBody", set_limit_req_body,
+ (void*)XtOffsetOf(core_dir_config, limit_req_body),
+ RSRC_CONF|ACCESS_CONF|OR_ALL, TAKE1,
+ "Limit (in bytes) on maximum size of request message body" },
{ NULL },
};
@@ -2083,32 +2629,37 @@
* Core handlers for various phases of server operation...
*/
-static int core_translate (request_rec *r)
+static int core_translate(request_rec *r)
{
void *sconf = r->server->module_config;
- core_server_config *conf = ap_get_module_config (sconf, &core_module);
+ core_server_config *conf = ap_get_module_config(sconf, &core_module);
- if (r->proxyreq) return HTTP_FORBIDDEN;
+ if (r->proxyreq) {
+ return HTTP_FORBIDDEN;
+ }
if ((r->uri[0] != '/') && strcmp(r->uri, "*")) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "Invalid URI in request %s", r->the_request);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "Invalid URI in request %s", r->the_request);
return BAD_REQUEST;
}
- if (r->server->path &&
- !strncmp(r->uri, r->server->path, r->server->pathlen) &&
- (r->server->path[r->server->pathlen - 1] == '/' ||
- r->uri[r->server->pathlen] == '/' ||
- r->uri[r->server->pathlen] == '\0'))
- r->filename = ap_pstrcat (r->pool, conf->ap_document_root,
- (r->uri + r->server->pathlen), NULL);
- else
- r->filename = ap_pstrcat (r->pool, conf->ap_document_root, r->uri, NULL);
+ if (r->server->path
+ && !strncmp(r->uri, r->server->path, r->server->pathlen)
+ && (r->server->path[r->server->pathlen - 1] == '/'
+ || r->uri[r->server->pathlen] == '/'
+ || r->uri[r->server->pathlen] == '\0')) {
+ r->filename = ap_pstrcat(r->pool, conf->ap_document_root,
+ (r->uri + r->server->pathlen), NULL);
+ }
+ else {
+ r->filename = ap_pstrcat(r->pool, conf->ap_document_root, r->uri,
+ NULL);
+ }
return OK;
}
-static int do_nothing (request_rec *r) { return OK; }
+static int do_nothing(request_rec *r) { return OK; }
/*
* Default handler for MIME types without other handlers. Only GET
@@ -2118,7 +2669,7 @@
* the last handler called and return 405 or 501.
*/
-static int default_handler (request_rec *r)
+static int default_handler(request_rec *r)
{
core_dir_config *d =
(core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
@@ -2134,32 +2685,38 @@
/* This handler has no use for a request body (yet), but we still
* need to read and discard it if the client sent one.
*/
- if ((errstatus = ap_discard_request_body(r)) != OK)
+ if ((errstatus = ap_discard_request_body(r)) != OK) {
return errstatus;
+ }
r->allowed |= (1 << M_GET) | (1 << M_OPTIONS);
if (r->method_number == M_INVALID) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid method in request %s", r->the_request);
return NOT_IMPLEMENTED;
}
- if (r->method_number == M_OPTIONS) return ap_send_http_options(r);
- if (r->method_number == M_PUT) return METHOD_NOT_ALLOWED;
-
+ if (r->method_number == M_OPTIONS) {
+ return ap_send_http_options(r);
+ }
+ if (r->method_number == M_PUT) {
+ return METHOD_NOT_ALLOWED;
+ }
if (r->file_exists == 0 || (r->path_info && *r->path_info)) {
ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r->server,
"File does not exist: %s", r->path_info ?
ap_pstrcat(r->pool, r->filename, r->path_info, NULL)
: r->filename);
- return NOT_FOUND;
+ return HTTP_NOT_FOUND;
+ }
+ if (r->method_number != M_GET) {
+ return METHOD_NOT_ALLOWED;
}
- if (r->method_number != M_GET) return METHOD_NOT_ALLOWED;
f = ap_popenfd(r->pool, r->filename, PR_RDONLY, 0);
if (f == NULL) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
- "file permissions deny server access: %s", r->filename);
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "file permissions deny server access: %s", r->filename);
return FORBIDDEN;
}
@@ -2225,23 +2782,23 @@
};
API_VAR_EXPORT module core_module = {
- STANDARD_MODULE_STUFF,
- NULL, /* initializer */
- create_core_dir_config, /* create per-directory config structure */
- merge_core_dir_configs, /* merge per-directory config structures */
- create_core_server_config, /* create per-server config structure */
- merge_core_server_configs, /* merge per-server config structures */
- core_cmds, /* command table */
- core_handlers, /* handlers */
- core_translate, /* translate_handler */
- NULL, /* check_user_id */
- NULL, /* check auth */
- do_nothing, /* check access */
- do_nothing, /* type_checker */
- NULL, /* pre-run fixups */
- NULL, /* logger */
- NULL, /* header parser */
- NULL, /* child_init */
- NULL, /* child_exit */
- NULL /* post_read_request */
+ STANDARD_MODULE_STUFF,
+ NULL, /* initializer */
+ create_core_dir_config, /* create per-directory config structure */
+ merge_core_dir_configs, /* merge per-directory config structures */
+ create_core_server_config, /* create per-server config structure */
+ merge_core_server_configs, /* merge per-server config structures */
+ core_cmds, /* command table */
+ core_handlers, /* handlers */
+ core_translate, /* translate_handler */
+ NULL, /* check_user_id */
+ NULL, /* check auth */
+ do_nothing, /* check access */
+ do_nothing, /* type_checker */
+ NULL, /* pre-run fixups */
+ NULL, /* logger */
+ NULL, /* header parser */
+ NULL, /* child_init */
+ NULL, /* child_exit */
+ NULL /* post_read_request */
};
1.3 +37 -20 apache-2.0/apache-nspr/main/http_log.c
Index: http_log.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/http_log.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_log.c 1998/06/30 08:57:07 1.2
+++ http_log.c 1998/09/22 18:05:18 1.3
@@ -173,7 +173,7 @@
#if defined(WIN32)
child_pid = spawnl (_P_NOWAIT, SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
return(child_pid);
-#elif defined(__EMX__)
+#elif defined(OS2)
/* For OS/2 we need to use a '/' */
execl (SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
#else
@@ -290,10 +290,10 @@
#endif
}
-API_EXPORT(void) ap_log_error (const char *file, int line, int level,
- const server_rec *s, const char *fmt, ...)
+static void log_error_core (const char *file, int line, int level,
+ const server_rec *s, const request_rec *r,
+ const char *fmt, va_list args)
{
- va_list args;
char errstr[MAX_STRING_LEN];
size_t len;
PRErrorCode save_errno = PR_GetError();
@@ -366,6 +366,15 @@
len += ap_snprintf(errstr + len, sizeof(errstr) - len,
"%s(%d): ", file, line);
}
+ if (r) {
+ /* XXX: TODO: add a method of selecting whether logged client
+ * addresses are in dotted quad or resolved form... dotted
+ * quad is the most secure, which is why I'm implementing it
+ * first. -djg
+ */
+ len += ap_snprintf(errstr + len, sizeof(errstr) - len,
+ "[client %s] ", r->connection->remote_ip);
+ }
if (!(level & APLOG_NOERRNO)
&& (save_errno != 0)
#ifdef WIN32
@@ -427,9 +436,7 @@
}
#endif
- va_start(args, fmt);
len += ap_vsnprintf(errstr + len, sizeof(errstr) - len, fmt, args);
- va_end(args);
/* NULL if we are logging to syslog */
if (logf) {
@@ -448,24 +455,34 @@
#endif
}
+API_EXPORT(void) ap_log_error (const char *file, int line, int level,
+ const server_rec *s, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ log_error_core(file, line, level, s, NULL, fmt, args);
+ va_end(args);
+}
+
+API_EXPORT(void) ap_log_rerror(const char *file, int line, int level,
+ const request_rec *r, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ log_error_core(file, line, level, r->server, r, fmt, args);
+ if (ap_table_get(r->notes, "error-notes") == NULL) {
+ ap_table_setn(r->notes, "error-notes",
+ ap_pvsprintf(r->pool, fmt, args));
+ }
+ va_end(args);
+}
void ap_log_pid (pool *p, char *fname)
{
/* XXX: need to log pids for NSPR */
return;
-#if 0
- BUFF *pid_file;
-
- if (!fname) return;
- fname = ap_server_root_relative (p, fname);
- if (!(pid_file = ap_bopenf(p, fname, PR_WRONLY, 0666))) {
- /* XXX: need to give error code still, and stop using fprintf */
- PR_fprintf(PR_STDERR,"httpd: could not log pid to file %s\n", fname);
- exit(1);
- }
- ap_bprintf(pid_file, "%ld\n", (long)getpid());
- ap_bclose(pid_file);
-#endif
}
API_EXPORT(void) ap_log_assert (const char *szExp, const char *szFile, int nLine)
@@ -627,7 +644,7 @@
#if defined(WIN32)
child_pid = spawnl (_P_NOWAIT, SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
return(child_pid);
-#elif defined(__EMX__)
+#elif defined(OS2)
/* For OS/2 we need to use a '/' */
execl (SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
#else
1.4 +81 -45 apache-2.0/apache-nspr/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/http_main.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- http_main.c 1998/09/22 16:12:06 1.3
+++ http_main.c 1998/09/22 18:05:18 1.4
@@ -160,6 +160,7 @@
int ap_suexec_enabled = 0;
int ap_listenbacklog;
int ap_dump_settings;
+API_VAR_EXPORT int ap_extended_status = 0;
/*
* The max child slot ever assigned, preserved across restarts. Necessary
@@ -282,7 +283,7 @@
server_version = NULL;
}
-API_EXPORT(const char *) ap_get_server_version()
+API_EXPORT(const char *) ap_get_server_version(void)
{
return (server_version ? server_version : SERVER_BASEVERSION);
}
@@ -315,7 +316,7 @@
* This routine adds the real server base identity to the version string,
* and then locks out changes until the next reconfig.
*/
-static void ap_set_version()
+static void ap_set_version(void)
{
if (ap_server_tokens == SrvTk_MIN) {
ap_add_version_component(SERVER_BASEVERSION);
@@ -332,9 +333,9 @@
}
}
-
/* a clean exit from a child with proper cleanup */
-static void __attribute__((noreturn)) clean_child_exit(int code)
+static void clean_child_exit(int code) __attribute__ ((noreturn));
+static void clean_child_exit(int code)
{
if (tls()->pchild) {
ap_child_exit_modules(tls()->pchild, server_conf);
@@ -362,6 +363,7 @@
#ifdef SHARED_CORE
PR_fprintf(PR_STDERR, " -L directory : specify an alternate location for shared object files\n");
#endif
+ PR_fprintf(PR_STDERR, " -D name : define a name for use in <IfDefine name> directives\n");
PR_fprintf(PR_STDERR, " -d directory : specify an alternate initial ServerRoot\n");
PR_fprintf(PR_STDERR, " -f file : specify an alternate ServerConfigFile\n");
PR_fprintf(PR_STDERR, " -C \"directive\" : process directive before reading config files\n");
@@ -393,7 +395,7 @@
*
* Many operating systems tend to block, puke, or otherwise mishandle
* calls to shutdown only half of the connection. You should define
- * NO_LINGCLOSE in conf.h if such is the case for your system.
+ * NO_LINGCLOSE in ap_config.h if such is the case for your system.
*/
#ifndef MAX_SECS_TO_LINGER
#define MAX_SECS_TO_LINGER 30
@@ -626,7 +628,8 @@
}
/* a clean exit from the parent with proper cleanup */
-static void __attribute__((noreturn)) clean_parent_exit(int code)
+static void clean_parent_exit(int code) __attribute__((noreturn));
+static void clean_parent_exit(int code)
{
/* Clear the pool - including any registered cleanups */
ap_destroy_pool(pconf);
@@ -645,41 +648,40 @@
old_status = ss->status;
ss->status = status;
-#if defined(STATUS)
- if (status == SERVER_READY || status == SERVER_DEAD) {
- /*
- * Reset individual counters
- */
- if (status == SERVER_DEAD) {
- ss->my_access_count = 0L;
- ss->my_bytes_served = 0L;
+ if (ap_extended_server_status) {
+ if (status == SERVER_READY || status == SERVER_DEAD) {
+ /*
+ * Reset individual counters
+ */
+ if (status == SERVER_DEAD) {
+ ss->my_access_count = 0L;
+ ss->my_bytes_served = 0L;
+ }
+ ss->conn_count = (unsigned short) 0;
+ ss->conn_bytes = (unsigned long) 0;
}
- ss->conn_count = (unsigned short) 0;
- ss->conn_bytes = (unsigned long) 0;
- }
- if (r) {
- conn_rec *c = r->connection;
- ap_cpystrn(ss->client, ap_get_remote_host(c, r->per_dir_config,
- REMOTE_NOLOOKUP), sizeof(ss->client));
- if (r->the_request == NULL) {
- ap_cpystrn(ss->request, "NULL", sizeof(ss->request));
- } else if (r->parsed_uri.password == NULL) {
- ap_cpystrn(ss->request, r->the_request, sizeof(ss->request));
- } else {
- /* Don't reveal the password in the server-status view */
- ap_cpystrn(ss->request, ap_pstrcat(r->pool, r->method, " ",
- ap_unparse_uri_components(r->pool, &r->parsed_uri, UNP_OMITPASSWORD),
- r->assbackwards ? NULL : " ", r->protocol, NULL),
- sizeof(ss->request));
+ if (r) {
+ conn_rec *c = r->connection;
+ ap_cpystrn(ss->client, ap_get_remote_host(c, r->per_dir_config,
+ REMOTE_NOLOOKUP), sizeof(ss->client));
+ if (r->the_request == NULL) {
+ ap_cpystrn(ss->request, "NULL", sizeof(ss->request));
+ } else if (r->parsed_uri.password == NULL) {
+ ap_cpystrn(ss->request, r->the_request, sizeof(ss->request));
+ } else {
+ /* Don't reveal the password in the server-status view */
+ ap_cpystrn(ss->request, ap_pstrcat(r->pool, r->method, " ",
+ ap_unparse_uri_components(r->pool, &r->parsed_uri, UNP_OMITPASSWORD),
+ r->assbackwards ? NULL : " ", r->protocol, NULL),
+ sizeof(ss->request));
+ }
+ ap_cpystrn(ss->vhost, r->server->server_hostname, sizeof(ss->vhost));
}
- ap_cpystrn(ss->vhost, r->server->server_hostname, sizeof(ss->vhost));
}
-#endif
return old_status;
}
-#if defined(STATUS)
void ap_time_process_request(int child_num, int status)
{
short_score *ss;
@@ -715,8 +717,6 @@
ss->conn_bytes += (unsigned long) bs;
}
-#endif
-
static int find_child_by_tid(PRThread *tid)
{
@@ -1073,7 +1073,8 @@
{
printf("Server version: %s\n", ap_get_server_version());
printf("Server built: %s\n", ap_get_server_built());
- printf("Server's Module Magic Number: %u\n", MODULE_MAGIC_NUMBER);
+ printf("Server's Module Magic Number: %u:%u\n",
+ MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
printf("Server compiled with....\n");
#ifdef BIG_SECURITY_HOLE
printf(" -D BIG_SECURITY_HOLE\n");
@@ -1081,9 +1082,6 @@
#ifdef SECURITY_HOLE_PASS_AUTHORIZATION
printf(" -D SECURITY_HOLE_PASS_AUTHORIZATION\n");
#endif
-#ifdef HTTPD_ROOT
- printf(" -D HTTPD_ROOT=\"" HTTPD_ROOT "\"\n");
-#endif
#ifdef HAVE_MMAP
printf(" -D HAVE_MMAP\n");
#endif
@@ -1138,6 +1136,44 @@
#ifdef SHARED_CORE
printf(" -D SHARED_CORE\n");
#endif
+
+/* This list displays the compiled-in default paths: */
+#ifdef HTTPD_ROOT
+ printf(" -D HTTPD_ROOT=\"" HTTPD_ROOT "\"\n");
+#endif
+#ifdef SUEXEC_BIN
+ printf(" -D SUEXEC_BIN=\"" SUEXEC_BIN "\"\n");
+#endif
+#ifdef SHARED_CORE_DIR
+ printf(" -D SHARED_CORE_DIR=\"" SHARED_CORE_DIR "\"\n");
+#endif
+#ifdef DEFAULT_PIDLOG
+ printf(" -D DEFAULT_PIDLOG=\"" DEFAULT_PIDLOG "\"\n");
+#endif
+#ifdef DEFAULT_SCOREBOARD
+ printf(" -D DEFAULT_SCOREBOARD=\"" DEFAULT_SCOREBOARD "\"\n");
+#endif
+#ifdef DEFAULT_LOCKFILE
+ printf(" -D DEFAULT_LOCKFILE=\"" DEFAULT_LOCKFILE "\"\n");
+#endif
+#ifdef DEFAULT_XFERLOG
+ printf(" -D DEFAULT_XFERLOG=\"" DEFAULT_XFERLOG "\"\n");
+#endif
+#ifdef DEFAULT_ERRORLOG
+ printf(" -D DEFAULT_ERRORLOG=\"" DEFAULT_ERRORLOG "\"\n");
+#endif
+#ifdef TYPES_CONFIG_FILE
+ printf(" -D TYPES_CONFIG_FILE=\"" TYPES_CONFIG_FILE "\"\n");
+#endif
+#ifdef SERVER_CONFIG_FILE
+ printf(" -D SERVER_CONFIG_FILE=\"" SERVER_CONFIG_FILE "\"\n");
+#endif
+#ifdef ACCESS_CONFIG_FILE
+ printf(" -D ACCESS_CONFIG_FILE=\"" ACCESS_CONFIG_FILE "\"\n");
+#endif
+#ifdef RESOURCE_CONFIG_FILE
+ printf(" -D RESOURCE_CONFIG_FILE=\"" RESOURCE_CONFIG_FILE "\"\n");
+#endif
}
@@ -1270,11 +1306,11 @@
while ((r = ap_read_request(current_conn)) != NULL) {
(void) ap_update_child_status(my_child_num, SERVER_BUSY_WRITE, r);
DPRINTF((PR_STDERR,"%d child_main: about to process request\n",my_child_num));
- ap_process_request(r);
+ if (r->status == HTTP_OK)
+ ap_process_request(r);
DPRINTF((PR_STDERR,"%d child_main: request done\n",my_child_num));
-#if defined(STATUS)
- increment_counts(my_child_num, r);
-#endif
+ if (ap_extended_status)
+ increment_counts(my_child_num, r);
if (!current_conn->keepalive || ap_is_aborted(current_conn))
break;
ap_destroy_pool(r->pool);
@@ -1892,7 +1928,7 @@
}
}
-#ifdef __EMX__
+#ifdef OS2
printf("%s \n", ap_get_server_version());
#endif
1.3 +147 -114 apache-2.0/apache-nspr/main/http_protocol.c
Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/http_protocol.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_protocol.c 1998/06/30 08:57:07 1.2
+++ http_protocol.c 1998/09/22 18:05:18 1.3
@@ -304,7 +304,8 @@
ap_find_last_token(r->pool,
ap_table_get(r->headers_out, "Transfer-Encoding"),
"chunked") ||
- ((r->proto_num >= HTTP_VERSION(1,1)) && (r->chunked = 1))) &&
+ ((r->proto_num >= HTTP_VERSION(1,1)) &&
+ (r->chunked = 1))) && /* THIS CODE IS CORRECT, see comment above. */
r->server->keep_alive &&
(r->server->keep_alive_timeout_interval != PR_INTERVAL_NO_WAIT) &&
((r->server->keep_alive_max == 0) ||
@@ -397,7 +398,7 @@
* complicated.
*/
- if (!is_HTTP_SUCCESS(r->status) || r->no_local_copy) {
+ if (!ap_is_HTTP_SUCCESS(r->status) || r->no_local_copy) {
return OK;
}
@@ -601,7 +602,7 @@
status = ap_parse_uri_components(r->pool, uri, &r->parsed_uri);
}
- if (is_HTTP_SUCCESS(status)) {
+ if (ap_is_HTTP_SUCCESS(status)) {
/* if it has a scheme we may need to do absoluteURI vhost stuff */
if (r->parsed_uri.scheme
&& !strcasecmp(r->parsed_uri.scheme, ap_http_method(r))) {
@@ -612,7 +613,7 @@
r->args = r->parsed_uri.query;
r->uri = r->parsed_uri.path ? r->parsed_uri.path
: ap_pstrdup(r->pool, "/");
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
/* Handle path translations for OS/2 and plug security hole.
* This will prevent "http://www.wherever.com/..\..\/" from
* returning a directory for the root drive.
@@ -627,7 +628,7 @@
ap_str_tolower(r->uri);
#endif
}
-#endif /* __EMX__ || WIN32 */
+#endif /* OS2 || WIN32 */
}
else {
r->args = NULL;
@@ -639,8 +640,9 @@
static int read_request_line(request_rec *r)
{
- char l[HUGE_STRING_LEN];
- const char *ll = l, *uri;
+ char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* getline's two extra for \n\0 */
+ const char *ll = l;
+ const char *uri;
conn_rec *conn = r->connection;
int major = 1, minor = 0; /* Assume HTTP/1.0 if non-"HTTP" protocol */
int len;
@@ -660,25 +662,13 @@
* have to block during a read.
*/
ap_bsetflag(conn->client, B_SAFEREAD, 1);
- while ((len = getline(l, sizeof(l), conn->client, 0)) == 0) {
- /* ignore empty line */
+ while ((len = getline(l, sizeof(l), conn->client, 0)) <= 0) {
+ if ((len < 0) || ap_bgetflag(conn->client, B_EOF)) {
+ ap_bsetflag(conn->client, B_SAFEREAD, 0);
+ return 0;
+ }
}
ap_bsetflag(conn->client, B_SAFEREAD, 0);
- if (len < 0) {
- return 0;
- }
- r->request_time = PR_Now();
- if (len == (sizeof(l) - 1)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "request failed for %s, reason: URI too long",
- ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME));
- /* hack to deal with the HTTP_REQUEST_TIME_OUT setting up above: */
- if (r->status == HTTP_REQUEST_TIME_OUT) {
- r->status = HTTP_OK;
- }
- ap_die (HTTP_REQUEST_URI_TOO_LARGE, r);
- return 0;
- }
r->the_request = ap_pstrdup(r->pool, l);
r->method = ap_getword_white(r->pool, &ll);
@@ -708,8 +698,20 @@
ap_parse_uri(r, uri);
+ /* getline returns (size of max buffer - 1) if it fills up the
+ * buffer before finding the end-of-line. This is only going to
+ * happen if it exceeds the configured limit for a request-line.
+ */
+ if (len > r->server->limit_req_line) {
+ r->status = HTTP_REQUEST_URI_TOO_LARGE;
+ r->proto_num = HTTP_VERSION(1,0);
+ r->protocol = ap_pstrdup(r->pool, "HTTP/1.0");
+ return 0;
+ }
+
r->assbackwards = (ll[0] == '\0');
r->protocol = ap_pstrdup(r->pool, ll[0] ? ll : "HTTP/0.9");
+
if (2 == sscanf(r->protocol, "HTTP/%u.%u", &major, &minor)
&& minor < HTTP_VERSION(1,0)) /* don't allow HTTP/0.1000 */
r->proto_num = HTTP_VERSION(major, minor);
@@ -719,56 +721,66 @@
return 1;
}
-/* -1 on error, 0 on success */
-static int get_mime_headers(request_rec *r)
+static void get_mime_headers(request_rec *r)
{
+ char field[DEFAULT_LIMIT_REQUEST_FIELDSIZE + 2]; /* getline's two extra */
conn_rec *c = r->connection;
- int len;
char *value;
- char field[MAX_STRING_LEN];
+ char *copy;
+ int len;
+ unsigned int fields_read = 0;
+ table *tmp_headers;
+ /* We'll use ap_overlap_tables later to merge these into r->headers_in. */
+ tmp_headers = ap_make_table(r->pool, 50);
+
/*
* Read header lines until we get the empty separator line, a read error,
- * the connection closes (EOF), or we timeout.
+ * the connection closes (EOF), reach the server limit, or we timeout.
*/
while ((len = getline(field, sizeof(field), c->client, 1)) > 0) {
- char *copy = ap_palloc(r->pool, len + 1);
+
+ if (r->server->limit_req_fields &&
+ (++fields_read > r->server->limit_req_fields)) {
+ r->status = HTTP_BAD_REQUEST;
+ ap_table_setn(r->notes, "error-notes",
+ "The number of request header fields exceeds "
+ "this server's limit.<P>\n");
+ return;
+ }
+ /* getline returns (size of max buffer - 1) if it fills up the
+ * buffer before finding the end-of-line. This is only going to
+ * happen if it exceeds the configured limit for a field size.
+ */
+ if (len > r->server->limit_req_fieldsize) {
+ r->status = HTTP_BAD_REQUEST;
+ ap_table_setn(r->notes, "error-notes", ap_pstrcat(r->pool,
+ "Size of a request header field exceeds server limit.<P>\n"
+ "<PRE>\n", field, "</PRE>\n", NULL));
+ return;
+ }
+ copy = ap_palloc(r->pool, len + 1);
memcpy(copy, field, len + 1);
-
- if (!(value = strchr(copy, ':'))) { /* Find the colon separator */
- /* if there's none, this request is screwed up.
- * a hack to deal with how we set HTTP_REQUEST_TIME_OUT earlier.*/
- if (r->status == HTTP_REQUEST_TIME_OUT)
- r->status = HTTP_OK;
-
- ap_die (HTTP_BAD_REQUEST, r);
- /* XXX: should this be -1? need to look at better way to return error */
- return 0;
- }
+
+ if (!(value = strchr(copy, ':'))) { /* Find the colon separator */
+ r->status = HTTP_BAD_REQUEST; /* or abort the bad request */
+ ap_table_setn(r->notes, "error-notes", ap_pstrcat(r->pool,
+ "Request header field is missing colon separator.<P>\n"
+ "<PRE>\n", copy, "</PRE>\n", NULL));
+ return;
+ }
*value = '\0';
++value;
- /* XXX: RFC2068 defines only SP and HT as whitespace, this test is
- * wrong... and so are many others probably.
- */
- while (isspace(*value))
+ while (*value == ' ' || *value == '\t')
++value; /* Skip to start of value */
- /* XXX: should strip trailing whitespace as well */
+ /* XXX: should strip trailing whitespace as well */
- ap_table_mergen(r->headers_in, copy, value);
-
- /* the header was too long; at the least we should skip extra data */
- if (len >= sizeof(field) - 1) {
- while ((len = getline(field, sizeof(field), c->client, 1))
- >= sizeof(field) - 1) {
- /* soak up the extra data */
- }
- if (len == 0) /* time to exit the larger loop as well */
- break;
- }
+ ap_table_addn(tmp_headers, copy, value);
}
- return ap_is_aborted(c) ? -1 : 0;
+
+ ap_overlap_tables(r->headers_in, tmp_headers, AP_OVERLAP_TABLES_MERGE);
}
@@ -839,22 +851,28 @@
r->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */
r->the_request = NULL;
+#ifdef CHARSET_EBCDIC
+ ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1);
+#endif
+
/* Get the request... */
ap_bonerror(conn->client, client_bonerror_handler, conn);
-#ifdef CHARSET_EBCDIC
- ap_bsetflag(conn->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1);
-#endif /* CHARSET_EBCDIC */
conn->timeout_name = "read request line";
ap_bsetopt(conn->client, BO_TIMEOUT,
conn->keptalive
? &r->server->keep_alive_timeout_interval
: &r->server->timeout_interval);
if (!read_request_line(r)) {
- if (r->status != HTTP_REQUEST_TIME_OUT) {
- /* we must have had an error.*/
- ap_log_transaction(r);
- }
+ if (r->status == HTTP_REQUEST_URI_TOO_LARGE) {
+
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "request failed: URI too long");
+ ap_send_error_response(r, 0);
+ ap_bflush(r->connection->client);
+ ap_log_transaction(r);
+ return r;
+ }
return NULL;
}
if (r->connection->keptalive) {
@@ -863,17 +881,17 @@
}
conn->timeout_name = "read request headers";
if (!r->assbackwards) {
- if (get_mime_headers(r)) {
- return NULL;
- }
- if (r->status != HTTP_REQUEST_TIME_OUT) {/* we must have had an error.*/
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "request failed for %s: error reading the headers",
- ap_get_remote_host(r->connection, r->per_dir_config,
- REMOTE_NAME));
- ap_log_transaction(r);
- return NULL;
- }
+ ap_hard_timeout("read request headers", r);
+ get_mime_headers(r);
+ ap_kill_timeout(r);
+ if (r->status != HTTP_REQUEST_TIME_OUT) {
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "request failed: error reading the headers");
+ ap_send_error_response(r, 0);
+ ap_bflush(r->connection->client);
+ ap_log_transaction(r);
+ return r;
+ }
}
r->status = HTTP_OK; /* Until further notice. */
@@ -891,7 +909,7 @@
conn->timeout_name = "request processing";
if ((access_status = ap_run_post_read_request(r))) {
ap_die(access_status, r);
- ap_log_transaction(r);
+ ap_log_transaction(r);
return NULL;
}
@@ -970,19 +988,19 @@
ap_pstrdup(r->pool, nonce));
}
-API_EXPORT(int) ap_get_basic_auth_pw(request_rec *r, char **pw)
+API_EXPORT(int) ap_get_basic_auth_pw(request_rec *r, const char **pw)
{
const char *auth_line = ap_table_get(r->headers_in,
r->proxyreq ? "Proxy-Authorization"
: "Authorization");
- char *t;
+ const char *t;
if (!(t = ap_auth_type(r)) || strcasecmp(t, "Basic"))
return DECLINED;
if (!ap_auth_name(r)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
- r->server, "need AuthName: %s", r->uri);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
+ r, "need AuthName: %s", r->uri);
return SERVER_ERROR;
}
@@ -993,7 +1011,7 @@
if (strcasecmp(ap_getword(r->pool, &auth_line, ' '), "Basic")) {
/* Client tried to authenticate using wrong auth scheme */
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"client used wrong authentication scheme: %s", r->uri);
ap_note_basic_auth_failure(r);
return AUTH_REQUIRED;
@@ -1004,7 +1022,7 @@
* because it has the lifetime of the connection. The other allocations
* are temporary and can be tossed away any time.
*/
- r->connection->user = ap_getword_nulls_nc (r->connection->pool, &t, ':');
+ r->connection->user = ap_getword_nulls (r->connection->pool, &t, ':');
r->connection->ap_auth_type = "Basic";
*pw = t;
@@ -1107,7 +1125,7 @@
{
char *protocol;
#ifdef CHARSET_EBCDIC
- int convert = bgetflag(r->connection->client, B_EBCDIC2ASCII);
+ int convert = ap_bgetflag(r->connection->client, B_EBCDIC2ASCII);
#endif /*CHARSET_EBCDIC*/
if (r->assbackwards)
@@ -1192,7 +1210,7 @@
NULL);
}
-int ap_send_http_trace(request_rec *r)
+API_EXPORT(int) ap_send_http_trace(request_rec *r)
{
int rv;
@@ -1260,7 +1278,7 @@
int i;
const PRUint32 zero = 0L;
#ifdef CHARSET_EBCDIC
- int convert = bgetflag(r->connection->client, B_EBCDIC2ASCII);
+ int convert = ap_bgetflag(r->connection->client, B_EBCDIC2ASCII);
#endif /*CHARSET_EBCDIC*/
if (r->assbackwards) {
@@ -1345,7 +1363,7 @@
* information for any wrappers around the response message body
* (i.e., transfer encodings). It should have been named finalize_response.
*/
-void ap_finalize_request_protocol(request_rec *r)
+API_EXPORT(void) ap_finalize_request_protocol(request_rec *r)
{
if (r->chunked && !ap_is_aborted(r->connection)) {
/*
@@ -1403,6 +1421,7 @@
{
const char *tenc = ap_table_get(r->headers_in, "Transfer-Encoding");
const char *lenp = ap_table_get(r->headers_in, "Content-Length");
+ unsigned long max_body;
r->read_body = read_policy;
r->read_chunked = 0;
@@ -1410,12 +1429,12 @@
if (tenc) {
if (strcasecmp(tenc, "chunked")) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Unknown Transfer-Encoding %s", tenc);
return HTTP_NOT_IMPLEMENTED;
}
if (r->read_body == REQUEST_CHUNKED_ERROR) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"chunked Transfer-Encoding forbidden: %s", r->uri);
return (lenp) ? HTTP_BAD_REQUEST : HTTP_LENGTH_REQUIRED;
}
@@ -1425,10 +1444,10 @@
else if (lenp) {
const char *pos = lenp;
- while (isdigit(*pos) || isspace(*pos))
+ while (ap_isdigit(*pos) || ap_isspace(*pos))
++pos;
if (*pos != '\0') {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid Content-Length %s", lenp);
return HTTP_BAD_REQUEST;
}
@@ -1438,11 +1457,19 @@
if ((r->read_body == REQUEST_NO_BODY) &&
(r->read_chunked || (r->remaining > 0))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"%s with body is not allowed for %s", r->method, r->uri);
return HTTP_REQUEST_ENTITY_TOO_LARGE;
}
+ max_body = ap_get_limit_req_body(r);
+ if (max_body && (r->remaining > max_body)) {
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "Request content-length of %s is larger than the configured "
+ "limit of %lu", lenp, max_body);
+ return HTTP_REQUEST_ENTITY_TOO_LARGE;
+ }
+
return OK;
}
@@ -1503,6 +1530,7 @@
int c;
long len_read, len_to_read;
long chunk_start = 0;
+ unsigned long max_body;
if (!r->read_chunked) { /* Content-length read */
len_to_read = (r->remaining > bufsiz) ? bufsiz : r->remaining;
@@ -1527,6 +1555,20 @@
if (bufsiz <= 0)
return -1; /* Cannot read chunked with a small buffer */
+ /* Check to see if we have already read too much request data.
+ * For efficiency reasons, we only check this at the top of each
+ * caller read pass, since the limit exists just to stop infinite
+ * length requests and nobody cares if it goes over by one buffer.
+ */
+ max_body = ap_get_limit_req_body(r);
+ if (max_body && (r->read_length > max_body)) {
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "Chunked request body is larger than the configured limit of %lu",
+ max_body);
+ r->connection->keepalive = -1;
+ return -1;
+ }
+
if (r->remaining == 0) { /* Start of new chunk */
chunk_start = getline(buffer, bufsiz, r->connection->client, 0);
@@ -1642,7 +1684,7 @@
* Since we return an error status if the request is malformed, this
* routine should be called at the beginning of a no-body handler, e.g.,
*
- * if ((retval = discard_request_body(r)) != OK)
+ * if ((retval = ap_discard_request_body(r)) != OK)
* return retval;
*/
API_EXPORT(int) ap_discard_request_body(request_rec *r)
@@ -1711,11 +1753,8 @@
continue;
#endif
else {
- ap_log_error(APLOG_MARK, APLOG_INFO, r->server,
- "%s client stopped connection before send body completed",
- ap_get_remote_host(r->connection,
- r->per_dir_config,
- REMOTE_NAME));
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, r,
+ "client stopped connection before send body completed");
ap_bsetflag(r->connection->client, B_EOUT, 1);
break;
}
@@ -1799,11 +1838,8 @@
continue;
#endif
else {
- ap_log_error(APLOG_MARK, APLOG_INFO, r->server,
- "%s client stopped connection before send body completed",
- ap_get_remote_host(r->connection,
- r->per_dir_config,
- REMOTE_NAME));
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, r,
+ "client stopped connection before send body completed");
ap_bsetflag(r->connection->client, B_EOUT, 1);
break;
}
@@ -1865,11 +1901,8 @@
continue;
#endif
else {
- ap_log_error(APLOG_MARK, APLOG_INFO, r->server,
- "%s client stopped connection before send mmap completed",
- ap_get_remote_host(r->connection,
- r->per_dir_config,
- REMOTE_NAME));
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, r,
+ "client stopped connection before send mmap completed");
ap_bsetflag(r->connection->client, B_EOUT, 1);
break;
}
@@ -2021,7 +2054,7 @@
ap_clear_table(r->err_headers_out);
if (location && *location
- && (is_HTTP_REDIRECT(status) || status == HTTP_CREATED))
+ && (ap_is_HTTP_REDIRECT(status) || status == HTTP_CREATED))
ap_table_setn(r->headers_out, "Location", location);
r->content_language = NULL;
@@ -2075,11 +2108,11 @@
*/
if (r->status_line != NULL
&& strlen(r->status_line) > 4 /* long enough */
- && isdigit(r->status_line[0])
- && isdigit(r->status_line[1])
- && isdigit(r->status_line[2])
- && isspace(r->status_line[3])
- && isalnum(r->status_line[4])) {
+ && ap_isdigit(r->status_line[0])
+ && ap_isdigit(r->status_line[1])
+ && ap_isdigit(r->status_line[2])
+ && ap_isspace(r->status_line[3])
+ && ap_isalnum(r->status_line[4])) {
title = r->status_line;
}
1.3 +20 -25 apache-2.0/apache-nspr/main/http_request.c
Index: http_request.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/http_request.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- http_request.c 1998/06/30 08:57:08 1.2
+++ http_request.c 1998/09/22 18:05:18 1.3
@@ -71,6 +71,7 @@
#include "http_request.h"
#include "http_core.h"
#include "http_protocol.h"
+#include "http_conf_globals.h" /* for ap_extended_status */
#include "http_log.h"
#include "http_main.h"
#include "scoreboard.h"
@@ -104,7 +105,7 @@
|| r->finfo.type == PR_FILE_DIRECTORY) {
return OK;
}
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"object is not a file, directory or symlink: %s",
r->filename);
return HTTP_FORBIDDEN;
@@ -114,7 +115,7 @@
static int check_symlinks(char *d, int opts)
{
/* XXX: figure out how to do symlink stuff on NSPR */
-#if 1 /* defined(__EMX__) || defined(WIN32) */
+#if 1 /* defined(OS2) || defined(WIN32) */
/* OS/2 doesn't have symlinks */
return OK;
#else
@@ -248,12 +249,10 @@
--cp;
}
else {
- /* XXX: this is bogus, the error code is trashed by the ap_get_remote_host call */
- if (ec != PR_NO_ACCESS_RIGHTS_ERROR)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
- "access to %s failed for %s", r->uri,
- ap_get_remote_host(r->connection, r->per_dir_config,
- REMOTE_NOLOOKUP));
+ if (ec != PR_NO_ACCESS_RIGHTS_ERROR) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "access to %s failed", r->uri);
+ }
return HTTP_FORBIDDEN;
}
}
@@ -386,7 +385,7 @@
*/
if ((res = check_symlinks(test_dirname, core_dir->opts))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Symbolic link not allowed: %s", test_dirname);
return res;
}
@@ -481,7 +480,7 @@
*/
if ((!r->file_exists || r->finfo.type != PR_FILE_DIRECTORY)
&& (res = check_symlinks(r->filename, ap_allow_options(r)))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Symbolic link not allowed: %s", r->filename);
return res;
}
@@ -774,7 +773,7 @@
}
else {
if ((res = check_symlinks(rnew->filename, ap_allow_options(rnew)))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, rnew->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, rnew,
"Symbolic link not allowed: %s", rnew->filename);
rnew->status = res;
return rnew;
@@ -852,7 +851,7 @@
* Mainline request processing...
*/
-void ap_die(int type, request_rec *r)
+API_EXPORT(void) ap_die(int type, request_rec *r)
{
int error_index = ap_index_of_response(type);
char *custom_response = ap_response_code_string(r, error_index);
@@ -948,7 +947,7 @@
* dying with a recursive server error...
*/
recursive_error = SERVER_ERROR;
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid error redirection directive: %s",
custom_response);
}
@@ -959,7 +958,7 @@
static void decl_die(int status, char *phase, request_rec *r)
{
if (status == DECLINED) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_CRIT, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_CRIT, r,
"configuration error: couldn't %s: %s", phase, r->uri);
ap_die(SERVER_ERROR, r);
}
@@ -971,7 +970,7 @@
{
/* Is there a require line configured for the type of *this* req? */
- array_header *reqs_arr = ap_requires(r);
+ const array_header *reqs_arr = ap_requires(r);
require_line *reqs;
int i;
@@ -1002,7 +1001,7 @@
* headers! Have to dink things even to make sure the error message
* comes through...
*/
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"client sent illegal HTTP/0.9 request: %s", r->uri);
r->header_only = 0;
ap_die(BAD_REQUEST, r);
@@ -1018,7 +1017,7 @@
* HTTP/1.1 mentions twice (S9, S14.23) that a request MUST contain
* a Host: header, and the server MUST respond with 400 if it doesn't.
*/
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"client sent HTTP/1.1 request without hostname (see RFC2068 section 9, and 14.23): %s", r->uri);
ap_die(BAD_REQUEST, r);
return;
@@ -1159,18 +1158,15 @@
void ap_process_request(request_rec *r)
{
-#ifdef STATUS
int old_stat;
- ap_time_process_request(r->connection->child_num, START_PREQUEST);
-#endif
+ if (ap_extended_status)
+ ap_time_process_request(r->connection->child_num, START_PREQUEST);
process_request_internal(r);
-#ifdef STATUS
old_stat = ap_update_child_status(r->connection->child_num,
SERVER_BUSY_LOG, r);
-#endif
/*
* We want to flush the last packet if this isn't a pipelining connection
@@ -1182,10 +1178,9 @@
ap_bhalfduplex(r->connection->client);
ap_log_transaction(r);
-#ifdef STATUS
(void) ap_update_child_status(r->connection->child_num, old_stat, r);
- ap_time_process_request(r->connection->child_num, STOP_PREQUEST);
-#endif
+ if (ap_extended_status)
+ ap_time_process_request(r->connection->child_num, STOP_PREQUEST);
}
static table *rename_original_env(pool *p, table *t)
1.3 +2 -3 apache-2.0/apache-nspr/main/rfc1413.c
Index: rfc1413.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/rfc1413.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- rfc1413.c 1998/06/30 08:57:08 1.2
+++ rfc1413.c 1998/09/22 18:05:19 1.3
@@ -68,7 +68,7 @@
*/
/* Some small additions for Apache --- ditch the "sccsid" var if
- * compiling with gcc (it *has* changed), include conf.h for the
+ * compiling with gcc (it *has* changed), include ap_config.h for the
* prototypes it defines on at least one system (SunlOSs) which has
* them missing from the standard header files, and one minor change
* below (extra parens around assign "if (foo = bar) ..." to shut up
@@ -236,9 +236,8 @@
if (get_rfc1413(sock, &conn->local_addr, &conn->remote_addr, user, srv) >= 0)
result = user;
-
- ap_set_callback_and_alarm(NULL, 0);
}
+ ap_set_callback_and_alarm(NULL, 0);
ap_pclosesocket(conn->pool, sock);
conn->remote_logname = result;
1.4 +52 -38 apache-2.0/apache-nspr/main/util.c
Index: util.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/util.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- util.c 1998/09/19 19:15:44 1.3
+++ util.c 1998/09/22 18:05:19 1.4
@@ -191,7 +191,7 @@
}
return -1;
}
- else if ((exp[y] != '?') && (tolower(str[x]) != tolower(exp[y])))
+ else if ((exp[y] != '?') && (ap_tolower(str[x]) != ap_tolower(exp[y])))
return 1;
}
return (str[x] != '\0');
@@ -242,7 +242,7 @@
while ((c = *src++) != '\0') {
if (c == '&')
no = 0;
- else if (c == '$' && isdigit(*src))
+ else if (c == '$' && ap_isdigit(*src))
no = *src++ - '0';
else
no = 10;
@@ -267,7 +267,7 @@
while ((c = *src++) != '\0') {
if (c == '&')
no = 0;
- else if (c == '$' && isdigit(*src))
+ else if (c == '$' && ap_isdigit(*src))
no = *src++ - '0';
else
no = 10;
@@ -516,7 +516,7 @@
char *res;
for (x = 0; (*line)[x]; x++) {
- if (isspace((*line)[x])) {
+ if (ap_isspace((*line)[x])) {
pos = x;
break;
}
@@ -531,7 +531,7 @@
res = ap_palloc(atrans, pos + 1);
ap_cpystrn(res, *line, pos + 1);
- while (isspace((*line)[pos]))
+ while (ap_isspace((*line)[pos]))
++pos;
*line += pos;
@@ -597,7 +597,7 @@
char *res;
char quote;
- while (*str && isspace(*str))
+ while (*str && ap_isspace(*str))
++str;
if (!*str) {
@@ -620,13 +620,13 @@
}
else {
strend = str;
- while (*strend && !isspace(*strend))
+ while (*strend && !ap_isspace(*strend))
++strend;
res = substring_conf(p, str, strend - str, 0);
}
- while (*strend && isspace(*strend))
+ while (*strend && ap_isspace(*strend))
++strend;
*line = strend;
return res;
@@ -763,28 +763,20 @@
break;
}
- /* Compress the line, reducing all blanks and tabs to one space.
+ /*
* Leading and trailing white space is eliminated completely
*/
- src = dst = buf;
- while (isspace(*src))
+ src = buf;
+ while (ap_isspace(*src))
++src;
- while (*src != '\0')
- {
- /* Copy words */
- while (!isspace(*dst = *src) && *src != '\0') {
- ++src;
- ++dst;
- }
- if (*src == '\0') break;
- *dst++ = ' ';
- while (isspace(*src))
- ++src;
- }
- *dst = '\0';
/* blast trailing whitespace */
- while (--dst >= buf && isspace(*dst))
+ dst = &src[strlen(src)];
+ while (--dst >= src && ap_isspace(*dst))
*dst = '\0';
+ /* Zap leading whitespace by shifting */
+ if (src != buf)
+ for (dst = buf; (*dst++ = *src++) != '\0'; )
+ ;
#ifdef DEBUG_CFG_LINES
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "Read config: %s", buf);
@@ -840,7 +832,7 @@
*/
}
/* blast trailing whitespace */
- while (i > 0 && isspace(buf[i - 1]))
+ while (i > 0 && ap_isspace(buf[i - 1]))
--i;
buf[i] = '\0';
#ifdef DEBUG_CFG_LINES
@@ -879,7 +871,7 @@
/* Find first non-white byte */
- while (*ptr && isspace(*ptr))
+ while (*ptr && ap_isspace(*ptr))
++ptr;
tok_start = ptr;
@@ -888,7 +880,7 @@
* (comments are already gone).
*/
- while (*ptr && (accept_white || !isspace(*ptr))
+ while (*ptr && (accept_white || !ap_isspace(*ptr))
&& *ptr != ';' && *ptr != ',') {
if (*ptr++ == '"')
while (*ptr)
@@ -901,7 +893,7 @@
/* Advance accept_line pointer to the next non-white byte */
- while (*ptr && isspace(*ptr))
+ while (*ptr && ap_isspace(*ptr))
++ptr;
*accept_line = ptr;
@@ -956,7 +948,7 @@
lidx = llen - tlen;
if ((lidx < 0) ||
- ((lidx > 0) && !(isspace(line[lidx - 1]) || line[lidx - 1] == ',')))
+ ((lidx > 0) && !(ap_isspace(line[lidx - 1]) || line[lidx - 1] == ',')))
return 0;
return (strncasecmp(&line[lidx], tok, tlen) == 0);
@@ -973,7 +965,7 @@
s = (const unsigned char *)str;
for (; *s; ++s) {
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
/* Don't allow '&' in parameters under OS/2. */
/* This can be used to send commands to the shell. */
if (*s == '&') {
@@ -1216,7 +1208,7 @@
for (x = 0; u[x] != ':'; x++) {
if ((!u[x]) ||
- ((!isalpha(u[x])) && (!isdigit(u[x])) &&
+ ((!ap_isalpha(u[x])) && (!ap_isdigit(u[x])) &&
(u[x] != '+') && (u[x] != '-') && (u[x] != '.'))) {
return 0;
}
@@ -1245,7 +1237,7 @@
const char *p = a;
const char *q = b;
for (p = a, q = b; *p && *q; p++, q++) {
- int diff = tolower(*p) - tolower(*q);
+ int diff = ap_tolower(*p) - ap_tolower(*q);
if (diff)
return diff;
}
@@ -1270,7 +1262,7 @@
return 0; /* Match up to n characters */
if (!(*p && *q))
return *p - *q;
- diff = tolower(*p) - tolower(*q);
+ diff = ap_tolower(*p) - ap_tolower(*q);
if (diff)
return diff;
}
@@ -1384,7 +1376,7 @@
API_EXPORT(void) ap_str_tolower(char *str)
{
while (*str) {
- *str = tolower(*str);
+ *str = ap_tolower(*str);
++str;
}
}
@@ -1433,7 +1425,7 @@
*/
/* XXX: ipv6 */
/* XXX: this is a silly name for this, it's not used for vhosts any longer */
-PRUint32 ap_get_virthost_addr(const char *w, PRUint16 *ports)
+PRUint32 ap_get_virthost_addr(char *w, PRUint16 *ports)
{
char hentbuf[PR_NETDB_BUF_SIZE];
PRHostEnt hent;
@@ -1599,8 +1591,30 @@
#endif /*CHARSET_EBCDIC*/
return bufplain;
}
+
+static const char basis_64[] =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+API_EXPORT(char *) ap_uuencode(pool *a, char *string)
+{
+ int i, len = strlen(string);
+ char *p;
+ char *encoded = (char *) ap_pcalloc(a, (len+2) / 3 * 4);
+
+ p = encoded;
+ for (i = 0; i < len; i += 3) {
+ *p++ = basis_64[string[i] >> 2];
+ *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2) | ((int) (string[i + 2] & 0xC0) >> 6)];
+ *p++ = basis_64[string[i + 2] & 0x3F];
+ }
+ *p-- = '\0';
+ *p-- = '=';
+ *p-- = '=';
+ return encoded;
+}
-#ifdef __EMX__
+#ifdef OS2
void os2pathname(char *path)
{
char newpath[MAX_STRING_LEN];
@@ -1665,7 +1679,7 @@
*semi = '\0';
}
while (*str) {
- *str = tolower(*str);
+ *str = ap_tolower(*str);
++str;
}
if (semi) {
1.3 +6 -6 apache-2.0/apache-nspr/main/util_date.c
Index: util_date.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/util_date.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- util_date.c 1998/06/30 08:57:08 1.2
+++ util_date.c 1998/09/22 18:05:19 1.3
@@ -66,7 +66,7 @@
*
*/
-#include "conf.h"
+#include "ap_config.h"
#include "util_date.h"
#include <ctype.h>
#include <string.h>
@@ -97,15 +97,15 @@
return 1;
case '@':
- if (!isupper(d))
+ if (!ap_isupper(d))
return 0;
break;
case '$':
- if (!islower(d))
+ if (!ap_islower(d))
return 0;
break;
case '#':
- if (!isdigit(d))
+ if (!ap_isdigit(d))
return 0;
break;
case '&':
@@ -113,7 +113,7 @@
return 0;
break;
case '~':
- if ((d != ' ') && !isdigit(d))
+ if ((d != ' ') && !ap_isdigit(d))
return 0;
break;
default:
@@ -189,7 +189,7 @@
if (!date)
return PR_FAILURE;
- while (*date && isspace(*date)) /* Find first non-whitespace char */
+ while (*date && ap_isspace(*date)) /* Find first non-whitespace char */
++date;
if (*date == '\0')
1.3 +7 -2 apache-2.0/apache-nspr/main/util_md5.c
Index: util_md5.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/util_md5.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- util_md5.c 1998/06/30 08:57:08 1.2
+++ util_md5.c 1998/09/22 18:05:20 1.3
@@ -87,7 +87,7 @@
#include "httpd.h"
#include "util_md5.h"
-API_EXPORT(char *) ap_md5(pool *p, unsigned char *string)
+API_EXPORT(char *) ap_md5_binary(pool *p, const unsigned char *buf, int length)
{
AP_MD5_CTX my_md5;
unsigned char hash[16];
@@ -99,7 +99,7 @@
*/
ap_MD5Init(&my_md5);
- ap_MD5Update(&my_md5, string, strlen((const char *) string));
+ ap_MD5Update(&my_md5, buf, length);
ap_MD5Final(hash, &my_md5);
for (i = 0, r = result; i < 16; i++, r += 2)
@@ -107,6 +107,11 @@
*r = '\0';
return ap_pstrdup(p, result);
+}
+
+API_EXPORT(char *) ap_md5(pool *p, const unsigned char *string)
+{
+ return ap_md5_binary(p, string, strlen(string));
}
/* these portions extracted from mpack, John G. Myers - jgm+@cmu.edu */
1.4 +89 -41 apache-2.0/apache-nspr/main/util_script.c
Index: util_script.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/main/util_script.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- util_script.c 1998/09/19 19:15:44 1.3
+++ util_script.c 1998/09/22 18:05:20 1.4
@@ -139,11 +139,11 @@
char *cp = res;
while (*++cp) {
- if (!isalnum(*cp) && *cp != '_') {
+ if (!ap_isalnum(*cp) && *cp != '_') {
*cp = '_';
}
else {
- *cp = toupper(*cp);
+ *cp = ap_toupper(*cp);
}
}
@@ -166,11 +166,11 @@
}
env[j] = ap_pstrcat(p, elts[i].key, "=", elts[i].val, NULL);
whack = env[j];
- if (isdigit(*whack)) {
+ if (ap_isdigit(*whack)) {
*whack++ = '_';
}
while (*whack != '=') {
- if (!isalnum(*whack) && *whack != '_') {
+ if (!ap_isalnum(*whack) && *whack != '_') {
*whack = '_';
}
++whack;
@@ -184,7 +184,7 @@
API_EXPORT(void) ap_add_common_vars(request_rec *r)
{
- table *e = r->subprocess_env;
+ table *e;
server_rec *s = r->server;
conn_rec *c = r->connection;
const char *rem_logname;
@@ -197,6 +197,11 @@
table_entry *hdrs = (table_entry *) hdrs_arr->elts;
int i;
+ /* use a temporary table which we'll overlap onto
+ * r->subprocess_env later
+ */
+ e = ap_make_table(r->pool, 25 + hdrs_arr->nelts);
+
/* First, add environment vars from headers... this is as per
* CGI specs, though other sorts of scripting interfaces see
* the same vars...
@@ -213,10 +218,10 @@
*/
if (!strcasecmp(hdrs[i].key, "Content-type")) {
- ap_table_setn(e, "CONTENT_TYPE", hdrs[i].val);
+ ap_table_addn(e, "CONTENT_TYPE", hdrs[i].val);
}
else if (!strcasecmp(hdrs[i].key, "Content-length")) {
- ap_table_setn(e, "CONTENT_LENGTH", hdrs[i].val);
+ ap_table_addn(e, "CONTENT_LENGTH", hdrs[i].val);
}
/*
* You really don't want to disable this check, since it leaves you
@@ -230,7 +235,7 @@
}
#endif
else {
- ap_table_setn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val);
+ ap_table_addn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val);
}
}
@@ -240,24 +245,24 @@
#ifdef WIN32
if (env_temp = getenv("SystemRoot")) {
- ap_table_setn(e, "SystemRoot", env_temp);
+ ap_table_addn(e, "SystemRoot", env_temp);
}
if (env_temp = getenv("COMSPEC")) {
- ap_table_setn(e, "COMSPEC", env_temp);
+ ap_table_addn(e, "COMSPEC", env_temp);
}
if (env_temp = getenv("WINDIR")) {
- ap_table_setn(e, "WINDIR", env_temp);
+ ap_table_addn(e, "WINDIR", env_temp);
}
#endif
- ap_table_setn(e, "PATH", env_path);
- ap_table_setn(e, "SERVER_SOFTWARE", ap_get_server_version());
- ap_table_setn(e, "SERVER_NAME", ap_get_server_name(r));
- ap_table_setn(e, "SERVER_PORT",
+ ap_table_addn(e, "PATH", env_path);
+ ap_table_addn(e, "SERVER_SOFTWARE", ap_get_server_version());
+ ap_table_addn(e, "SERVER_NAME", ap_get_server_name(r));
+ ap_table_addn(e, "SERVER_PORT",
ap_psprintf(r->pool, "%u", ap_get_server_port(r)));
host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST);
if (host) {
- ap_table_setn(e, "REMOTE_HOST", host);
+ ap_table_addn(e, "REMOTE_HOST", host);
}
ap_table_setn(e, "REMOTE_ADDR", c->remote_ip);
ap_table_setn(e, "DOCUMENT_ROOT", ap_document_root(r)); /* Apache */
@@ -269,26 +274,28 @@
PR_ntohs(c->remote_addr.inet.port)));
if (c->user) {
- ap_table_setn(e, "REMOTE_USER", c->user);
+ ap_table_addn(e, "REMOTE_USER", c->user);
}
if (c->ap_auth_type) {
- ap_table_setn(e, "AUTH_TYPE", c->ap_auth_type);
+ ap_table_addn(e, "AUTH_TYPE", c->ap_auth_type);
}
rem_logname = ap_get_remote_logname(r);
if (rem_logname) {
- ap_table_setn(e, "REMOTE_IDENT", ap_pstrdup(r->pool, rem_logname));
+ ap_table_addn(e, "REMOTE_IDENT", ap_pstrdup(r->pool, rem_logname));
}
/* Apache custom error responses. If we have redirected set two new vars */
if (r->prev) {
if (r->prev->args) {
- ap_table_setn(e, "REDIRECT_QUERY_STRING", r->prev->args);
+ ap_table_addn(e, "REDIRECT_QUERY_STRING", r->prev->args);
}
if (r->prev->uri) {
- ap_table_setn(e, "REDIRECT_URL", r->prev->uri);
+ ap_table_addn(e, "REDIRECT_URL", r->prev->uri);
}
}
+
+ ap_overlap_tables(r->subprocess_env, e, AP_OVERLAP_TABLES_SET);
}
/* This "cute" little function comes about because the path info on
@@ -326,15 +333,15 @@
first = r->the_request; /* use the request-line */
- while (*first && !isspace(*first)) {
+ while (*first && !ap_isspace(*first)) {
++first; /* skip over the method */
}
- while (isspace(*first)) {
+ while (ap_isspace(*first)) {
++first; /* and the space(s) */
}
last = first;
- while (*last && !isspace(*last)) {
+ while (*last && !ap_isspace(*last)) {
++last; /* end at next whitespace */
}
@@ -403,17 +410,38 @@
}
}
+
+static int set_cookie_doo_doo(void *v, const char *key, const char *val)
+{
+ ap_table_addn(v, key, val);
+ return 1;
+}
+
API_EXPORT(int) ap_scan_script_header_err(request_rec *r, BUFF *fb)
{
char buf[MAX_STRING_LEN];
char *l;
char *strp;
int cgi_status = HTTP_OK;
+ table *merge;
+ table *cookie_table;
+
+ /* temporary place to hold headers to merge in later */
+ merge = ap_make_table(r->pool, 10);
+
+ /* The HTTP specification says that it is legal to merge duplicate
+ * headers into one. Some browsers that support Cookies don't like
+ * merged headers and prefer that each Set-Cookie header is sent
+ * separately. Lets humour those browsers by not merging.
+ * Oh what a pain it is.
+ */
+ cookie_table = ap_make_table(r->pool, 2);
+ ap_table_do(set_cookie_doo_doo, cookie_table, r->err_headers_out, "Set-Cookie", NULL);
while (1) {
if (ap_bgets(buf, sizeof(buf), fb) <= 0) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "Premature end of script headers: %s", r->filename);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "Premature end of script headers: %s", r->filename);
return HTTP_INTERNAL_SERVER_ERROR;
}
@@ -444,11 +472,38 @@
if ((cgi_status == HTTP_OK) && (r->method_number == M_GET)) {
cond_status = ap_meets_conditions(r);
}
+ ap_overlap_tables(r->err_headers_out, merge,
+ AP_OVERLAP_TABLES_MERGE);
+ if (!ap_is_empty_table(cookie_table)) {
+ r->err_headers_out = ap_overlay_tables(r->pool,
+ r->err_headers_out, cookie_table);
+ }
return cond_status;
}
/* if we see a bogus header don't ignore it. Shout and scream */
+#ifdef CHARSET_EBCDIC
+ /* Chances are that we received an ASCII header text instead of
+ * the expected EBCDIC header lines. Try to auto-detect:
+ */
+ if (!(l = strchr(buf, ':'))) {
+ int maybeASCII = 0, maybeEBCDIC = 0;
+ char *cp;
+
+ for (cp = buf; *cp != '\0'; ++cp) {
+ if (isprint(*cp) && !isprint(os_toebcdic[*cp]))
+ ++maybeEBCDIC;
+ if (!isprint(*cp) && isprint(os_toebcdic[*cp]))
+ ++maybeASCII;
+ }
+ if (maybeASCII > maybeEBCDIC) {
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ "CGI Interface Error: Script headers apparently ASCII: (CGI = %s)", r->filename);
+ ascii2ebcdic(buf, buf, cp - buf);
+ }
+ }
+#endif
if (!(l = strchr(buf, ':'))) {
char malformed[(sizeof MALFORMED_MESSAGE) + 1
+ MALFORMED_HEADER_LENGTH_TO_SHOW];
@@ -460,13 +515,13 @@
while (ap_bgets(buf, sizeof(buf), fb) > 0)
continue;
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "%s: %s", malformed, r->filename);
- return SERVER_ERROR;
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "%s: %s", malformed, r->filename);
+ return HTTP_INTERNAL_SERVER_ERROR;
}
*l++ = '\0';
- while (*l && isspace(*l)) {
+ while (*l && ap_isspace(*l)) {
++l;
}
@@ -476,7 +531,7 @@
/* Nuke trailing whitespace */
char *endp = l + strlen(l) - 1;
- while (endp > l && isspace(*endp)) {
+ while (endp > l && ap_isspace(*endp)) {
*endp-- = '\0';
}
@@ -527,22 +582,15 @@
ap_table_set(r->headers_out, buf, l);
cgi_status = atoi(l);
}
-
- /* The HTTP specification says that it is legal to merge duplicate
- * headers into one. Some browsers that support Cookies don't like
- * merged headers and prefer that each Set-Cookie header is sent
- * separately. Lets humour those browsers.
- */
else if (!strcasecmp(buf, "Set-Cookie")) {
- ap_table_add(r->err_headers_out, buf, l);
+ ap_table_add(cookie_table, buf, l);
}
else {
- ap_table_merge(r->err_headers_out, buf, l);
+ ap_table_add(merge, buf, l);
}
}
}
-
/* XXX: what the heck is this doing in util_script.c? */
API_EXPORT(void) ap_send_size(size_t size, request_rec *r)
{
@@ -568,7 +616,7 @@
}
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
static char **create_argv_cmd(pool *p, char *av0, const char *args, char *path)
{
register int x, n;
1.3 +8 -0 apache-2.0/apache-nspr/modules/example/mod_example.c
Index: mod_example.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/example/mod_example.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_example.c 1998/06/30 08:57:08 1.2
+++ mod_example.c 1998/09/22 18:05:24 1.3
@@ -1126,8 +1126,16 @@
example_type_checker, /* [7] MIME type checker/setter */
example_fixer_upper, /* [8] fixups */
example_logger, /* [10] logger */
+#if MODULE_MAGIC_NUMBER >= 19970103
example_header_parser, /* [3] header parser */
+#endif
+#if MODULE_MAGIC_NUMBER >= 19970719
example_child_init, /* process initializer */
+#endif
+#if MODULE_MAGIC_NUMBER >= 19970728
example_child_exit, /* process exit/cleanup */
+#endif
+#if MODULE_MAGIC_NUMBER >= 19970902
example_post_read_request /* [1] post read_request handling */
+#endif
};
1.3 +6 -1 apache-2.0/apache-nspr/modules/experimental/mod_mmap_static.c
Index: mod_mmap_static.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/experimental/mod_mmap_static.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_mmap_static.c 1998/06/30 08:57:08 1.2
+++ mod_mmap_static.c 1998/09/22 18:05:25 1.3
@@ -279,12 +279,17 @@
a_file *match;
int res;
+ sconf = ap_get_module_config(r->server->module_config, &mmap_static_module);
+
+ /* we only operate when at least one mmapfile directive was used */
+ if (ap_is_empty_table(sconf->files))
+ return DECLINED;
+
/* we require other modules to first set up a filename */
res = core_module.translate_handler(r);
if (res == DECLINED || !r->filename) {
return res;
}
- sconf = ap_get_module_config(r->server->module_config, &mmap_static_module);
tmp.filename = r->filename;
match = (a_file *)bsearch(&tmp, sconf->files->elts, sconf->files->nelts,
sizeof(a_file), file_compare);
1.3 +1 -38 apache-2.0/apache-nspr/modules/proxy/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/proxy/Makefile.tmpl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile.tmpl 1998/06/30 08:57:08 1.2
+++ Makefile.tmpl 1998/09/22 18:05:26 1.3
@@ -19,7 +19,7 @@
libproxy.so: $(OBJS_PIC)
rm -f $@
- $(LD_SHLIB) $(LDFLAGS_SHLIB) -o $@ $(OBJS_PIC)
+ $(LD_SHLIB) $(LDFLAGS_SHLIB) -o $@ $(OBJS_PIC) $(LIBS_SHLIB)
.SUFFIXES: .o .lo
@@ -52,40 +52,3 @@
$(OBJS) $(OBJS_PIC): Makefile
# DO NOT REMOVE
-mod_proxy.o: mod_proxy.c mod_proxy.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/explain.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_vhost.h
-proxy_cache.o: proxy_cache.c mod_proxy.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/explain.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_main.h $(INCDIR)/util_date.h \
- $(INCDIR)/md5.h
-proxy_connect.o: proxy_connect.c mod_proxy.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/explain.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_main.h
-proxy_ftp.o: proxy_ftp.c mod_proxy.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/explain.h $(INCDIR)/http_main.h
-proxy_http.o: proxy_http.c mod_proxy.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/explain.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_main.h $(INCDIR)/http_core.h \
- $(INCDIR)/util_date.h
-proxy_util.o: proxy_util.c mod_proxy.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/explain.h $(INCDIR)/http_main.h $(INCDIR)/md5.h \
- $(INCDIR)/http_log.h
1.3 +80 -77 apache-2.0/apache-nspr/modules/proxy/proxy_cache.c
Index: proxy_cache.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/proxy/proxy_cache.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- proxy_cache.c 1998/06/30 08:57:08 1.2
+++ proxy_cache.c 1998/09/22 18:05:27 1.3
@@ -118,7 +118,7 @@
static int sub_garbage_coll(request_rec *r, array_header *files,
const char *cachedir, const char *cachesubdir);
static void help_proxy_garbage_coll(request_rec *r);
-#if !defined(WIN32) && !defined(MPE) && !defined(__EMX__)
+#if !defined(WIN32) && !defined(MPE) && !defined(OS2)
static void detached_proxy_garbage_coll(request_rec *r);
#endif
@@ -137,7 +137,7 @@
(void) ap_release_mutex(garbage_mutex);
ap_block_alarms(); /* avoid SIGALRM on big cache cleanup */
-#if !defined(WIN32) && !defined(MPE) && !defined(__EMX__)
+#if !defined(WIN32) && !defined(MPE) && !defined(OS2)
detached_proxy_garbage_coll(r);
#else
help_proxy_garbage_coll(r);
@@ -197,7 +197,7 @@
return 0;
}
-#if !defined(WIN32) && !defined(MPE) && !defined(__EMX__)
+#if !defined(WIN32) && !defined(MPE) && !defined(OS2)
static void detached_proxy_garbage_coll(request_rec *r)
{
pid_t pid;
@@ -331,7 +331,7 @@
if (cmp_long61(&curbytes, &cachesize) < 0L) {
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
"proxy GC: Cache is %ld%% full (nothing deleted)",
- (long)((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space);
+ (long)(((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space));
ap_unblock_alarms();
return;
}
@@ -362,7 +362,7 @@
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server,
"proxy GC: Cache is %ld%% full (%d deleted)",
- (long)((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space, i);
+ (long)(((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space), i);
ap_unblock_alarms();
}
@@ -423,7 +423,7 @@
/* if (strlen(ent->d_name) != HASH_LEN) continue; */
/* under OS/2 use dirent's d_attr to identify a diretory */
-#ifdef __EMX__
+#ifdef OS2
/* is it a directory? */
if (ent->d_attr & A_DIR) {
char newcachedir[HUGE_STRING_LEN];
@@ -459,7 +459,7 @@
}
/* In OS/2 this has already been done above */
-#ifndef __EMX__
+#ifndef OS2
if (S_ISDIR(buf.st_mode)) {
char newcachedir[HUGE_STRING_LEN];
close(fd);
@@ -535,7 +535,7 @@
* 0 on failure (bad file or wrong URL)
* -1 on UNIX error
*/
-static int rdcache(pool *p, BUFF *cachefp, struct cache_req *c)
+static int rdcache(request_rec *r, BUFF *cachefp, cache_req *c)
{
char urlbuff[1034], *strp;
int len;
@@ -544,7 +544,7 @@
* date SP lastmod SP expire SP count SP content-length CRLF
* dates are stored as hex seconds since 1970
*/
- len = ap_bgets(urlbuff, 1034, cachefp);
+ len = ap_bgets(urlbuff, sizeof urlbuff, cachefp);
if (len == -1)
return -1;
if (len == 0 || urlbuff[len - 1] != '\n')
@@ -562,7 +562,7 @@
c->len = ap_proxy_hex2sec(urlbuff + 36);
/* check that we have the same URL */
- len = ap_bgets(urlbuff, 1034, cachefp);
+ len = ap_bgets(urlbuff, sizeof urlbuff, cachefp);
if (len == -1)
return -1;
if (len == 0 || strncmp(urlbuff, "X-URL: ", 7) != 0 ||
@@ -573,29 +573,26 @@
return 0;
/* What follows is the message */
- len = ap_bgets(urlbuff, 1034, cachefp);
+ len = ap_bgets(urlbuff, sizeof urlbuff, cachefp);
if (len == -1)
return -1;
if (len == 0 || urlbuff[len - 1] != '\n')
return 0;
urlbuff[--len] = '\0';
- c->resp_line = ap_pstrdup(p, urlbuff);
+ c->resp_line = ap_pstrdup(r->pool, urlbuff);
strp = strchr(urlbuff, ' ');
if (strp == NULL)
return 0;
c->status = atoi(strp);
- c->hdrs = ap_proxy_read_headers(p, urlbuff, 1034, cachefp);
+ c->hdrs = ap_proxy_read_headers(r, urlbuff, sizeof urlbuff, cachefp);
if (c->hdrs == NULL)
return -1;
if (c->len != -1) { /* add a content-length header */
- struct hdr_entry *q;
- q = ap_proxy_get_header(c->hdrs, "Content-Length");
- if (q == NULL) {
- strp = ap_palloc(p, 15);
- ap_snprintf(strp, 15, "%lu", (unsigned long)c->len);
- ap_proxy_add_header(c->hdrs, "Content-Length", strp, HDR_REP);
+ if (ap_table_get(c->hdrs, "Content-Length") == NULL) {
+ ap_table_set(c->hdrs, "Content-Length",
+ ap_psprintf(r->pool, "%lu", (unsigned long)c->len));
}
}
return 1;
@@ -617,11 +614,11 @@
* last modified date to request
*/
int ap_proxy_cache_check(request_rec *r, char *url, struct cache_conf *conf,
- struct cache_req **cr)
+ cache_req **cr)
{
char hashfile[66];
const char *imstr, *pragma, *auth;
- struct cache_req *c;
+ cache_req *c;
time_t now;
BUFF *cachefp;
int cfd, i;
@@ -630,7 +627,7 @@
proxy_server_conf *pconf =
(proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
- c = ap_pcalloc(r->pool, sizeof(struct cache_req));
+ c = ap_pcalloc(r->pool, sizeof(cache_req));
*cr = c;
c->req = r;
c->url = ap_pstrdup(r->pool, url);
@@ -670,7 +667,7 @@
ap_bpushfd(cachefp, cfd);
}
else if (errno != ENOENT)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error opening cache file %s",
c->filename);
#ifdef EXPLAIN
@@ -680,21 +677,24 @@
}
if (cachefp != NULL) {
- i = rdcache(r->pool, cachefp, c);
+ i = rdcache(r, cachefp, c);
if (i == -1)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error reading cache file %s",
c->filename);
else if (i == 0)
- ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,
"proxy: bad (short?) cache file: %s", c->filename);
if (i != 1) {
ap_pclosef(r->pool, cachefp->fd);
cachefp = NULL;
}
}
+/* fixed? in this case, we want to get the headers from the remote server
+ it will be handled later if we don't do this (I hope ;-)
if (cachefp == NULL)
- c->hdrs = ap_make_array(r->pool, 2, sizeof(struct hdr_entry));
+ c->hdrs = ap_make_table(r->pool, 20);
+*/
/* FIXME: Shouldn't we check the URL somewhere? */
now = time(NULL);
/* Ok, have we got some un-expired data? */
@@ -705,16 +705,12 @@
/* has the cached file changed since this request? */
if (c->date == BAD_DATE || c->date > c->ims) {
/* No, but these header values may have changed, so we send them with the
- * 304 response
+ * 304 HTTP_NOT_MODIFIED response
*/
- /* CHECKME: surely this was wrong? (Ben)
- p = table_get(r->headers_in, "Expires");
- */
- struct hdr_entry *q;
-
- q = ap_proxy_get_header(c->hdrs, "Expires");
- if (q != NULL && q->value != NULL)
- ap_table_set(r->headers_out, "Expires", q->value);
+ const char *q;
+
+ if ((q = ap_table_get(c->hdrs, "Expires")) != NULL)
+ ap_table_set(r->headers_out, "Expires", q);
}
ap_pclosef(r->pool, cachefp->fd);
Explain0("Use local copy, cached file hasn't changed");
@@ -733,7 +729,7 @@
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
r->sent_bodyct = 1;
if (!r->header_only)
- ap_proxy_send_fb(cachefp, r, NULL, NULL);
+ ap_proxy_send_fb(cachefp, r, NULL);
ap_pclosef(r->pool, cachefp->fd);
return OK;
}
@@ -748,13 +744,11 @@
* from the cache
*/
if (c->ims == BAD_DATE || c->ims < c->lmod) {
- struct hdr_entry *q;
+ const char *q;
- q = ap_proxy_get_header(c->hdrs, "Last-Modified");
-
- if (q != NULL && q->value != NULL)
+ if ((q = ap_table_get(c->hdrs, "Last-Modified")) != NULL)
ap_table_set(r->headers_in, "If-Modified-Since",
- (char *) q->value);
+ (char *) q);
}
}
c->fp = cachefp;
@@ -776,7 +770,7 @@
* from the cache, maybe updating the header line
* otherwise, delete the old cached file and open a new temporary file
*/
-int ap_proxy_cache_update(struct cache_req *c, array_header *resp_hdrs,
+int ap_proxy_cache_update(cache_req *c, table *resp_hdrs,
const int is_HTTP1, int nocache)
{
#ifdef ULTRIX_BRAIN_DEATH
@@ -785,7 +779,7 @@
request_rec *r = c->req;
char *p;
int i;
- struct hdr_entry *expire, *dates, *lmods, *clen;
+ const char *expire, *lmods, *dates, *clen;
time_t expc, date, lmod, now;
char buff[46];
void *sconf = r->server->module_config;
@@ -799,21 +793,20 @@
/* read expiry date; if a bad date, then leave it so the client can
* read it
*/
- expire = ap_proxy_get_header(resp_hdrs, "Expires");
+ expire = ap_table_get(resp_hdrs, "Expires");
if (expire != NULL)
- expc = ap_parseHTTPdate(expire->value);
+ expc = ap_parseHTTPdate(expire);
else
expc = BAD_DATE;
/*
* read the last-modified date; if the date is bad, then delete it
*/
- lmods = ap_proxy_get_header(resp_hdrs, "Last-Modified");
+ lmods = ap_table_get(resp_hdrs, "Last-Modified");
if (lmods != NULL) {
- lmod = ap_parseHTTPdate(lmods->value);
+ lmod = ap_parseHTTPdate(lmods);
if (lmod == BAD_DATE) {
/* kill last modified date */
- lmods->value = NULL;
lmods = NULL;
}
}
@@ -823,16 +816,18 @@
/*
* what responses should we not cache?
* Unknown status responses and those known to be uncacheable
- * 304 response when we have no valid cache file, or
- * 200 response from HTTP/1.0 and up without a Last-Modified header, or
+ * 304 HTTP_NOT_MODIFIED response when we have no valid cache file, or
+ * 200 HTTP_OK response from HTTP/1.0 and up without a Last-Modified header, or
* HEAD requests, or
* requests with an Authorization header, or
* protocol requests nocache (e.g. ftp with user/password)
*/
- if ((r->status != 200 && r->status != 301 && r->status != 304) ||
+/* @@@ XXX FIXME: is the test "r->status != HTTP_MOVED_PERMANENTLY" corerct?
+ * or shouldn't it be "ap_is_HTTP_REDIRECT(r->status)" ? -MnKr */
+ if ((r->status != HTTP_OK && r->status != HTTP_MOVED_PERMANENTLY && r->status != HTTP_NOT_MODIFIED) ||
(expire != NULL && expc == BAD_DATE) ||
- (r->status == 304 && c->fp == NULL) ||
- (r->status == 200 && lmods == NULL && is_HTTP1) ||
+ (r->status == HTTP_NOT_MODIFIED && (c == NULL || c->fp == NULL)) ||
+ (r->status == HTTP_OK && lmods == NULL && is_HTTP1) ||
r->header_only ||
ap_table_get(r->headers_in, "Authorization") != NULL ||
nocache) {
@@ -843,7 +838,8 @@
c->fp = NULL;
}
/* delete the previously cached file */
- unlink(c->filename);
+ if (c->filename)
+ unlink(c->filename);
return DECLINED; /* send data to client but not cache */
}
@@ -851,9 +847,9 @@
/*
* Read the date. Generate one if one is not supplied
*/
- dates = ap_proxy_get_header(resp_hdrs, "Date");
+ dates = ap_table_get(resp_hdrs, "Date");
if (dates != NULL)
- date = ap_parseHTTPdate(dates->value);
+ date = ap_parseHTTPdate(dates);
else
date = BAD_DATE;
@@ -864,8 +860,8 @@
/* add one; N.B. use the time _now_ rather than when we were checking the cache
*/
date = now;
- p = ap_gm_timestr_822(r->pool, now);
- dates = ap_proxy_add_header(resp_hdrs, "Date", p, HDR_REP);
+ dates = ap_gm_timestr_822(r->pool, now);
+ ap_table_set(resp_hdrs, "Date", dates);
Explain0("Added date header");
}
@@ -874,7 +870,7 @@
/* if its in the future, then replace by date */
{
lmod = date;
- lmods->value = dates->value;
+ lmods = dates;
Explain0("Last modified is in the future, replacing with now");
}
/* if the response did not contain the header, then use the cached version */
@@ -885,9 +881,9 @@
/* we now need to calculate the expire data for the object. */
if (expire == NULL && c->fp != NULL) { /* no expiry data sent in response */
- expire = ap_proxy_get_header(c->hdrs, "Expires");
+ expire = ap_table_get(c->hdrs, "Expires");
if (expire != NULL)
- expc = ap_parseHTTPdate(expire->value);
+ expc = ap_parseHTTPdate(expire);
}
/* so we now have the expiry date */
/* if no expiry date then
@@ -911,11 +907,11 @@
}
/* get the content-length header */
- clen = ap_proxy_get_header(resp_hdrs, "Content-Length");
+ clen = ap_table_get(resp_hdrs, "Content-Length");
if (clen == NULL)
c->len = -1;
else
- c->len = atoi(clen->value);
+ c->len = atoi(clen);
ap_proxy_sec2hex(date, buff);
buff[8] = ' ';
@@ -930,18 +926,18 @@
buff[45] = '\0';
/* if file not modified */
- if (r->status == 304) {
+ if (r->status == HTTP_NOT_MODIFIED) {
if (c->ims != BAD_DATE && lmod != BAD_DATE && lmod <= c->ims) {
/* set any changed headers somehow */
/* update dates and version, but not content-length */
if (lmod != c->lmod || expc != c->expire || date != c->date) {
off_t curpos = lseek(c->fp->fd, 0, SEEK_SET);
if (curpos == -1)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error seeking on cache file %s",
c->filename);
else if (write(c->fp->fd, buff, 35) == -1)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error updating cache file %s",
c->filename);
}
@@ -963,18 +959,18 @@
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
r->sent_bodyct = 1;
if (!r->header_only)
- ap_proxy_send_fb(c->fp, r, NULL, NULL);
+ ap_proxy_send_fb(c->fp, r, NULL);
/* set any changed headers somehow */
/* update dates and version, but not content-length */
if (lmod != c->lmod || expc != c->expire || date != c->date) {
off_t curpos = lseek(c->fp->fd, 0, SEEK_SET);
if (curpos == -1)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error seeking on cache file %s",
c->filename);
else if (write(c->fp->fd, buff, 35) == -1)
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error updating cache file %s",
c->filename);
}
@@ -1007,7 +1003,7 @@
i = open(c->tempfile, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0622);
if (i == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error creating cache file %s",
c->tempfile);
return DECLINED;
@@ -1017,7 +1013,7 @@
ap_bpushfd(c->fp, i);
if (ap_bvputs(c->fp, buff, "X-URL: ", c->url, "\n", NULL) == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error writing cache file(%s)", c->tempfile);
ap_pclosef(r->pool, c->fp->fd);
unlink(c->tempfile);
@@ -1026,15 +1022,20 @@
return DECLINED;
}
-void ap_proxy_cache_tidy(struct cache_req *c)
+void ap_proxy_cache_tidy(cache_req *c)
{
- server_rec *s = c->req->server;
+ server_rec *s;
PRUint32 bc;
- if (c->fp == NULL)
+ if (c == NULL || c->fp == NULL)
return;
+ s = c->req->server;
+
+/* don't care how much was sent, but rather how much was written to cache
ap_bgetopt(c->req->connection->client, BO_BYTECT, &bc);
+ */
+ bc = c->written;
if (c->len != -1) {
/* file lengths don't match; don't cache it */
@@ -1044,11 +1045,13 @@
return;
}
}
+/* don't care if aborted, cache it if fully retrieved from host!
else if (c->req->connection->aborted) {
- ap_pclosef(c->req->pool, c->fp->fd); /* no need to flush */
+ ap_pclosef(c->req->pool, c->fp->fd); / no need to flush /
unlink(c->tempfile);
return;
}
+*/
else {
/* update content-length of file */
char buff[9];
@@ -1108,7 +1111,7 @@
*p = '/';
++p;
}
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
/* Under OS/2 use rename. */
if (rename(c->tempfile, c->filename) == -1)
ap_log_error(APLOG_MARK, APLOG_ERR, s,
1.3 +27 -8 apache-2.0/apache-nspr/modules/proxy/proxy_connect.c
Index: proxy_connect.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/proxy/proxy_connect.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- proxy_connect.c 1998/06/30 08:57:09 1.2
+++ proxy_connect.c 1998/09/22 18:05:27 1.3
@@ -97,7 +97,21 @@
* FIXME: no check for r->assbackwards, whatever that is.
*/
-int ap_proxy_connect_handler(request_rec *r, struct cache_req *c, char *url,
+static int
+allowed_port(proxy_server_conf *conf, int port)
+{
+ int i;
+ int *list = (int *) conf->allowed_connect_ports->elts;
+
+ for(i = 0; i < conf->allowed_connect_ports->nelts; i++) {
+ if(port == list[i])
+ return 1;
+ }
+ return 0;
+}
+
+
+int ap_proxy_connect_handler(request_rec *r, cache_req *c, char *url,
const char *proxyhost, int proxyport)
{
struct sockaddr_in server;
@@ -138,13 +152,18 @@
return ap_proxyerror(r, "Connect to remote machine blocked");
}
- switch (port) {
- case DEFAULT_HTTPS_PORT:
+ /* Check if it is an allowed port */
+ if (conf->allowed_connect_ports->nelts == 0) {
+ /* Default setting if not overridden by AllowCONNECT */
+ switch (port) {
+ case DEFAULT_HTTPS_PORT:
case DEFAULT_SNEWS_PORT:
- break;
- default:
- return HTTP_SERVICE_UNAVAILABLE;
- }
+ break;
+ default:
+ return HTTP_FORBIDDEN;
+ }
+ } else if(!allowed_port(conf, port))
+ return HTTP_FORBIDDEN;
if (proxyhost) {
Explain2("CONNECT to remote proxy %s on port %d", proxyhost, proxyport);
@@ -161,7 +180,7 @@
sock = ap_ptcpsocket(r->pool);
if (!sock) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error creating socket");
return HTTP_INTERNAL_SERVER_ERROR;
}
1.3 +341 -231 apache-2.0/apache-nspr/modules/proxy/proxy_ftp.c
Index: proxy_ftp.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/proxy/proxy_ftp.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- proxy_ftp.c 1998/06/30 08:57:09 1.2
+++ proxy_ftp.c 1998/09/22 18:05:27 1.3
@@ -61,6 +61,8 @@
#include "http_main.h"
#include "http_log.h"
+#define AUTODETECT_PWD
+
DEF_Explain
/*
@@ -195,8 +197,8 @@
if (len == -1)
return -1;
/* check format */
- if (len < 5 || !isdigit(linebuff[0]) || !isdigit(linebuff[1]) ||
- !isdigit(linebuff[2]) || (linebuff[3] != ' ' && linebuff[3] != '-'))
+ if (len < 5 || !ap_isdigit(linebuff[0]) || !ap_isdigit(linebuff[1]) ||
+ !ap_isdigit(linebuff[2]) || (linebuff[3] != ' ' && linebuff[3] != '-'))
status = 0;
else
status = 100 * linebuff[0] + 10 * linebuff[1] + linebuff[2] - 111 * '0';
@@ -236,8 +238,8 @@
len = ap_bgets(linebuff, sizeof linebuff, f);
if (len == -1)
return -1;
- if (len < 5 || !isdigit(linebuff[0]) || !isdigit(linebuff[1]) ||
- !isdigit(linebuff[2]) || (linebuff[3] != ' ' && linebuff[3] != '-'))
+ if (len < 5 || !ap_isdigit(linebuff[0]) || !ap_isdigit(linebuff[1]) ||
+ !ap_isdigit(linebuff[2]) || (linebuff[3] != ' ' && linebuff[3] != '-'))
status = 0;
else
status = 100 * linebuff[0] + 10 * linebuff[1] + linebuff[2] - 111 * '0';
@@ -263,65 +265,38 @@
return status;
}
-static long int send_dir(BUFF *f, request_rec *r, BUFF *f2, struct cache_req *c, char *url)
+static long int send_dir(BUFF *f, request_rec *r, cache_req *c, char *cwd)
{
char buf[IOBUFSIZE];
char buf2[IOBUFSIZE];
char *filename;
- char *tempurl;
int searchidx = 0;
char *searchptr = NULL;
int firstfile = 1;
- char urlptr[HUGE_STRING_LEN];
unsigned long total_bytes_sent = 0;
register int n, o, w;
- int hostlen;
conn_rec *con = r->connection;
- char *dir, *path, *reldir, *site, *psite;
- const char *sig;
-
- tempurl = ap_pstrdup(r->pool, url);
-
- (void)decodeenc(tempurl);
-
- /* Determine length of "scheme://site" prefix */
- for (hostlen=0; tempurl[hostlen]!='/'; ++hostlen)
- continue;
- if (tempurl[hostlen] == '/' && tempurl[hostlen+1] == '/') {
- for (hostlen+=2; tempurl[hostlen]!='/' && tempurl[hostlen]!='?'; ++hostlen)
- continue;
- } else {
- hostlen = 0;
- }
-
- /* Save "scheme://site" prefix */
- site = psite = ap_pstrndup(r->pool, tempurl, hostlen);
-
- if ((n = strcspn(tempurl, "@")) != strlen(tempurl) && n < hostlen) { /* hide user/passwd */
- memmove(tempurl + (n - 5), tempurl, 6);
- tempurl += n - 5; /* leave room for ftp:// */
- hostlen -= (n-5);
+ char *dir, *path, *reldir, *site;
- /* Save "scheme://site" prefix without user/password */
- site = ap_pstrndup(r->pool, tempurl, hostlen);
- }
+ /* Save "scheme://site" prefix without password */
+ site = ap_unparse_uri_components(r->pool, &r->parsed_uri, UNP_OMITPASSWORD|UNP_OMITPATHINFO);
+ /* ... and path without query args */
+ path = ap_unparse_uri_components(r->pool, &r->parsed_uri, UNP_OMITSITEPART|UNP_OMITQUERY);
+ (void)decodeenc(path);
/* Copy path, strip (all except the last) trailing slashes */
- path = dir = ap_pstrcat(r->pool, tempurl+hostlen, "/", NULL);
+ path = dir = ap_pstrcat(r->pool, path, "/", NULL);
while ((n = strlen(path)) > 1 && path[n-1] == '/' && path[n-2] == '/')
path[n-1] = '\0';
/* print "ftp://host/" */
- ap_snprintf(buf, sizeof(buf), "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n"
- "<HTML><HEAD><TITLE>%s</TITLE>\n"
+ n = ap_snprintf(buf, sizeof(buf), "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n"
+ "<HTML><HEAD><TITLE>%s%s</TITLE>\n"
"<BASE HREF=\"%s%s\"></HEAD>\n"
"<BODY><H2>Directory of "
"<A HREF=\"/\">%s</A>/",
- tempurl, psite, path, site);
- ap_bputs(buf, con->client);
- if (f2 != NULL)
- ap_bputs(buf, f2);
- total_bytes_sent += strlen(buf);
+ site, path, site, path, site);
+ total_bytes_sent += ap_proxy_bputs2(buf, con->client, c);
while ((dir = strchr(dir+1, '/')) != NULL)
{
@@ -332,31 +307,23 @@
++reldir;
/* print "path/" component */
ap_snprintf(buf, sizeof(buf), "<A HREF=\"/%s/\">%s</A>/", path+1, reldir);
- ap_bputs(buf, con->client);
- if (f2 != NULL)
- ap_bputs(buf, f2);
- total_bytes_sent += strlen(buf);
+ total_bytes_sent += ap_proxy_bputs2(buf, con->client, c);
*dir = '/';
+ }
+ /* If the caller has determined the current directory, and it differs */
+ /* from what the client requested, then show the real name */
+ if (cwd == NULL || strncmp (cwd, path, strlen(cwd)) == 0) {
+ ap_snprintf(buf, sizeof(buf), "</H2>\n<HR><PRE>");
+ } else {
+ ap_snprintf(buf, sizeof(buf), "</H2>\n(%s)\n<HR><PRE>", cwd);
}
- ap_snprintf(buf, sizeof(buf), "</H2>\n<HR><PRE>");
- ap_bputs(buf, con->client);
- if (f2 != NULL)
- ap_bputs(buf, f2);
- total_bytes_sent += strlen(buf);
-
- for (hostlen=0; url[hostlen]!='/'; ++hostlen)
- continue;
- if (url[hostlen] == '/' && url[hostlen+1] == '/') {
- for (hostlen+=2; url[hostlen]!='/' && url[hostlen]!='?'; ++hostlen)
- continue;
- } else
- hostlen = 0;
+ total_bytes_sent += ap_proxy_bputs2(buf, con->client, c);
while (!con->aborted) {
n = ap_bgets(buf, sizeof buf, f);
if (n == -1) { /* input error */
- if (f2 != NULL)
- f2 = ap_proxy_cache_error(c);
+ if (c != NULL)
+ c = ap_proxy_cache_error(c);
break;
}
if (n == 0)
@@ -364,20 +331,19 @@
if (buf[0] == 'l' && (filename=strstr(buf, " -> ")) != NULL) {
char *link_ptr = filename;
- do
+ do {
filename--;
- while (filename[0] != ' ');
- *(filename++) = 0;
- *(link_ptr++) = 0;
+ } while (filename[0] != ' ');
+ *(filename++) = '\0';
+ *(link_ptr++) = '\0';
if ((n = strlen(link_ptr)) > 1 && link_ptr[n - 1] == '\n')
link_ptr[n - 1] = '\0';
- ap_snprintf(urlptr, sizeof(urlptr), "%s%s%s", url+hostlen, (url[strlen(url) - 1] == '/' ? "" : "/"), filename);
ap_snprintf(buf2, sizeof(buf2), "%s <A HREF=\"%s\">%s %s</A>\n", buf, filename, filename, link_ptr);
ap_cpystrn(buf, buf2, sizeof(buf));
n = strlen(buf);
}
- else if (buf[0] == 'd' || buf[0] == '-' || buf[0] == 'l' || isdigit(buf[0])) {
- if (isdigit(buf[0])) { /* handle DOS dir */
+ else if (buf[0] == 'd' || buf[0] == '-' || buf[0] == 'l' || ap_isdigit(buf[0])) {
+ if (ap_isdigit(buf[0])) { /* handle DOS dir */
searchptr = strchr(buf, '<');
if (searchptr != NULL)
*searchptr = '[';
@@ -416,9 +382,8 @@
o = 0;
total_bytes_sent += n;
- if (f2 != NULL)
- if (ap_bwrite(f2, buf, n) != n)
- f2 = ap_proxy_cache_error(c);
+ if (c != NULL && c->fp && ap_bwrite(c->fp, buf, n) != n)
+ c = ap_proxy_cache_error(c);
while (n && !r->connection->aborted) {
w = ap_bwrite(con->client, &buf[o], n);
@@ -429,52 +394,71 @@
o += w;
}
}
- site = "</PRE><HR>\n";
- ap_bputs(site, con->client);
- if (f2 != NULL)
- ap_bputs(site, f2);
- total_bytes_sent += strlen(site);
-
- sig = ap_psignature("", r);
- ap_bputs(sig, con->client);
- if (f2 != NULL)
- ap_bputs(sig, f2);
- total_bytes_sent += strlen(sig);
-
- site = "</BODY></HTML>\n";
- ap_bputs(site, con->client);
- if (f2 != NULL)
- ap_bputs(site, f2);
- total_bytes_sent += strlen(site);
+
+ total_bytes_sent += ap_proxy_bputs2("</PRE><HR>\n", con->client, c);
+ total_bytes_sent += ap_proxy_bputs2(ap_psignature("", r), con->client, c);
+ total_bytes_sent += ap_proxy_bputs2("</BODY></HTML>\n", con->client, c);
+
ap_bflush(con->client);
return total_bytes_sent;
}
+/* Common routine for failed authorization (i.e., missing or wrong password)
+ * to an ftp service. This causes most browsers to retry the request
+ * with username and password (which was presumably queried from the user)
+ * supplied in the Authorization: header.
+ * Note that we "invent" a realm name which consists of the
+ * ftp://user@host part of the reqest (sans password -if supplied but invalid-)
+ */
+static int ftp_unauthorized (request_rec *r, int log_it)
+{
+ r->proxyreq = 0;
+ /* Log failed requests if they supplied a password
+ * (log username/password guessing attempts)
+ */
+ if (log_it)
+ ap_log_rerror(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r,
+ "proxy: missing or failed auth to %s",
+ ap_unparse_uri_components(r->pool,
+ &r->parsed_uri, UNP_OMITPATHINFO));
+
+ ap_table_setn(r->err_headers_out, "WWW-Authenticate",
+ ap_pstrcat(r->pool, "Basic realm=\"",
+ ap_unparse_uri_components(r->pool, &r->parsed_uri,
+ UNP_OMITPASSWORD|UNP_OMITPATHINFO),
+ "\"", NULL));
+
+ return HTTP_UNAUTHORIZED;
+}
+
/*
* Handles direct access of ftp:// URLs
* Original (Non-PASV) version from
* Troy Morrison <sp...@zoom.com>
* PASV added by Chuck
*/
-int ap_proxy_ftp_handler(request_rec *r, struct cache_req *c, char *url)
+int ap_proxy_ftp_handler(request_rec *r, cache_req *c, char *url)
{
- char *host, *path, *strp, *user, *password, *parms;
+ char *host, *path, *strp, *parms;
+ char *cwd = NULL;
+ char *user = NULL;
+/* char *account = NULL; how to supply an account in a URL? */
+ const char *password = NULL;
const char *err;
- int port, userlen, i, j, len, sock, dsock, rc, nocache;
- int passlen = 0;
+ int port, i, j, len, sock, dsock, rc, nocache = 0;
int csd = 0;
struct sockaddr_in server;
struct hostent server_hp;
- struct hdr_entry *hdr;
struct in_addr destaddr;
- array_header *resp_hdrs;
- BUFF *f, *cache;
+ table *resp_hdrs;
+ BUFF *f;
BUFF *data = NULL;
pool *p = r->pool;
int one = 1;
const PRUint32 zero = 0L;
NET_SIZE_T clen;
+ struct tbl_do_args tdo;
void *sconf = r->server->module_config;
proxy_server_conf *conf =
@@ -492,8 +476,7 @@
char *pstr;
/* stuff for responses */
- char *resp;
- int resplen;
+ char resp[MAX_STRING_LEN];
char *size = NULL;
/* we only support GET and HEAD */
@@ -501,50 +484,48 @@
if (r->method_number != M_GET)
return HTTP_NOT_IMPLEMENTED;
-/* allocate a buffer for the response message */
- resplen = MAX_STRING_LEN;
- resp = (char *)ap_palloc(r->pool, resplen);
-
/* We break the URL into host, port, path-search */
-
- host = ap_pstrdup(p, url + 6);
- port = DEFAULT_FTP_PORT;
- path = strchr(host, '/');
- if (path == NULL)
- path = "";
- else
- *(path++) = '\0';
- user = password = NULL;
- nocache = 0;
- strp = strchr(host, '@');
- if (strp != NULL) {
- (*strp++) = '\0';
- user = host;
- host = strp;
-/* find password */
- strp = strchr(user, ':');
- if (strp != NULL) {
- *(strp++) = '\0';
- password = strp;
- passlen = decodeenc(password);
+ host = r->parsed_uri.hostname;
+ port = (r->parsed_uri.port != 0)
+ ? r->parsed_uri.port
+ : ap_default_port_for_request(r);
+ path = ap_pstrdup(p, r->parsed_uri.path);
+ path = (path != NULL && path[0] != '\0') ? &path[1] : "";
+
+ /* The "Authorization:" header must be checked first.
+ * We allow the user to "override" the URL-coded user [ & password ]
+ * in the Browsers' User&Password Dialog.
+ * NOTE that this is only marginally more secure than having the
+ * password travel in plain as part of the URL, because Basic Auth
+ * simply uuencodes the plain text password.
+ * But chances are still smaller that the URL is logged regularly.
+ */
+ if ((password = ap_table_get(r->headers_in, "Authorization")) != NULL
+ && strcasecmp(ap_getword(r->pool, &password, ' '), "Basic") == 0
+ && (password = ap_uudecode(r->pool, password))[0] != ':') {
+ /* Note that this allocation has to be made from r->connection->pool
+ * because it has the lifetime of the connection. The other allocations
+ * are temporary and can be tossed away any time.
+ */
+ user = ap_getword_nulls (r->connection->pool, &password, ':');
+ r->connection->ap_auth_type = "Basic";
+ r->connection->user = r->parsed_uri.user = user;
+ nocache = 1; /* This resource only accessible with username/password */
+ }
+ else if ((user = r->parsed_uri.user) != NULL) {
+ user = ap_pstrdup(p, user);
+ decodeenc(user);
+ if ((password = r->parsed_uri.password) != NULL) {
+ char *tmp = ap_pstrdup(p, password);
+ decodeenc(tmp);
+ password = tmp;
}
- userlen = decodeenc(user);
- nocache = 1; /* don't cache when a username is supplied */
+ nocache = 1; /* This resource only accessible with username/password */
}
else {
user = "anonymous";
- userlen = 9;
-
password = "apache_proxy@";
- passlen = strlen(password);
- }
-
- strp = strchr(host, ':');
- if (strp != NULL) {
- *(strp++) = '\0';
- if (isdigit(*strp))
- port = atoi(strp);
}
/* check if ProxyBlock directive on this host */
@@ -552,7 +533,7 @@
for (i = 0; i < conf->noproxies->nelts; i++) {
if ((npent[i].name != NULL && strstr(host, npent[i].name) != NULL)
|| destaddr.s_addr == npent[i].addr.s_addr || npent[i].name[0] == '*')
- return ap_proxyerror(r, "Connect to remote machine blocked");
+ return ap_proxyerror(r, /*HTTP_FORBIDDEN*/ "Connect to remote machine blocked");
}
Explain2("FTP: connect to %s:%d", host, port);
@@ -570,24 +551,23 @@
sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error creating socket");
return HTTP_INTERNAL_SERVER_ERROR;
}
- if (conf->recv_buffer_size) {
- if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
+ if (conf->recv_buffer_size > 0
+ && setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(const char *) &conf->recv_buffer_size, sizeof(int))
== -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
- }
}
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &one,
sizeof(one)) == -1) {
#ifndef _OSD_POSIX /* BS2000 has this option "always on" */
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error setting reuseaddr option: setsockopt(SO_REUSEADDR)");
ap_pclosesocket(p, sock);
return HTTP_INTERNAL_SERVER_ERROR;
@@ -631,38 +611,64 @@
ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1);
#endif /*CHARSET_EBCDIC*/
-/* possible results: 120, 220, 421 */
+/* possible results: */
+ /* 120 Service ready in nnn minutes. */
+ /* 220 Service ready for new user. */
+ /* 421 Service not available, closing control connection. */
ap_hard_timeout("proxy ftp", r);
- i = ftp_getrc(f);
+ i = ftp_getrc_msg(f, resp, sizeof resp);
Explain1("FTP: returned status %d", i);
if (i == -1) {
+ ap_kill_timeout(r);
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
+ }
+#if 0
+ if (i == 120) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error reading from remote server");
+ /* RFC2068 states:
+ * 14.38 Retry-After
+ *
+ * The Retry-After response-header field can be used with a 503 (Service
+ * Unavailable) response to indicate how long the service is expected to
+ * be unavailable to the requesting client. The value of this field can
+ * be either an HTTP-date or an integer number of seconds (in decimal)
+ * after the time of the response.
+ * Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds )
+ */
+ ap_set_header("Retry-After", ap_psprintf(p, "%u", 60*wait_mins);
+ return ap_proxyerror(r, /*HTTP_SERVICE_UNAVAILABLE*/ resp);
}
+#endif
if (i != 220) {
ap_kill_timeout(r);
- return HTTP_BAD_GATEWAY;
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ resp);
}
Explain0("FTP: connected.");
- ap_bputs("USER ", f);
- ap_bwrite(f, user, userlen);
- ap_bputs(CRLF, f);
+ ap_bvputs(f, "USER ", user, CRLF, NULL);
ap_bflush(f); /* capture any errors */
Explain1("FTP: USER %s", user);
/* possible results; 230, 331, 332, 421, 500, 501, 530 */
/* states: 1 - error, 2 - success; 3 - send password, 4,5 fail */
+ /* 230 User logged in, proceed. */
+ /* 331 User name okay, need password. */
+ /* 332 Need account for login. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* (This may include errors such as command line too long.) */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 530 Not logged in. */
i = ftp_getrc(f);
Explain1("FTP: returned status %d", i);
if (i == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (i == 530) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Not logged in");
+ return ftp_unauthorized (r, 1); /* log it: user name guessing attempt? */
}
if (i != 230 && i != 331) {
ap_kill_timeout(r);
@@ -670,27 +676,34 @@
}
if (i == 331) { /* send password */
- if (password == NULL)
- return HTTP_FORBIDDEN;
- ap_bputs("PASS ", f);
- ap_bwrite(f, password, passlen);
- ap_bputs(CRLF, f);
+ if (password == NULL) {
+ return ftp_unauthorized (r, 0);
+ }
+ ap_bvputs(f, "PASS ", password, CRLF, NULL);
ap_bflush(f);
Explain1("FTP: PASS %s", password);
/* possible results 202, 230, 332, 421, 500, 501, 503, 530 */
+ /* 230 User logged in, proceed. */
+ /* 332 Need account for login. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 503 Bad sequence of commands. */
+ /* 530 Not logged in. */
i = ftp_getrc(f);
Explain1("FTP: returned status %d", i);
if (i == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (i == 332) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Need account for login");
+ return ap_proxyerror(r, /*HTTP_UNAUTHORIZED*/ "Need account for login");
}
+ /* @@@ questionable -- we might as well return a 403 Forbidden here */
if (i == 530) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Not logged in");
+ return ftp_unauthorized (r, 1); /* log it: passwd guessing attempt? */
}
if (i != 230 && i != 202) {
ap_kill_timeout(r);
@@ -698,8 +711,8 @@
}
}
-/* set the directory */
-/* this is what we must do if we don't know the OS type of the remote
+/* set the directory (walk directory component by component):
+ * this is what we must do if we don't know the OS type of the remote
* machine
*/
for (;;) {
@@ -709,18 +722,23 @@
*strp = '\0';
len = decodeenc(path);
- ap_bputs("CWD ", f);
- ap_bwrite(f, path, len);
- ap_bputs(CRLF, f);
+ ap_bvputs(f, "CWD ", path, CRLF, NULL);
ap_bflush(f);
Explain1("FTP: CWD %s", path);
+ *strp = '/';
/* responses: 250, 421, 500, 501, 502, 530, 550 */
-/* 1,3 error, 2 success, 4,5 failure */
+ /* 250 Requested file action okay, completed. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
i = ftp_getrc(f);
Explain1("FTP: returned status %d", i);
if (i == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (i == 550) {
ap_kill_timeout(r);
@@ -753,11 +771,17 @@
ap_bflush(f);
Explain0("FTP: TYPE I");
/* responses: 200, 421, 500, 501, 504, 530 */
+ /* 200 Command okay. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 504 Command not implemented for that parameter. */
+ /* 530 Not logged in. */
i = ftp_getrc(f);
Explain1("FTP: returned status %d", i);
if (i == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (i != 200 && i != 504) {
ap_kill_timeout(r);
@@ -771,7 +795,7 @@
/* try to set up PASV data connection first */
dsock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (dsock == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error creating PASV socket");
ap_bclose(f);
ap_kill_timeout(r);
@@ -781,7 +805,7 @@
if (conf->recv_buffer_size) {
if (setsockopt(dsock, SOL_SOCKET, SO_RCVBUF,
(const char *) &conf->recv_buffer_size, sizeof(int)) == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
}
}
@@ -790,10 +814,15 @@
ap_bflush(f);
Explain0("FTP: PASV command issued");
/* possible results: 227, 421, 500, 501, 502, 530 */
+ /* 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ /* 530 Not logged in. */
i = ap_bgets(pasv, sizeof(pasv), f);
-
if (i == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,
"PASV: control connection is toast");
ap_pclosesocket(p, dsock);
ap_bclose(f);
@@ -848,7 +877,7 @@
if (!pasvmode) { /* set up data connection */
clen = sizeof(struct sockaddr_in);
if (getsockname(sock, (struct sockaddr *) &server, &clen) < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error getting socket address");
ap_bclose(f);
ap_kill_timeout(r);
@@ -857,7 +886,7 @@
dsock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (dsock == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error creating socket");
ap_bclose(f);
ap_kill_timeout(r);
@@ -867,7 +896,7 @@
if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *) &one,
sizeof(one)) == -1) {
#ifndef _OSD_POSIX /* BS2000 has this option "always on" */
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error setting reuseaddr option");
ap_pclosesocket(p, dsock);
ap_bclose(f);
@@ -881,7 +910,7 @@
char buff[22];
ap_snprintf(buff, sizeof(buff), "%s:%d", inet_ntoa(server.sin_addr), server.sin_port);
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error binding to ftp data socket %s", buff);
ap_bclose(f);
ap_pclosesocket(p, dsock);
@@ -890,7 +919,7 @@
listen(dsock, 2); /* only need a short queue */
}
-/* set request */
+/* set request; "path" holds last path component */
len = decodeenc(path);
/* TM - if len == 0 then it must be a directory (you can't RETR nothing) */
@@ -899,27 +928,31 @@
parms = "d";
}
else {
- ap_bputs("SIZE ", f);
- ap_bwrite(f, path, len);
- ap_bputs(CRLF, f);
+ ap_bvputs(f, "SIZE ", path, CRLF, NULL);
ap_bflush(f);
Explain1("FTP: SIZE %s", path);
- i = ftp_getrc_msg(f, resp, resplen);
+ i = ftp_getrc_msg(f, resp, sizeof resp);
Explain2("FTP: returned status %d with response %s", i, resp);
if (i != 500) { /* Size command not recognized */
if (i == 550) { /* Not a regular file */
Explain0("FTP: SIZE shows this is a directory");
parms = "d";
- ap_bputs("CWD ", f);
- ap_bwrite(f, path, len);
- ap_bputs(CRLF, f);
+ ap_bvputs(f, "CWD ", path, CRLF, NULL);
ap_bflush(f);
Explain1("FTP: CWD %s", path);
i = ftp_getrc(f);
+ /* possible results: 250, 421, 500, 501, 502, 530, 550 */
+ /* 250 Requested file action okay, completed. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
Explain1("FTP: returned status %d", i);
if (i == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (i == 550) {
ap_kill_timeout(r);
@@ -933,7 +966,7 @@
len = 0;
}
else if (i == 213) { /* Size command ok */
- for (j = 0; j < resplen && isdigit(resp[j]); j++)
+ for (j = 0; j < sizeof resp && ap_isdigit(resp[j]); j++)
;
resp[j] = '\0';
if (resp[0] != '\0')
@@ -942,41 +975,86 @@
}
}
+#ifdef AUTODETECT_PWD
+ ap_bvputs(f, "PWD", CRLF, NULL);
+ ap_bflush(f);
+ Explain0("FTP: PWD");
+/* responses: 257, 500, 501, 502, 421, 550 */
+ /* 257 "<directory-name>" <commentary> */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc_msg(f, resp, sizeof resp);
+ Explain1("FTP: PWD returned status %d", i);
+ if (i == -1 || i == 421) {
+ ap_kill_timeout(r);
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
+ }
+ if (i == 550) {
+ ap_kill_timeout(r);
+ return HTTP_NOT_FOUND;
+ }
+ if (i == 257) {
+ const char *dirp = resp;
+ cwd = ap_getword_conf(r->pool, &dirp);
+ }
+#endif /*AUTODETECT_PWD*/
+
if (parms[0] == 'd') {
if (len != 0)
- ap_bputs("LIST ", f);
+ ap_bvputs(f, "LIST ", path, CRLF, NULL);
else
- ap_bputs("LIST -lag", f);
+ ap_bputs("LIST -lag" CRLF, f);
Explain1("FTP: LIST %s", (len == 0 ? "" : path));
}
else {
- ap_bputs("RETR ", f);
+ ap_bvputs(f, "RETR ", path, CRLF, NULL);
Explain1("FTP: RETR %s", path);
}
- ap_bwrite(f, path, len);
- ap_bputs(CRLF, f);
ap_bflush(f);
/* RETR: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 530, 550
NLST: 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 502, 530 */
+ /* 110 Restart marker reply. */
+ /* 125 Data connection already open; transfer starting. */
+ /* 150 File status okay; about to open data connection. */
+ /* 226 Closing data connection. */
+ /* 250 Requested file action okay, completed. */
+ /* 421 Service not available, closing control connection. */
+ /* 425 Can't open data connection. */
+ /* 426 Connection closed; transfer aborted. */
+ /* 450 Requested file action not taken. */
+ /* 451 Requested action aborted. Local error in processing. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
rc = ftp_getrc(f);
Explain1("FTP: returned status %d", rc);
if (rc == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (rc == 550) {
Explain0("FTP: RETR failed, trying LIST instead");
parms = "d";
- ap_bputs("CWD ", f);
- ap_bwrite(f, path, len);
- ap_bputs(CRLF, f);
+ ap_bvputs(f, "CWD ", path, CRLF, NULL);
ap_bflush(f);
Explain1("FTP: CWD %s", path);
+ /* possible results: 250, 421, 500, 501, 502, 530, 550 */
+ /* 250 Requested file action okay, completed. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ /* 530 Not logged in. */
+ /* 550 Requested action not taken. */
rc = ftp_getrc(f);
Explain1("FTP: returned status %d", rc);
if (rc == -1) {
ap_kill_timeout(r);
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
if (rc == 550) {
ap_kill_timeout(r);
@@ -987,35 +1065,64 @@
return HTTP_BAD_GATEWAY;
}
+#ifdef AUTODETECT_PWD
+ ap_bvputs(f, "PWD", CRLF, NULL);
+ ap_bflush(f);
+ Explain0("FTP: PWD");
+/* responses: 257, 500, 501, 502, 421, 550 */
+ /* 257 "<directory-name>" <commentary> */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
+ /* 550 Requested action not taken. */
+ i = ftp_getrc_msg(f, resp, sizeof resp);
+ Explain1("FTP: PWD returned status %d", i);
+ if (i == -1 || i == 421) {
+ ap_kill_timeout(r);
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
+ }
+ if (i == 550) {
+ ap_kill_timeout(r);
+ return HTTP_NOT_FOUND;
+ }
+ if (i == 257) {
+ const char *dirp = resp;
+ cwd = ap_getword_conf(r->pool, &dirp);
+ }
+#endif /*AUTODETECT_PWD*/
+
ap_bputs("LIST -lag" CRLF, f);
ap_bflush(f);
Explain0("FTP: LIST -lag");
rc = ftp_getrc(f);
Explain1("FTP: returned status %d", rc);
if (rc == -1)
- return ap_proxyerror(r, "Error sending to remote server");
+ return ap_proxyerror(r, /*HTTP_BAD_GATEWAY*/ "Error reading from remote server");
}
ap_kill_timeout(r);
if (rc != 125 && rc != 150 && rc != 226 && rc != 250)
return HTTP_BAD_GATEWAY;
- r->status = 200;
+ r->status = HTTP_OK;
r->status_line = "200 OK";
- resp_hdrs = ap_make_array(p, 2, sizeof(struct hdr_entry));
+ resp_hdrs = ap_make_table(p, 2);
+ c->hdrs = resp_hdrs;
+
if (parms[0] == 'd')
- ap_proxy_add_header(resp_hdrs, "Content-Type", "text/html", HDR_REP);
+ ap_table_set(resp_hdrs, "Content-Type", "text/html");
else {
if (r->content_type != NULL) {
- ap_proxy_add_header(resp_hdrs, "Content-Type", r->content_type,
- HDR_REP);
+ ap_table_set(resp_hdrs, "Content-Type", r->content_type);
Explain1("FTP: Content-Type set to %s", r->content_type);
}
else {
- ap_proxy_add_header(resp_hdrs, "Content-Type", "text/plain", HDR_REP);
+ ap_table_set(resp_hdrs, "Content-Type", "text/plain");
}
if (parms[0] != 'a' && size != NULL) {
- ap_proxy_add_header(resp_hdrs, "Content-Length", size, HDR_REP);
+ /* We "trust" the ftp server to really serve (size) bytes... */
+ ap_table_set(resp_hdrs, "Content-Length", size);
Explain1("FTP: Content-Length set to %s", size);
}
}
@@ -1034,7 +1141,6 @@
ap_bclose(f);
return i;
}
- cache = c->fp;
if (!pasvmode) { /* wait for connection */
ap_hard_timeout("proxy ftp data connect", r);
@@ -1043,12 +1149,13 @@
csd = accept(dsock, (struct sockaddr *) &server, &clen);
while (csd == -1 && errno == EINTR);
if (csd == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: failed to accept data connection");
ap_pclosesocket(p, dsock);
ap_bclose(f);
ap_kill_timeout(r);
- ap_proxy_cache_error(c);
+ if (c != NULL)
+ c = ap_proxy_cache_error(c);
return HTTP_BAD_GATEWAY;
}
ap_note_cleanups_for_socket(p, csd);
@@ -1070,45 +1177,38 @@
/* write status line */
if (!r->assbackwards)
ap_rvputs(r, "HTTP/1.0 ", r->status_line, CRLF, NULL);
- if (cache != NULL)
- if (ap_bvputs(cache, "HTTP/1.0 ", r->status_line, CRLF,
- NULL) == -1)
- cache = ap_proxy_cache_error(c);
+ if (c != NULL && c->fp != NULL
+ && ap_bvputs(c->fp, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1)
+ c = ap_proxy_cache_error(c);
/* send headers */
- len = resp_hdrs->nelts;
- hdr = (struct hdr_entry *) resp_hdrs->elts;
- for (i = 0; i < len; i++) {
- if (hdr[i].field == NULL || hdr[i].value == NULL ||
- hdr[i].value[0] == '\0')
- continue;
- if (!r->assbackwards)
- ap_rvputs(r, hdr[i].field, ": ", hdr[i].value, CRLF, NULL);
- if (cache != NULL)
- if (ap_bvputs(cache, hdr[i].field, ": ", hdr[i].value, CRLF,
- NULL) == -1)
- cache = ap_proxy_cache_error(c);
- }
+ tdo.req = r;
+ tdo.cache = c;
+ ap_table_do(ap_proxy_send_hdr_line, &tdo, resp_hdrs, NULL);
if (!r->assbackwards)
ap_rputs(CRLF, r);
- if (cache != NULL)
- if (ap_bputs(CRLF, cache) == -1)
- cache = ap_proxy_cache_error(c);
+ if (c != NULL && c->fp != NULL && ap_bputs(CRLF, c->fp) == -1)
+ c = ap_proxy_cache_error(c);
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
r->sent_bodyct = 1;
/* send body */
if (!r->header_only) {
- if (parms[0] != 'd')
- ap_proxy_send_fb(data, r, cache, c);
- else
- send_dir(data, r, cache, c, url);
+ if (parms[0] != 'd') {
+/* we need to set this for ap_proxy_send_fb()... */
+ if (c != NULL)
+ c->cache_completion = 0;
+ ap_proxy_send_fb(data, r, c);
+ } else
+ send_dir(data, r, c, cwd);
if (rc == 125 || rc == 150)
rc = ftp_getrc(f);
+
+ /* XXX: we checked for 125||150||226||250 above. This is redundant. */
if (rc != 226 && rc != 250)
- ap_proxy_cache_error(c);
+ c = ap_proxy_cache_error(c);
}
else {
/* abort the transfer */
@@ -1118,6 +1218,12 @@
ap_bclose(data);
Explain0("FTP: ABOR");
/* responses: 225, 226, 421, 500, 501, 502 */
+ /* 225 Data connection open; no transfer in progress. */
+ /* 226 Closing data connection. */
+ /* 421 Service not available, closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ /* 501 Syntax error in parameters or arguments. */
+ /* 502 Command not implemented. */
i = ftp_getrc(f);
Explain1("FTP: returned status %d", i);
}
@@ -1130,6 +1236,10 @@
ap_bflush(f);
Explain0("FTP: QUIT");
/* responses: 221, 500 */
+ /* 221 Service closing control connection. */
+ /* 500 Syntax error, command unrecognized. */
+ i = ftp_getrc(f);
+ Explain1("FTP: QUIT: status %d", i);
if (pasvmode)
ap_bclose(data);
1.3 +115 -59 apache-2.0/apache-nspr/modules/proxy/proxy_http.c
Index: proxy_http.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/proxy/proxy_http.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- proxy_http.c 1998/06/30 08:57:09 1.2
+++ proxy_http.c 1998/09/22 18:05:27 1.3
@@ -145,9 +145,9 @@
while (*next) {
name = next;
- while (*next && !isspace(*next) && (*next != ','))
+ while (*next && !ap_isspace(*next) && (*next != ','))
++next;
- while (*next && (isspace(*next) || (*next == ','))) {
+ while (*next && (ap_isspace(*next) || (*next == ','))) {
*next = '\0';
++next;
}
@@ -165,26 +165,29 @@
* we return DECLINED so that we can try another proxy. (Or the direct
* route.)
*/
-int ap_proxy_http_handler(request_rec *r, struct cache_req *c, char *url,
+int ap_proxy_http_handler(request_rec *r, cache_req *c, char *url,
const char *proxyhost, int proxyport)
{
const char *strp;
char *strp2;
const char *err, *desthost;
int i, j, sock, len, backasswards;
- array_header *reqhdrs_arr, *resp_hdrs;
+ array_header *reqhdrs_arr;
+ table *resp_hdrs;
table_entry *reqhdrs;
struct sockaddr_in server;
struct in_addr destaddr;
struct hostent server_hp;
- BUFF *f, *cache;
- struct hdr_entry *hdr;
+ BUFF *f;
char buffer[HUGE_STRING_LEN];
+ char portstr[32];
pool *p = r->pool;
const PRUint32 zero = 0L;
int destport = 0;
char *destportstr = NULL;
const char *urlptr = NULL;
+ const char *datestr;
+ struct tbl_do_args tdo;
void *sconf = r->server->module_config;
proxy_server_conf *conf =
@@ -219,7 +222,7 @@
strp2 = strchr(desthost, ':');
if (strp2 != NULL) {
*(strp2++) = '\0';
- if (isdigit(*strp2)) {
+ if (ap_isdigit(*strp2)) {
destport = atoi(strp2);
destportstr = strp2;
}
@@ -248,7 +251,7 @@
sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"proxy: error creating socket");
return HTTP_INTERNAL_SERVER_ERROR;
}
@@ -257,7 +260,7 @@
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(const char *) &conf->recv_buffer_size, sizeof(int))
== -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default");
}
}
@@ -301,19 +304,48 @@
ap_hard_timeout("proxy send", r);
ap_bvputs(f, r->method, " ", proxyhost ? url : urlptr, " HTTP/1.0" CRLF,
NULL);
- ap_bvputs(f, "Host: ", desthost, NULL);
if (destportstr != NULL && destport != DEFAULT_HTTP_PORT)
- ap_bvputs(f, ":", destportstr, CRLF, NULL);
+ ap_bvputs(f, "Host: ", desthost, ":", destportstr, CRLF, NULL);
else
- ap_bputs(CRLF, f);
+ ap_bvputs(f, "Host: ", desthost, CRLF, NULL);
+ if (conf->viaopt == via_block) {
+ /* Block all outgoing Via: headers */
+ ap_table_unset(r->headers_in, "Via");
+ } else if (conf->viaopt != via_off) {
+ /* Create a "Via:" request header entry and merge it */
+ i = ap_get_server_port(r);
+ if (ap_is_default_port(i,r)) {
+ strcpy(portstr,"");
+ } else {
+ ap_snprintf(portstr, sizeof portstr, ":%d", i);
+ }
+ /* Generate outgoing Via: header with/without server comment: */
+ ap_table_mergen(r->headers_in, "Via",
+ (conf->viaopt == via_full)
+ ? ap_psprintf(p, "%d.%d %s%s (%s)",
+ HTTP_VERSION_MAJOR(r->proto_num),
+ HTTP_VERSION_MINOR(r->proto_num),
+ ap_get_server_name(r), portstr,
+ SERVER_BASEVERSION)
+ : ap_psprintf(p, "%d.%d %s%s",
+ HTTP_VERSION_MAJOR(r->proto_num),
+ HTTP_VERSION_MINOR(r->proto_num),
+ ap_get_server_name(r), portstr)
+ );
+ }
+
reqhdrs_arr = ap_table_elts(r->headers_in);
reqhdrs = (table_entry *) reqhdrs_arr->elts;
for (i = 0; i < reqhdrs_arr->nelts; i++) {
if (reqhdrs[i].key == NULL || reqhdrs[i].val == NULL
/* Clear out headers not to send */
|| !strcasecmp(reqhdrs[i].key, "Host") /* Already sent */
- ||!strcasecmp(reqhdrs[i].key, "Proxy-Authorization"))
+ /* XXX: @@@ FIXME: "Proxy-Authorization" should *only* be
+ * suppressed if THIS server requested the authentication,
+ * not when a frontend proxy requested it!
+ */
+ || !strcasecmp(reqhdrs[i].key, "Proxy-Authorization"))
continue;
ap_bvputs(f, reqhdrs[i].key, ": ", reqhdrs[i].val, CRLF, NULL);
}
@@ -322,7 +354,7 @@
/* send the request data, if any. N.B. should we trap SIGPIPE ? */
if (ap_should_client_block(r)) {
- while ((i = ap_get_client_block(r, buffer, HUGE_STRING_LEN)) > 0)
+ while ((i = ap_get_client_block(r, buffer, sizeof buffer)) > 0)
ap_bwrite(f, buffer, i);
}
ap_bflush(f);
@@ -330,16 +362,25 @@
ap_hard_timeout("proxy receive", r);
- len = ap_bgets(buffer, HUGE_STRING_LEN - 1, f);
+ len = ap_bgets(buffer, sizeof buffer - 1, f);
if (len == -1 || len == 0) {
ap_bclose(f);
ap_kill_timeout(r);
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "ap_bgets() - proxy receive - Error reading from remote server %s",
+ proxyhost ? proxyhost : desthost);
return ap_proxyerror(r, "Error reading from remote server");
}
/* Is it an HTTP/1 response? This is buggy if we ever see an HTTP/1.10 */
if (ap_checkmask(buffer, "HTTP/#.# ###*")) {
-/* If not an HTTP/1 messsage or if the status line was > 8192 bytes */
+ int major, minor;
+ if (2 != sscanf(buffer, "HTTP/%u.%u", &major, &minor)) {
+ major = 1;
+ minor = 0;
+ }
+
+/* If not an HTTP/1 message or if the status line was > 8192 bytes */
if (buffer[5] != '1' || buffer[len - 1] != '\n') {
ap_bclose(f);
ap_kill_timeout(r);
@@ -357,9 +398,36 @@
/* N.B. for HTTP/1.0 clients, we have to fold line-wrapped headers */
/* Also, take care with headers with multiple occurences. */
- resp_hdrs = ap_proxy_read_headers(p, buffer, HUGE_STRING_LEN, f);
+ resp_hdrs = ap_proxy_read_headers(r, buffer, HUGE_STRING_LEN, f);
+ if (resp_hdrs == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server,
+ "proxy: Bad HTTP/%d.%d header returned by %s (%s)",
+ major, minor, r->uri, r->method);
+ resp_hdrs = ap_make_table(p, 20);
+ nocache = 1; /* do not cache this broken file */
+ }
+
+ if (conf->viaopt != via_off && conf->viaopt != via_block) {
+ /* Create a "Via:" response header entry and merge it */
+ i = ap_get_server_port(r);
+ if (ap_is_default_port(i,r)) {
+ strcpy(portstr,"");
+ } else {
+ ap_snprintf(portstr, sizeof portstr, ":%d", i);
+ }
+ ap_table_mergen((table *)resp_hdrs, "Via",
+ (conf->viaopt == via_full)
+ ? ap_psprintf(p, "%d.%d %s%s (%s)",
+ major, minor,
+ ap_get_server_name(r), portstr,
+ SERVER_BASEVERSION)
+ : ap_psprintf(p, "%d.%d %s%s",
+ major, minor,
+ ap_get_server_name(r), portstr)
+ );
+ }
- clear_connection(p, (table *) resp_hdrs); /* Strip Connection hdrs */
+ clear_connection(p, resp_hdrs); /* Strip Connection hdrs */
}
else {
/* an http/0.9 response */
@@ -368,30 +436,29 @@
r->status_line = "200 OK";
/* no headers */
- resp_hdrs = ap_make_array(p, 2, sizeof(struct hdr_entry));
+ resp_hdrs = ap_make_table(p, 20);
}
+ c->hdrs = resp_hdrs;
+
ap_kill_timeout(r);
/*
* HTTP/1.0 requires us to accept 3 types of dates, but only generate
* one type
*/
+ if ((datestr = ap_table_get(resp_hdrs, "Date")) != NULL)
+ ap_table_set(resp_hdrs, "Date", ap_proxy_date_canon(p, datestr));
+ if ((datestr = ap_table_get(resp_hdrs, "Last-Modified")) != NULL)
+ ap_table_set(resp_hdrs, "Last-Modified", ap_proxy_date_canon(p, datestr));
+ if ((datestr = ap_table_get(resp_hdrs, "Expires")) != NULL)
+ ap_table_set(resp_hdrs, "Expires", ap_proxy_date_canon(p, datestr));
+
+ if ((datestr = ap_table_get(resp_hdrs, "Location")) != NULL)
+ ap_table_set(resp_hdrs, "Location", proxy_location_reverse_map(r, datestr));
+ if ((datestr = ap_table_get(resp_hdrs, "URI")) != NULL)
+ ap_table_set(resp_hdrs, "URI", proxy_location_reverse_map(r, datestr));
- hdr = (struct hdr_entry *) resp_hdrs->elts;
- for (i = 0; i < resp_hdrs->nelts; i++) {
- if (hdr[i].value[0] == '\0')
- continue;
- strp = hdr[i].field;
- if (strcasecmp(strp, "Date") == 0 ||
- strcasecmp(strp, "Last-Modified") == 0 ||
- strcasecmp(strp, "Expires") == 0)
- hdr[i].value = ap_proxy_date_canon(p, hdr[i].value);
- if (strcasecmp(strp, "Location") == 0 ||
- strcasecmp(strp, "URI") == 0)
- hdr[i].value = proxy_location_reverse_map(r, hdr[i].value);
- }
-
/* check if NoCache directive on this host */
for (i = 0; i < conf->nocaches->nelts; i++) {
if ((ncent[i].name != NULL && strstr(desthost, ncent[i].name) != NULL)
@@ -405,46 +472,32 @@
return i;
}
- cache = c->fp;
-
ap_hard_timeout("proxy receive", r);
/* write status line */
if (!r->assbackwards)
ap_rvputs(r, "HTTP/1.0 ", r->status_line, CRLF, NULL);
- if (cache != NULL)
- if (ap_bvputs(cache, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1)
- cache = ap_proxy_cache_error(c);
+ if (c != NULL && c->fp != NULL &&
+ ap_bvputs(c->fp, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1)
+ c = ap_proxy_cache_error(c);
/* send headers */
- for (i = 0; i < resp_hdrs->nelts; i++) {
- if (hdr[i].field == NULL || hdr[i].value == NULL ||
- hdr[i].value[0] == '\0')
- continue;
- if (!r->assbackwards) {
- ap_rvputs(r, hdr[i].field, ": ", hdr[i].value, CRLF, NULL);
- ap_table_set(r->headers_out, hdr[i].field, hdr[i].value);
- }
- if (cache != NULL)
- if (ap_bvputs(cache, hdr[i].field, ": ", hdr[i].value, CRLF,
- NULL) == -1)
- cache = ap_proxy_cache_error(c);
- }
+ tdo.req = r;
+ tdo.cache = c;
+ ap_table_do(ap_proxy_send_hdr_line, &tdo, resp_hdrs, NULL);
if (!r->assbackwards)
ap_rputs(CRLF, r);
- if (cache != NULL)
- if (ap_bputs(CRLF, cache) == -1)
- cache = ap_proxy_cache_error(c);
+ if (c != NULL && c->fp != NULL && ap_bputs(CRLF, c->fp) == -1)
+ c = ap_proxy_cache_error(c);
ap_bsetopt(r->connection->client, BO_BYTECT, &zero);
r->sent_bodyct = 1;
/* Is it an HTTP/0.9 respose? If so, send the extra data */
if (backasswards) {
ap_bwrite(r->connection->client, buffer, len);
- if (cache != NULL)
- if (ap_bwrite(f, buffer, len) != len)
- cache = ap_proxy_cache_error(c);
+ if (c != NULL && c->fp != NULL && ap_bwrite(c->fp, buffer, len) != len)
+ c = ap_proxy_cache_error(c);
}
ap_kill_timeout(r);
@@ -459,8 +512,11 @@
/* send body */
/* if header only, then cache will be NULL */
/* HTTP/1.0 tells us to read to EOF, rather than content-length bytes */
- if (!r->header_only)
- ap_proxy_send_fb(f, r, cache, c);
+ if (!r->header_only) {
+/* we need to set this for ap_proxy_send_fb()... */
+ c->cache_completion = conf->cache.cache_completion;
+ ap_proxy_send_fb(f, r, c);
+ }
ap_proxy_cache_tidy(c);
1.3 +0 -176 apache-2.0/apache-nspr/modules/standard/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/Makefile.tmpl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile.tmpl 1998/06/30 08:57:09 1.2
+++ Makefile.tmpl 1998/09/22 18:05:31 1.3
@@ -4,179 +4,3 @@
$(OBJS) $(OBJS_PIC): Makefile
# DO NOT REMOVE
-mod_access.o: mod_access.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_request.h
-mod_actions.o: mod_actions.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_main.h $(INCDIR)/http_log.h \
- $(INCDIR)/util_script.h
-mod_alias.o: mod_alias.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h
-mod_asis.o: mod_asis.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_log.h $(INCDIR)/util_script.h \
- $(INCDIR)/http_main.h $(INCDIR)/http_request.h
-mod_auth.o: mod_auth.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h
-mod_auth_anon.o: mod_auth_anon.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_request.h
-mod_auth_db.o: mod_auth_db.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h
-mod_auth_dbm.o: mod_auth_dbm.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h
-mod_autoindex.o: mod_autoindex.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_request.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_main.h \
- $(INCDIR)/util_script.h
-mod_cern_meta.o: mod_cern_meta.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/util_script.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_request.h
-mod_cgi.o: mod_cgi.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_main.h $(INCDIR)/http_log.h \
- $(INCDIR)/util_script.h $(INCDIR)/http_conf_globals.h
-mod_digest.o: mod_digest.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/util_md5.h $(INCDIR)/ap_md5.h
-mod_dir.o: mod_dir.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_request.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_main.h \
- $(INCDIR)/util_script.h
-mod_env.o: mod_env.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h
-mod_expires.o: mod_expires.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h
-mod_headers.o: mod_headers.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h
-mod_imap.o: mod_imap.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_main.h $(INCDIR)/http_log.h \
- $(INCDIR)/util_script.h
-mod_include.o: mod_include.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_protocol.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_main.h \
- $(INCDIR)/util_script.h
-mod_info.o: mod_info.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h $(INCDIR)/http_main.h \
- $(INCDIR)/http_protocol.h $(INCDIR)/util_script.h \
- $(INCDIR)/http_conf_globals.h
-mod_log_agent.o: mod_log_agent.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h
-mod_log_config.o: mod_log_config.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h
-mod_log_referer.o: mod_log_referer.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h
-mod_mime.o: mod_mime.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h
-mod_mime_magic.o: mod_mime_magic.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_protocol.h
-mod_negotiation.o: mod_negotiation.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_log.h \
- $(INCDIR)/util_script.h
-mod_rewrite.o: mod_rewrite.c mod_rewrite.h $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_request.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_log.h \
- $(INCDIR)/http_vhost.h
-mod_setenvif.o: mod_setenvif.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_log.h
-mod_so.o: mod_so.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h
-mod_speling.o: mod_speling.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_core.h $(INCDIR)/http_config.h \
- $(INCDIR)/http_log.h
-mod_status.o: mod_status.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
- $(OSDIR)/os.h $(INCDIR)/alloc.h $(INCDIR)/buff.h \
- $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h \
- $(INCDIR)/http_protocol.h $(INCDIR)/http_main.h \
- $(INCDIR)/util_script.h $(INCDIR)/scoreboard.h \
- $(INCDIR)/http_log.h
-mod_unique_id.o: mod_unique_id.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_log.h
-mod_userdir.o: mod_userdir.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h
-mod_usertrack.o: mod_usertrack.c $(INCDIR)/httpd.h \
- $(INCDIR)/conf.h $(OSDIR)/os.h $(INCDIR)/alloc.h \
- $(INCDIR)/buff.h $(INCDIR)/ap.h $(INCDIR)/util_uri.h \
- $(INCDIR)/http_config.h $(INCDIR)/http_core.h
1.3 +7 -7 apache-2.0/apache-nspr/modules/standard/mod_access.c
Index: mod_access.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_access.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_access.c 1998/06/30 08:57:09 1.2
+++ mod_access.c 1998/09/22 18:05:31 1.3
@@ -142,7 +142,7 @@
static int is_ip(const char *host)
{
- while ((*host == '.') || isdigit(*host))
+ while ((*host == '.') || ap_isdigit(*host))
host++;
return (*host == '\0');
}
@@ -210,7 +210,7 @@
a->x.ip.mask = mask;
}
- else if (isdigit(*where) && is_ip(where)) {
+ else if (ap_isdigit(*where) && is_ip(where)) {
/* legacy syntax for ip addrs: a.b.c. ==> a.b.c.0/24 for example */
int shift;
char *t;
@@ -224,11 +224,11 @@
shift = 24;
while (*s) {
t = s;
- if (!isdigit(*t)) {
+ if (!ap_isdigit(*t)) {
a->type = T_FAIL;
return "invalid ip address";
}
- while (isdigit(*t)) {
+ while (ap_isdigit(*t)) {
++t;
}
if (*t == '.') {
@@ -381,9 +381,9 @@
if (ret == FORBIDDEN
&& (ap_satisfies(r) != SATISFY_ANY || !ap_some_auth_required(r))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "client %pI denied by server configuration: %s",
- &r->connection->remote_addr, r->filename);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "client denied by server configuration: %s",
+ r->filename);
}
return ret;
1.3 +1 -1 apache-2.0/apache-nspr/modules/standard/mod_actions.c
Index: mod_actions.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_actions.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_actions.c 1998/06/30 08:57:09 1.2
+++ mod_actions.c 1998/09/22 18:05:32 1.3
@@ -191,7 +191,7 @@
action ? action : ap_default_type(r)))) {
script = t;
if (!r->file_exists) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"File does not exist: %s", r->filename);
return NOT_FOUND;
}
1.3 +3 -3 apache-2.0/apache-nspr/modules/standard/mod_asis.c
Index: mod_asis.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_asis.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_asis.c 1998/06/30 08:57:09 1.2
+++ mod_asis.c 1998/09/22 18:05:32 1.3
@@ -72,7 +72,7 @@
if (r->method_number != M_GET)
return DECLINED;
if (!r->file_exists) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"File does not exist: %s", r->filename);
return NOT_FOUND;
}
@@ -80,7 +80,7 @@
f = ap_pfopen(r->pool, r->filename, "r");
if (f == NULL) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"file permissions deny server access: %s", r->filename);
return FORBIDDEN;
}
@@ -89,7 +89,7 @@
location = ap_table_get(r->headers_out, "Location");
if (location && location[0] == '/' &&
- ((r->status == HTTP_OK) || is_HTTP_REDIRECT(r->status))) {
+ ((r->status == HTTP_OK) || ap_is_HTTP_REDIRECT(r->status))) {
ap_pfclose(r->pool, f);
1.3 +10 -5 apache-2.0/apache-nspr/modules/standard/mod_auth.c
Index: mod_auth.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_auth.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_auth.c 1998/06/30 08:57:09 1.2
+++ mod_auth.c 1998/09/22 18:05:32 1.3
@@ -126,7 +126,7 @@
const char *rpw, *w;
if (!(f = ap_pcfg_openfile(r->pool, auth_pwfile))) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"Could not open password file: %s", auth_pwfile);
return NULL;
}
@@ -201,7 +201,8 @@
auth_config_rec *sec =
(auth_config_rec *) ap_get_module_config(r->per_dir_config, &auth_module);
conn_rec *c = r->connection;
- char *sent_pw, *real_pw;
+ const char *sent_pw;
+ char *real_pw;
int res;
if ((res = ap_get_basic_auth_pw(r, &sent_pw)))
@@ -213,14 +214,14 @@
if (!(real_pw = get_pw(r, c->user, sec->auth_pwfile))) {
if (!(sec->auth_authoritative))
return DECLINED;
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"user %s not found: %s", c->user, r->uri);
ap_note_basic_auth_failure(r);
return AUTH_REQUIRED;
}
/* anyone know where the prototype for crypt is? */
if (strcmp(real_pw, (char *) crypt(sent_pw, real_pw))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"user %s: password mismatch: %s", c->user, r->uri);
ap_note_basic_auth_failure(r);
return AUTH_REQUIRED;
@@ -240,7 +241,7 @@
register int x;
const char *t, *w;
table *grpstatus;
- array_header *reqs_arr = ap_requires(r);
+ const array_header *reqs_arr = ap_requires(r);
require_line *reqs;
/* BUG FIX: tadc, 11-Nov-1995. If there is no "requires" directive,
@@ -291,6 +292,10 @@
if (!(sec->auth_authoritative))
return DECLINED;
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
+ "access to %s failed, reason: user %s not allowed access",
+ r->uri, user);
+
ap_note_basic_auth_failure(r);
return AUTH_REQUIRED;
}
1.3 +162 -97 apache-2.0/apache-nspr/modules/standard/mod_autoindex.c
Index: mod_autoindex.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_autoindex.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_autoindex.c 1998/06/30 08:57:09 1.2
+++ mod_autoindex.c 1998/09/22 18:05:33 1.3
@@ -94,6 +94,9 @@
#define SUPPRESS_PREAMBLE 64
#define SUPPRESS_COLSORT 128
+#define K_PAD 1
+#define K_NOPAD 0
+
/*
* Define keys for sorting.
*/
@@ -111,6 +114,11 @@
#define DEFAULT_ICON_WIDTH 20
#define DEFAULT_ICON_HEIGHT 22
+/*
+ * Other default dimensions.
+ */
+#define DEFAULT_NAME_WIDTH 23
+
struct item {
char *type;
char *apply_to;
@@ -121,11 +129,14 @@
typedef struct autoindex_config_struct {
char *default_icon;
+ int opts;
+ int name_width;
+ int name_adjust;
int icon_width;
int icon_height;
array_header *icon_list, *alt_list, *desc_list, *ign_list;
- array_header *hdr_list, *rdme_list, *opts_list;
+ array_header *hdr_list, *rdme_list;
} autoindex_config_rec;
@@ -271,17 +282,20 @@
return NULL;
}
-
-static const char *add_opts_int(cmd_parms *cmd, void *d, int opts)
-{
- push_item(((autoindex_config_rec *) d)->opts_list, (char *) (long) opts,
- NULL, cmd->path, NULL);
- return NULL;
-}
-
+/* A legacy directive, FancyIndexing is superseded by the IndexOptions
+ * keyword. But for compatibility..
+ */
static const char *fancy_indexing(cmd_parms *cmd, void *d, int arg)
{
- return add_opts_int(cmd, d, arg ? FANCY_INDEXING : 0);
+ int curopts;
+ int newopts;
+ autoindex_config_rec *cfg;
+
+ cfg = (autoindex_config_rec *) d;
+ curopts = cfg->opts;
+ newopts = (arg ? (curopts | FANCY_INDEXING) : (curopts & !FANCY_INDEXING));
+ cfg->opts = newopts;
+ return NULL;
}
static const char *add_opts(cmd_parms *cmd, void *d, const char *optstr)
@@ -319,35 +333,37 @@
else if (!strcasecmp(w, "None")) {
opts = 0;
}
- else if (!strncasecmp(w, "IconWidth", 9)) {
- if (strchr(w, '=') != NULL) {
- const char *x = ap_pstrdup(cmd->pool, w);
- char *val;
- val = ap_getword(cmd->pool, &x, '=');
- val = ap_getword(cmd->pool, &x, '=');
- d_cfg->icon_width = atoi(val);
- }
- else {
- d_cfg->icon_width = DEFAULT_ICON_WIDTH;
- }
+ else if (!strcasecmp(w, "IconWidth")) {
+ d_cfg->icon_width = DEFAULT_ICON_WIDTH;
+ }
+ else if (!strncasecmp(w, "IconWidth=", 10)) {
+ d_cfg->icon_width = atoi(&w[10]);
+ }
+ else if (!strcasecmp(w, "IconHeight")) {
+ d_cfg->icon_height = DEFAULT_ICON_HEIGHT;
+ }
+ else if (!strncasecmp(w, "IconHeight=", 11)) {
+ d_cfg->icon_height = atoi(&w[11]);
}
- else if (!strncasecmp(w, "IconHeight", 10)) {
- if (strchr(w, '=') != NULL) {
- const char *x = ap_pstrdup(cmd->pool, w);
- char *val;
- val = ap_getword(cmd->pool, &x, '=');
- val = ap_getword(cmd->pool, &x, '=');
- d_cfg->icon_height = atoi(val);
+ else if (!strncasecmp(w, "NameWidth=", 10)) {
+ if (w[10] == '*') {
+ d_cfg->name_adjust = 1;
}
else {
- d_cfg->icon_height = DEFAULT_ICON_HEIGHT;
+ int width = atoi(&w[10]);
+
+ if (width < 1) {
+ return "NameWidth value must be greater than 1";
+ }
+ d_cfg->name_width = width;
}
}
else {
return "Invalid directory indexing option";
}
}
- return add_opts_int(cmd, d, opts);
+ d_cfg->opts = opts;
+ return NULL;
}
#define DIR_CMD_PERMS OR_INDEXES
@@ -389,13 +405,15 @@
new->icon_width = 0;
new->icon_height = 0;
+ new->name_width = DEFAULT_NAME_WIDTH;
+ new->name_adjust = 0;
new->icon_list = ap_make_array(p, 4, sizeof(struct item));
new->alt_list = ap_make_array(p, 4, sizeof(struct item));
new->desc_list = ap_make_array(p, 4, sizeof(struct item));
new->ign_list = ap_make_array(p, 4, sizeof(struct item));
new->hdr_list = ap_make_array(p, 4, sizeof(struct item));
new->rdme_list = ap_make_array(p, 4, sizeof(struct item));
- new->opts_list = ap_make_array(p, 4, sizeof(struct item));
+ new->opts = 0;
return (void *) new;
}
@@ -418,7 +436,9 @@
new->desc_list = ap_append_arrays(p, add->desc_list, base->desc_list);
new->icon_list = ap_append_arrays(p, add->icon_list, base->icon_list);
new->rdme_list = ap_append_arrays(p, add->rdme_list, base->rdme_list);
- new->opts_list = ap_append_arrays(p, add->opts_list, base->opts_list);
+ new->opts = add->opts;
+ new->name_width = add->name_width;
+ new->name_adjust = add->name_adjust;
return new;
}
@@ -495,7 +515,7 @@
#define find_header(d,p) find_item(p,d->hdr_list,0)
#define find_readme(d,p) find_item(p,d->rdme_list,0)
-static char *find_default_icon(autoindex_config_rec * d, char *bogus_name)
+static char *find_default_icon(autoindex_config_rec *d, char *bogus_name)
{
request_rec r;
@@ -510,7 +530,7 @@
return find_item(&r, d->icon_list, 1);
}
-static int ignore_entry(autoindex_config_rec * d, char *path)
+static int ignore_entry(autoindex_config_rec *d, char *path)
{
array_header *list = d->ign_list;
struct item *items = (struct item *) list->elts;
@@ -555,23 +575,6 @@
return 0;
}
-static int find_opts(autoindex_config_rec * d, request_rec *r)
-{
- char *path = r->filename;
- array_header *list = d->opts_list;
- struct item *items = (struct item *) list->elts;
- int i;
-
- for (i = 0; i < list->nelts; ++i) {
- struct item *p = &items[i];
-
- if (!ap_strcmp_match(path, p->apply_path)) {
- return (int) (long) p->type;
- }
- }
- return 0;
-}
-
/*****************************************************************
*
* Actually generating output
@@ -593,7 +596,7 @@
cfg = (autoindex_config_rec *) ap_get_module_config(r->per_dir_config,
&autoindex_module);
- autoindex_opts = find_opts(cfg, r);
+ autoindex_opts = cfg->opts;
/* XXX: this is a load of crap, it needs to do a full sub_req_lookup_uri */
fn = ap_make_full_path(r->pool, name, readme_fname);
fn = ap_pstrcat(r->pool, fn, ".html", NULL);
@@ -690,7 +693,7 @@
}
titlebuf[n] = '\0';
for (x = 0, p = 0; titlebuf[x]; x++) {
- if (toupper(titlebuf[x]) == find[p]) {
+ if (ap_toupper(titlebuf[x]) == find[p]) {
if (!find[++p]) {
if ((p = ap_ind(&titlebuf[++x], '<')) != -1) {
titlebuf[x + p] = '\0';
@@ -739,8 +742,8 @@
p->alt = NULL;
p->desc = NULL;
p->lm_valid = 0;
- p->key = toupper(keyid);
- p->ascending = (toupper(direction) == D_ASCENDING);
+ p->key = ap_toupper(keyid);
+ p->ascending = (ap_toupper(direction) == D_ASCENDING);
if (autoindex_opts & FANCY_INDEXING) {
request_rec *rr = ap_sub_req_lookup_file(name, r);
@@ -776,7 +779,7 @@
return (p);
}
-static char *terminate_description(autoindex_config_rec * d, char *desc,
+static char *terminate_description(autoindex_config_rec *d, char *desc,
int autoindex_opts)
{
int maxsize = 23;
@@ -845,18 +848,70 @@
}
}
+/*
+ * Fit a string into a specified buffer width, marking any
+ * truncation. The size argument is the actual buffer size, including
+ * the \0 termination byte. The buffer will be prefilled with blanks.
+ * If the pad argument is false, any extra spaces at the end of the
+ * buffer are omitted. (Used when constructing anchors.)
+ */
+static ap_inline char *widthify(const char *s, char *buff, int size, int pad)
+{
+ int s_len;
+
+ memset(buff, ' ', size);
+ buff[size - 1] = '\0';
+ s_len = strlen(s);
+ if (s_len > (size - 1)) {
+ ap_cpystrn(buff, s, size);
+ if (size > 1) {
+ buff[size - 2] = '>';
+ }
+ if (size > 2) {
+ buff[size - 3] = '.';
+ }
+ if (size > 3) {
+ buff[size - 4] = '.';
+ }
+ }
+ else {
+ ap_cpystrn(buff, s, s_len + 1);
+ if (pad) {
+ buff[s_len] = ' ';
+ }
+ }
+ return buff;
+}
+
static void output_directories(struct ent **ar, int n,
- autoindex_config_rec * d, request_rec *r,
- int autoindex_opts, char keyid, char direction)
+ autoindex_config_rec *d, request_rec *r,
+ int autoindex_opts, char keyid, char direction)
{
- int x, len;
+ int x;
char *name = r->uri;
char *tp;
int static_columns = (autoindex_opts & SUPPRESS_COLSORT);
pool *scratch = ap_make_sub_pool(r->pool);
+ int name_width;
+ char *name_scratch;
- if (name[0] == '\0')
+ if (name[0] == '\0') {
name = "/";
+ }
+
+ name_width = d->name_width;
+ if (d->name_adjust) {
+ for (x = 0; x < n; x++) {
+ int t = strlen(ar[x]->name);
+ if (t > name_width) {
+ name_width = t;
+ }
+ }
+ }
+ ++name_width;
+ name_scratch = ap_palloc(r->pool, name_width + 1);
+ memset(name_scratch, ' ', name_width);
+ name_scratch[name_width] = '\0';
if (autoindex_opts & FANCY_INDEXING) {
ap_rputs("<PRE>", r);
@@ -874,8 +929,18 @@
}
ap_rputs("> ", r);
}
- emit_link(r, "Name", K_NAME, keyid, direction, static_columns);
- ap_rputs(" ", r);
+ emit_link(r, widthify("Name", name_scratch,
+ (name_width > 5) ? 5 : name_width, K_NOPAD),
+ K_NAME, keyid, direction, static_columns);
+ if (name_width > 5) {
+ memset(name_scratch, ' ', name_width);
+ name_scratch[name_width] = '\0';
+ ap_rputs(&name_scratch[5], r);
+ }
+ /*
+ * Emit the guaranteed-at-least-one-space-between-columns byte.
+ */
+ ap_rputs(" ", r);
if (!(autoindex_opts & SUPPRESS_LAST_MOD)) {
emit_link(r, "Last modified", K_LAST_MOD, keyid, direction,
static_columns);
@@ -896,7 +961,9 @@
}
for (x = 0; x < n; x++) {
- char *anchor = NULL, *t = NULL, *t2 = NULL;
+ char *anchor, *t, *t2;
+ char *pad;
+ int nwidth;
ap_clear_pool(scratch);
@@ -906,40 +973,21 @@
if (t[0] == '\0') {
t = "/";
}
- anchor = ap_pstrcat(scratch, "<A HREF=\"",
- ap_escape_html(scratch,
- ap_os_escape_path(scratch, t,
- 0)),
- "\">", NULL);
- t2 = "Parent Directory</A> ";
+ /* 1234567890123456 */
+ t2 = "Parent Directory";
+ pad = name_scratch + 16;
+ anchor = ap_escape_html(scratch, ap_os_escape_path(scratch, t, 0));
}
else {
t = ar[x]->name;
- len = strlen(t);
- if (len > 23) {
- t2 = ap_pstrdup(scratch, t);
- t2[21] = '.';
- t2[22] = '.';
- t2[23] = '\0';
- t2 = ap_escape_html(scratch, t2);
- t2 = ap_pstrcat(scratch, t2, "</A>", NULL);
- }
- else {
- char buff[24] = " ";
- t2 = ap_escape_html(scratch, t);
- buff[23 - len] = '\0';
- t2 = ap_pstrcat(scratch, t2, "</A>", buff, NULL);
- }
- anchor = ap_pstrcat(scratch, "<A HREF=\"",
- ap_escape_html(scratch,
- ap_os_escape_path(scratch, t,
- 0)),
- "\">", NULL);
+ pad = name_scratch + strlen(t);
+ t2 = ap_escape_html(scratch, t);
+ anchor = ap_escape_html(scratch, ap_os_escape_path(scratch, t, 0));
}
if (autoindex_opts & FANCY_INDEXING) {
if (autoindex_opts & ICONS_ARE_LINKS) {
- ap_rputs(anchor, r);
+ ap_rvputs(r, "<A HREF=\"", anchor, "\">", NULL);
}
if ((ar[x]->icon) || d->default_icon) {
ap_rvputs(r, "<IMG SRC=\"",
@@ -958,7 +1006,22 @@
ap_rputs("</A>", r);
}
- ap_rvputs(r, " ", anchor, t2, NULL);
+ ap_rvputs(r, " <A HREF=\"", anchor, "\">",
+ widthify(t2, name_scratch, name_width, K_NOPAD),
+ "</A>", NULL);
+ /*
+ * We know that widthify() prefilled the buffer with spaces
+ * before doing its thing, so use them.
+ */
+ nwidth = strlen(t2);
+ if (nwidth < (name_width - 1)) {
+ name_scratch[nwidth] = ' ';
+ ap_rputs(&name_scratch[nwidth], r);
+ }
+ /*
+ * The blank before the storm.. er, before the next field.
+ */
+ ap_rputs(" ", r);
if (!(autoindex_opts & SUPPRESS_LAST_MOD)) {
if (ar[x]->lm_valid) {
char time_str[MAX_STRING_LEN];
@@ -987,7 +1050,8 @@
}
}
else {
- ap_rvputs(r, "<LI> ", anchor, " ", t2, NULL);
+ ap_rvputs(r, "<LI><A HREF=\"", anchor, "\"> ", t2,
+ "</A>", pad, NULL);
}
ap_rputc('\n', r);
}
@@ -1026,7 +1090,7 @@
*/
if ((*e1)->ascending) {
c1 = *e1;
- c2 = *e2;
+ c2 = *e2;
}
else {
c1 = *e2;
@@ -1060,7 +1124,8 @@
}
-static int index_directory(request_rec *r, autoindex_config_rec * autoindex_conf)
+static int index_directory(request_rec *r,
+ autoindex_config_rec *autoindex_conf)
{
char *title_name = ap_escape_html(r->pool, r->uri);
char *title_endp;
@@ -1072,12 +1137,12 @@
struct ent **ar = NULL;
char *tmp;
const char *qstring;
- int autoindex_opts = find_opts(autoindex_conf, r);
+ int autoindex_opts = autoindex_conf->opts;
char keyid;
char direction;
if (!(d = ap_popendir(r->pool, name))) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"Can't open directory for index: %s", r->filename);
return HTTP_FORBIDDEN;
}
@@ -1209,7 +1274,7 @@
return index_directory(r, d);
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Directory index forbidden by rule: %s", r->filename);
return HTTP_FORBIDDEN;
}
1.3 +13 -7 apache-2.0/apache-nspr/modules/standard/mod_cern_meta.c
Index: mod_cern_meta.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_cern_meta.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_cern_meta.c 1998/06/30 08:57:09 1.2
+++ mod_cern_meta.c 1998/09/22 18:05:33 1.3
@@ -226,12 +226,17 @@
{NULL}
};
-static int scan_meta_file(request_rec *r, BUFF *f)
+/* XXX: this is very similar to ap_scan_script_header_err_core...
+ * are the differences deliberate, or just a result of bit rot?
+ */
+static int scan_meta_file(request_rec *r, FILE *f)
{
char w[MAX_STRING_LEN];
char *l;
int p;
+ table *tmp_headers;
+ tmp_headers = ap_make_table(r->pool, 5);
while (ap_bgets(w, sizeof(w) - 1, f) > 0) {
/* Delete terminal (CR?)LF */
@@ -251,13 +256,13 @@
/* if we see a bogus header don't ignore it. Shout and scream */
if (!(l = strchr(w, ':'))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"malformed header in meta file: %s", r->filename);
return SERVER_ERROR;
}
*l++ = '\0';
- while (*l && isspace(*l))
+ while (*l && ap_isspace(*l))
++l;
if (!strcasecmp(w, "Content-type")) {
@@ -265,7 +270,7 @@
/* Nuke trailing whitespace */
char *endp = l + strlen(l) - 1;
- while (endp > l && isspace(*endp))
+ while (endp > l && ap_isspace(*endp))
*endp-- = '\0';
tmp = ap_pstrdup(r->pool, l);
@@ -277,9 +282,10 @@
r->status_line = ap_pstrdup(r->pool, l);
}
else {
- ap_table_set(r->headers_out, w, l);
+ ap_table_set(tmp_headers, w, l);
}
}
+ ap_overlap_tables(r->headers_out, tmp_headers, AP_OVERLAP_TABLES_SET);
return OK;
}
@@ -325,7 +331,7 @@
}
else {
/* no last slash, buh?! */
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"internal error in mod_cern_meta: %s", r->filename);
/* should really barf, but hey, let's be friends... */
return DECLINED;
@@ -354,7 +360,7 @@
if (PR_GetError() == PR_FILE_NOT_FOUND_ERROR) {
return DECLINED;
}
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"meta file permissions deny server access: %s", metafilename);
return FORBIDDEN;
};
1.4 +6 -3 apache-2.0/apache-nspr/modules/standard/mod_cgi.c
Index: mod_cgi.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_cgi.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- mod_cgi.c 1998/09/19 19:15:45 1.3
+++ mod_cgi.c 1998/09/22 18:05:34 1.4
@@ -173,7 +173,7 @@
char timebuf[MAX_STRING_LEN];
cgi_server_conf *conf;
- ap_log_error(APLOG_MARK, show_errno|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, show_errno|APLOG_ERR, r,
"%s: %s", error, r->filename);
conf = ap_get_module_config(r->server->module_config, &cgi_module);
@@ -314,7 +314,7 @@
return log_scripterror(r, FORBIDDEN, APLOG_NOERRNO,
"attempt to include NPH CGI script");
-#if defined(__EMX__) || defined(WIN32)
+#if defined(OS2) || defined(WIN32)
/* Allow for cgi files without the .EXE extension on them under OS/2 */
if (!r->file_exists) {
PRFileInfo finfo;
@@ -393,8 +393,11 @@
* those later.
*/
if (PR_DetachProcess(pid) != PR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_INFO, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_INFO, r,
"(ignored) error detaching process: %s", r->filename);
+ PR_Close(parent_out);
+ PR_Close(parent_in);
+ return HTTP_INTERNAL_SERVER_ERROR;
}
/* XXX: this is where we'd set up timeouts for reads/writes to the CGI,
1.3 +13 -10 apache-2.0/apache-nspr/modules/standard/mod_digest.c
Index: mod_digest.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_digest.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_digest.c 1998/06/30 08:57:11 1.2
+++ mod_digest.c 1998/09/22 18:05:34 1.3
@@ -112,7 +112,7 @@
char *w, *x;
if (!(f = ap_pcfg_openfile(r->pool, auth_pwfile))) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"Could not open password file: %s", auth_pwfile);
return NULL;
}
@@ -141,13 +141,15 @@
: "Authorization");
int l;
int s, vk = 0, vv = 0;
- char *t, *key, *value;
+ const char *t;
+ char *key, *value;
+ const char *scheme;
if (!(t = ap_auth_type(r)) || strcasecmp(t, "Digest"))
return DECLINED;
if (!ap_auth_name(r)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"need AuthName: %s", r->uri);
return SERVER_ERROR;
}
@@ -157,10 +159,11 @@
return AUTH_REQUIRED;
}
- if (strcasecmp(ap_getword(r->pool, &auth_line, ' '), "Digest")) {
+ if (strcasecmp(scheme=ap_getword(r->pool, &auth_line, ' '), "Digest")) {
/* Client tried to authenticate using wrong auth scheme */
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
- "client used wrong authentication scheme: %s", r->uri);
+ "client used wrong authentication scheme: %s for %s",
+ scheme, r->uri);
ap_note_digest_auth_failure(r);
return AUTH_REQUIRED;
}
@@ -196,7 +199,7 @@
break;
case D_VALUE:
- if (isalnum(auth_line[0])) {
+ if (ap_isalnum(auth_line[0])) {
value[vv] = auth_line[0];
vv++;
}
@@ -224,7 +227,7 @@
break;
case D_KEY:
- if (isalnum(auth_line[0])) {
+ if (ap_isalnum(auth_line[0])) {
key[vk] = auth_line[0];
vk++;
}
@@ -296,13 +299,13 @@
return DECLINED;
if (!(a1 = get_hash(r, c->user, sec->pwfile))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"user %s not found: %s", c->user, r->uri);
ap_note_digest_auth_failure(r);
return AUTH_REQUIRED;
}
if (strcmp(response->digest, find_digest(r, response, a1))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"user %s: password mismatch: %s", c->user, r->uri);
ap_note_digest_auth_failure(r);
return AUTH_REQUIRED;
@@ -320,7 +323,7 @@
register int x;
const char *t;
char *w;
- array_header *reqs_arr;
+ const array_header *reqs_arr;
require_line *reqs;
if (!(t = ap_auth_type(r)) || strcasecmp(t, "Digest"))
1.3 +1 -1 apache-2.0/apache-nspr/modules/standard/mod_dir.c
Index: mod_dir.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_dir.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_dir.c 1998/06/30 08:57:11 1.2
+++ mod_dir.c 1998/09/22 18:05:35 1.3
@@ -176,7 +176,7 @@
/* If the request returned a redirect, propagate it to the client */
- if (is_HTTP_REDIRECT(rr->status) ||
+ if (ap_is_HTTP_REDIRECT(rr->status) ||
(rr->status == HTTP_NOT_ACCEPTABLE && num_names == 1)) {
error_notfound = rr->status;
1.3 +10 -7 apache-2.0/apache-nspr/modules/standard/mod_expires.c
Index: mod_expires.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_expires.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_expires.c 1998/06/30 08:57:11 1.2
+++ mod_expires.c 1998/09/22 18:05:35 1.3
@@ -283,7 +283,7 @@
while (word[0]) {
/* <num>
*/
- if (isdigit(word[0])) {
+ if (ap_isdigit(word[0])) {
num = atoi(word);
}
else {
@@ -406,18 +406,15 @@
time_t expires;
char age[20];
- if (is_HTTP_ERROR(r->status)) /* Don't add Expires headers to errors */
+ if (ap_is_HTTP_ERROR(r->status)) /* Don't add Expires headers to errors */
return DECLINED;
if (r->main != NULL) /* Say no to subrequests */
return DECLINED;
- if (!r->file_exists) /* no file ? shame. */
- return DECLINED;
-
conf = (expires_dir_config *) ap_get_module_config(r->per_dir_config, &expires_module);
if (conf == NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"internal error: %s", r->filename);
return SERVER_ERROR;
};
@@ -453,6 +450,12 @@
switch (code[0]) {
case 'M':
+ if (r->finfo.st_mode == 0) {
+ /* file doesn't exist on disk, so we can't do anything based on
+ * modification time. Note that this does _not_ log an error.
+ */
+ return DECLINED;
+ }
base = r->finfo.st_mtime;
additional = atoi(&code[1]);
break;
@@ -467,7 +470,7 @@
/* expecting the add_* routines to be case-hardened this
* is just a reminder that module is beta
*/
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"internal error: bad expires code: %s", r->filename);
return SERVER_ERROR;
};
1.3 +11 -11 apache-2.0/apache-nspr/modules/standard/mod_imap.c
Index: mod_imap.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_imap.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_imap.c 1998/06/30 08:57:11 1.2
+++ mod_imap.c 1998/09/22 18:05:36 1.3
@@ -263,7 +263,7 @@
return (-1); /* in case we aren't passed anything */
}
- while (*args && !isdigit(*args) && *args != ',') {
+ while (*args && !ap_isdigit(*args) && *args != ',') {
args++; /* jump to the first digit, but not past
a comma or end */
}
@@ -295,7 +295,7 @@
start_of_y++; /* start looking at the character after
the comma */
- while (*start_of_y && !isdigit(*start_of_y)) {
+ while (*start_of_y && !ap_isdigit(*start_of_y)) {
start_of_y++; /* jump to the first digit, but not
past the end */
}
@@ -326,7 +326,7 @@
/* assume there's no quoted part */
*quoted_part = NULL;
- while (isspace(*strp)) {
+ while (ap_isspace(*strp)) {
strp++; /* go along string until non-whitespace */
}
@@ -385,7 +385,7 @@
}
string_pos_const = value;
- while (isalpha(*string_pos_const)) {
+ while (ap_isalpha(*string_pos_const)) {
string_pos_const++; /* go along the URL from the map
until a non-letter */
}
@@ -406,7 +406,7 @@
/* must be a relative URL to be combined with base */
if (strchr(base, '/') == NULL && (!strncmp(value, "../", 3)
|| !strcmp(value, ".."))) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"invalid base directive in map file: %s", r->uri);
return NULL;
}
@@ -466,7 +466,7 @@
value */
}
else if (directory) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"invalid directory name in map file: %s", r->uri);
return NULL;
}
@@ -744,17 +744,17 @@
sscanf(string_pos, "%lf%*[, ]%lf",
&pointarray[vertex][X], &pointarray[vertex][Y]) == 2) {
/* Now skip what we just read... we can't use ANSIism %n */
- while (isspace(*string_pos)) { /* past whitespace */
+ while (ap_isspace(*string_pos)) { /* past whitespace */
string_pos++;
}
- while (isdigit(*string_pos)) { /* and the 1st number */
+ while (ap_isdigit(*string_pos)) { /* and the 1st number */
string_pos++;
}
string_pos++; /* skip the ',' */
- while (isspace(*string_pos)) { /* past any more whitespace */
+ while (ap_isspace(*string_pos)) { /* past any more whitespace */
string_pos++;
}
- while (isdigit(*string_pos)) { /* 2nd number */
+ while (ap_isdigit(*string_pos)) { /* 2nd number */
string_pos++;
}
vertex++;
@@ -865,7 +865,7 @@
we failed. They lose! */
need_2_fields:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"map file %s, line %d syntax error: requires at "
"least two fields", r->uri, imap->line_number);
/* fall through */
1.3 +89 -70 apache-2.0/apache-nspr/modules/standard/mod_include.c
Index: mod_include.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_include.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_include.c 1998/06/30 08:57:11 1.2
+++ mod_include.c 1998/09/22 18:05:36 1.3
@@ -343,7 +343,7 @@
/* is it numeric ? */
if (s[1] == '#') {
- for (j = 2, val = 0; j < i && isdigit(s[j]); j++) {
+ for (j = 2, val = 0; j < i && ap_isdigit(s[j]); j++) {
val = val * 10 + s[j] - '0';
}
s += i;
@@ -396,7 +396,7 @@
do { /* skip whitespace */
GET_CHAR(in, c, NULL, p);
- } while (isspace(c));
+ } while (ap_isspace(c));
/* tags can't start with - */
if (c == '-') {
@@ -404,7 +404,7 @@
if (c == '-') {
do {
GET_CHAR(in, c, NULL, p);
- } while (isspace(c));
+ } while (ap_isspace(c));
if (c == '>') {
ap_cpystrn(tag, "done", tagbuf_len);
return tag;
@@ -419,17 +419,17 @@
*t = '\0';
return NULL;
}
- if (c == '=' || isspace(c)) {
+ if (c == '=' || ap_isspace(c)) {
break;
}
- *(t++) = tolower(c);
+ *(t++) = ap_tolower(c);
GET_CHAR(in, c, NULL, p);
}
*t++ = '\0';
tag_val = t;
- while (isspace(c)) {
+ while (ap_isspace(c)) {
GET_CHAR(in, c, NULL, p); /* space before = */
}
if (c != '=') {
@@ -439,7 +439,7 @@
do {
GET_CHAR(in, c, NULL, p); /* space after = */
- } while (isspace(c));
+ } while (ap_isspace(c));
/* we should allow a 'name' as a value */
@@ -484,7 +484,7 @@
/* skip initial whitespace */
while (1) {
GET_CHAR(in, c, 1, p);
- if (!isspace(c)) {
+ if (!ap_isspace(c)) {
break;
}
}
@@ -493,9 +493,9 @@
if (d - dest == len) {
return 1;
}
- *d++ = tolower(c);
+ *d++ = ap_tolower(c);
GET_CHAR(in, c, 1, p);
- if (isspace(c)) {
+ if (ap_isspace(c)) {
break;
}
}
@@ -547,8 +547,8 @@
start_of_var_name = in;
in = strchr(in, '}');
if (in == NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
- r->server, "Missing '}' on variable \"%s\"",
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
+ r, "Missing '}' on variable \"%s\"",
expansion);
*next = '\0';
return;
@@ -558,7 +558,7 @@
}
else {
start_of_var_name = in;
- while (isalnum(*in) || *in == '_') {
+ while (ap_isalnum(*in) || *in == '_') {
++in;
}
end_of_var_name = in;
@@ -640,7 +640,7 @@
/* Run it. */
rr_status = ap_run_sub_req(rr);
- if (is_HTTP_REDIRECT(rr_status)) {
+ if (ap_is_HTTP_REDIRECT(rr_status)) {
const char *location = ap_table_get(rr->headers_out, "Location");
location = ap_escape_html(rr->pool, location);
ap_rvputs(r, "<A HREF=\"", location, "\">", location, "</A>", NULL);
@@ -745,8 +745,8 @@
ap_chdir_file(r->filename);
#endif
if (error_fmt) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
- r->server, error_fmt, tag_val, r->filename);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
+ r, error_fmt, tag_val, r->filename);
ap_rputs(error, r);
}
@@ -761,7 +761,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag include in %s",
tag, r->filename);
ap_rputs(error, r);
@@ -843,7 +843,7 @@
if (!ap_bspawn_child(r->pool, include_cmd_child, &arg,
kill_after_timeout, NULL, &script_in, NULL)) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"couldn't spawn include command");
return -1;
}
@@ -869,7 +869,7 @@
if (!strcmp(tag, "cmd")) {
parse_string(r, tag_val, parsed_string, sizeof(parsed_string), 1);
if (include_cmd(parsed_string, r) == -1) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"execution failure for parameter \"%s\" "
"to tag exec in file %s",
tag, r->filename);
@@ -883,7 +883,7 @@
else if (!strcmp(tag, "cgi")) {
parse_string(r, tag_val, parsed_string, sizeof(parsed_string), 0);
if (include_cgi(parsed_string, r) == -1) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"invalid CGI ref \"%s\" in %s", tag_val, file);
ap_rputs(error, r);
}
@@ -896,7 +896,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag exec in %s",
tag, file);
ap_rputs(error, r);
@@ -928,7 +928,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag echo in %s",
tag, r->filename);
ap_rputs(error, r);
@@ -940,12 +940,13 @@
static int handle_perl(BUFF *in, request_rec *r, const char *error)
{
char tag[MAX_STRING_LEN];
+ char parsed_string[MAX_STRING_LEN];
char *tag_val;
SV *sub = Nullsv;
AV *av = newAV();
if (!(ap_allow_options(r) & OPT_INCLUDES)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"httpd: #perl SSI disallowed by IncludesNoExec in %s",
r->filename);
return DECLINED;
@@ -958,7 +959,8 @@
sub = newSVpv(tag_val, 0);
}
else if (strnEQ(tag, "arg", 3)) {
- av_push(av, newSVpv(tag_val, 0));
+ parse_string(r, tag_val, parsed_string, sizeof(parsed_string), 0);
+ av_push(av, newSVpv(parsed_string, 0));
}
else if (strnEQ(tag, "done", 4)) {
break;
@@ -1016,7 +1018,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag config in %s",
tag, r->filename);
ap_rputs(error, r);
@@ -1029,22 +1031,39 @@
char *tag_val, PRFileInfo *finfo, const char *error)
{
char *to_send;
+ request_rec *rr;
+ int ret=0;
if (!strcmp(tag, "file")) {
ap_getparents(tag_val); /* get rid of any nasties */
- to_send = ap_make_full_path(r->pool, "./", tag_val);
- if (PR_GetFileInfo(to_send, finfo) != PR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
- "unable to get information about \"%s\" "
+
+ rr = ap_sub_req_lookup_file(tag_val, r);
+
+ if (rr->status == HTTP_OK && rr->finfo.st_mode != 0) {
+ to_send = rr->filename;
+ if ((ret = stat(to_send, finfo)) == -1) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "unable to get information about \"%s\" "
+ "in parsed file %s",
+ to_send, r->filename);
+ ap_rputs(error, r);
+ }
+ }
+ else {
+ ret = -1;
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
+ "unable to lookup information about \"%s\" "
"in parsed file %s",
- to_send, r->filename);
+ tag_val, r->filename);
ap_rputs(error, r);
- return -1;
}
- return 0;
+
+ ap_destroy_sub_req(rr);
+
+ return ret;
}
else if (!strcmp(tag, "virtual")) {
- request_rec *rr = ap_sub_req_lookup_uri(tag_val, r);
+ rr = ap_sub_req_lookup_uri(tag_val, r);
if (rr->status == HTTP_OK && rr->file_exists) {
*finfo = rr->finfo;
@@ -1052,7 +1071,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unable to get information about \"%s\" "
"in parsed file %s",
tag_val, r->filename);
@@ -1062,7 +1081,7 @@
}
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag %s in %s",
tag, directive, r->filename);
ap_rputs(error, r);
@@ -1137,7 +1156,7 @@
compiled = ap_pregcomp(r->pool, rexp, REG_EXTENDED | REG_NOSUB);
if (compiled == NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unable to compile pattern \"%s\"", rexp);
return -1;
}
@@ -1171,7 +1190,7 @@
return (char *) NULL;
}
while ((ch = *string++)) {
- if (!isspace(ch)) {
+ if (!ap_isspace(ch)) {
break;
}
}
@@ -1260,7 +1279,7 @@
continue;
}
if (!qs) {
- if (isspace(ch)) {
+ if (ap_isspace(ch)) {
goto TOKEN_DONE;
}
switch (ch) {
@@ -1382,7 +1401,7 @@
current = current->right = new;
break;
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1396,7 +1415,7 @@
ap_rputs(" Token: and/or\n", r);
#endif
if (current == (struct parse_node *) NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1421,7 +1440,7 @@
case token_lbrace:
break;
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1466,7 +1485,7 @@
case token_lt:
break;
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1498,7 +1517,7 @@
ap_rputs(" Token: eq/ne/ge/gt/le/lt\n", r);
#endif
if (current == (struct parse_node *) NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1523,7 +1542,7 @@
case token_le:
case token_lt:
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1557,7 +1576,7 @@
current = current->parent;
}
if (current == (struct parse_node *) NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Unmatched ')' in \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1590,7 +1609,7 @@
case token_string:
case token_group:
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1638,7 +1657,7 @@
#endif
if (current->left == (struct parse_node *) NULL ||
current->right == (struct parse_node *) NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1703,7 +1722,7 @@
(current->right == (struct parse_node *) NULL) ||
(current->left->token.type != token_string) ||
(current->right->token.type != token_string)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1724,7 +1743,7 @@
current->right->token.value[len - 1] = '\0';
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid rexp \"%s\" in file %s",
current->right->token.value, r->filename);
ap_rputs(error, r);
@@ -1768,7 +1787,7 @@
(current->right == (struct parse_node *) NULL) ||
(current->left->token.type != token_string) ||
(current->right->token.type != token_string)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
@@ -1851,21 +1870,21 @@
break;
case token_lbrace:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Unmatched '(' in \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
goto RETURN;
case token_rbrace:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Unmatched ')' in \"%s\" in file %s",
expr, r->filename);
ap_rputs(error, r);
goto RETURN;
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"bad token type");
ap_rputs(error, r);
goto RETURN;
@@ -1893,7 +1912,7 @@
}
else if (!strcmp(tag, "done")) {
if (expr == NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"missing expr in if statement: %s",
r->filename);
ap_rputs(error, r);
@@ -1913,7 +1932,7 @@
#endif
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag if in %s",
tag, r->filename);
ap_rputs(error, r);
@@ -1944,7 +1963,7 @@
return (0);
}
if (expr == NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"missing expr in elif statement: %s",
r->filename);
ap_rputs(error, r);
@@ -1964,7 +1983,7 @@
#endif
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"unknown parameter \"%s\" to tag if in %s",
tag, r->filename);
ap_rputs(error, r);
@@ -1990,7 +2009,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"else directive does not take tags in %s",
r->filename);
if (*printing) {
@@ -2018,7 +2037,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"endif directive does not take tags in %s",
r->filename);
ap_rputs(error, r);
@@ -2046,7 +2065,7 @@
}
else if (!strcmp(tag, "value")) {
if (var == (char *) NULL) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"variable must precede value in set directive in %s",
r->filename);
ap_rputs(error, r);
@@ -2061,7 +2080,7 @@
}
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Invalid tag for set directive in %s", r->filename);
ap_rputs(error, r);
return -1;
@@ -2094,7 +2113,7 @@
return 0;
}
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"printenv directive does not take tags in %s",
r->filename);
ap_rputs(error, r);
@@ -2139,7 +2158,7 @@
while (1) {
if (!find_string(f, STARTING_SEQUENCE, r, printing)) {
if (get_directive(f, directive, sizeof(directive), r->pool)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"mod_include: error reading directive in %s",
r->filename);
ap_rputs(error, r);
@@ -2185,7 +2204,7 @@
}
if (!strcmp(directive, "exec")) {
if (noexec) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"httpd: exec used but not allowed in %s",
r->filename);
if (printing) {
@@ -2224,7 +2243,7 @@
}
#endif
else {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"httpd: unknown directive \"%s\" "
"in parsed doc %s",
directive, r->filename);
@@ -2234,7 +2253,7 @@
ret = find_string(f, ENDING_SEQUENCE, r, 0);
}
if (ret) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"httpd: premature EOF in parsed file %s",
r->filename);
return;
@@ -2306,7 +2325,7 @@
return DECLINED;
}
if (!r->file_exists) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"File does not exist: %s",
(r->path_info
? ap_pstrcat(r->pool, r->filename, r->path_info, NULL)
@@ -2315,14 +2334,14 @@
}
if (!(f = ap_bopenf(r->pool, r->filename, PR_RDONLY, 0))) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"file permissions deny server access: %s", r->filename);
return HTTP_FORBIDDEN;
}
if ((*state == xbithack_full)
/* XXX: how do we do xbithack under NSPR? */
-#if 0 /* !defined(__EMX__) && !defined(WIN32) */
+#if 0 /* !defined(OS2) && !defined(WIN32) */
/* OS/2 dosen't support Groups. */
&& (r->finfo.st_mode & S_IXGRP)
#endif
@@ -2387,7 +2406,7 @@
static int xbithack_handler(request_rec *r)
{
/* XXX: how do we do xbithack under NSPR? */
-#if 1 /* defined(__EMX__) || defined(WIN32) */
+#if 1 /* defined(OS2) || defined(WIN32) */
/* OS/2 dosen't currently support the xbithack. This is being worked on. */
return DECLINED;
#else
1.3 +3 -3 apache-2.0/apache-nspr/modules/standard/mod_info.c
Index: mod_info.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_info.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_info.c 1998/06/30 08:57:12 1.2
+++ mod_info.c 1998/09/22 18:05:37 1.3
@@ -171,7 +171,7 @@
fp = ap_pcfg_openfile(p, filename);
if (!fp) {
- ap_log_error(APLOG_MARK, APLOG_WARNING, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_WARNING, r,
"mod_info: couldn't open config file %s",
filename);
return NULL;
@@ -405,8 +405,8 @@
"<font size=+1><tt>%s</tt></a></font><br>\n",
ap_get_server_built());
ap_rprintf(r, "<strong>API Version:</strong> "
- "<tt>%d</tt><br>\n",
- MODULE_MAGIC_NUMBER);
+ "<tt>%d:%d</tt><br>\n",
+ MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
ap_rprintf(r, "<strong>Run Mode:</strong> <tt>%s</tt><br>\n",
(ap_standalone ? "standalone" : "inetd"));
ap_rprintf(r, "<strong>User/Group:</strong> "
1.3 +4 -5 apache-2.0/apache-nspr/modules/standard/mod_log_config.c
Index: mod_log_config.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_log_config.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_log_config.c 1998/06/30 08:57:12 1.2
+++ mod_log_config.c 1998/09/22 18:05:37 1.3
@@ -198,10 +198,9 @@
* multi_log_state is our per-(virtual)-server configuration. We store
* an array of the logs we are going to use, each of type config_log_state.
* If a default log format is given by LogFormat, store in default_format
- * (backward compat. with mod_log_config). We also store a pointer to
- * the logs specified for the main server for virtual servers, so that
- * if this vhost has now logs defined, we can use the main server's
- * logs instead.
+ * (backward compat. with mod_log_config). We also store for each virtual
+ * server a pointer to the logs specified for the main server, so that if this
+ * vhost has no logs defined, we can use the main server's logs instead.
*
* So, for the main server, config_logs contains a list of the log files
* and server_config_logs in empty. For a vhost, server_config_logs
@@ -594,7 +593,7 @@
case '8':
case '9':
i = *s - '0';
- while (isdigit(*++s)) {
+ while (ap_isdigit(*++s)) {
i = i * 10 + (*s) - '0';
}
if (!it->conditions) {
1.3 +1 -1 apache-2.0/apache-nspr/modules/standard/mod_mime.c
Index: mod_mime.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_mime.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_mime.c 1998/06/30 08:57:12 1.2
+++ mod_mime.c 1998/09/22 18:05:38 1.3
@@ -199,7 +199,7 @@
* equivalent to 27 in ASCII, and makes it work in EBCDIC.
*/
#define MIME_HASHSIZE ('z'-'a'+2)
-#define hash(i) (isalpha(i) ? (tolower(i)) - 'a' : (MIME_HASHSIZE-1))
+#define hash(i) (ap_isalpha(i) ? (ap_tolower(i)) - 'a' : (MIME_HASHSIZE-1))
static table *hash_buckets[MIME_HASHSIZE];
1.3 +64 -74 apache-2.0/apache-nspr/modules/standard/mod_mime_magic.c
Index: mod_mime_magic.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_mime_magic.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_mime_magic.c 1998/06/30 08:57:12 1.2
+++ mod_mime_magic.c 1998/09/22 18:05:38 1.3
@@ -572,7 +572,7 @@
/* make sure we have a list to put it in */
if (!req_dat) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": request config should not be NULL");
if (!(req_dat = magic_set_config(r))) {
/* failure */
@@ -674,7 +674,7 @@
/* clean up and return */
result[res_pos] = 0;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": rsl_strdup() %d chars: %s", res_pos - 1, result);
#endif
return result;
@@ -718,7 +718,7 @@
frag = frag->next, cur_frag++) {
/* loop through the characters in the fragment */
for (cur_pos = 0; frag->str[cur_pos]; cur_pos++) {
- if (isspace(frag->str[cur_pos])) {
+ if (ap_isspace(frag->str[cur_pos])) {
/* process whitespace actions for each state */
if (state == rsl_leading_space) {
/* eat whitespace in this state */
@@ -746,7 +746,7 @@
else {
/* should not be possible */
/* abandon malfunctioning module */
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": bad state %d (ws)", state);
return DECLINED;
}
@@ -790,7 +790,7 @@
else {
/* should not be possible */
/* abandon malfunctioning module */
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": bad state %d (ns)", state);
return DECLINED;
}
@@ -865,7 +865,7 @@
if ((fd = ap_popenfd(r->pool, r->filename, PR_RDONLY, 0)) < 0) {
/* We can't open it, but we were able to stat it. */
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
MODNAME ": can't read `%s'", r->filename);
/* let some other handler decide what the problem is */
return DECLINED;
@@ -875,7 +875,7 @@
* try looking at the first HOWMANY bytes
*/
if ((nbytes = PR_Read(fd, (char *) buf, sizeof(buf) - 1)) == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
MODNAME ": read failed: %s", r->filename);
return HTTP_INTERNAL_SERVER_ERROR;
}
@@ -920,8 +920,7 @@
magic_rsl_puts(r, MIME_BINARY_UNKNOWN);
}
-#define EATAB {while (isascii((unsigned char) *l) && \
- isspace((unsigned char) *l)) ++l;}
+#define EATAB {while (ap_isspace((unsigned char) *l)) ++l;}
/*
* apprentice - load configuration from the magic file r
@@ -964,7 +963,7 @@
/* skip leading whitespace */
ws_offset = 0;
- while (line[ws_offset] && isspace(line[ws_offset])) {
+ while (line[ws_offset] && ap_isspace(line[ws_offset])) {
ws_offset++;
}
@@ -1007,10 +1006,10 @@
ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s,
MODNAME ": apprentice test");
for (m = conf->magic; m; m = m->next) {
- if (isprint((((unsigned long) m) >> 24) & 255) &&
- isprint((((unsigned long) m) >> 16) & 255) &&
- isprint((((unsigned long) m) >> 8) & 255) &&
- isprint(((unsigned long) m) & 255)) {
+ if (ap_isprint((((unsigned long) m) >> 24) & 255) &&
+ ap_isprint((((unsigned long) m) >> 16) & 255) &&
+ ap_isprint((((unsigned long) m) >> 8) & 255) &&
+ ap_isprint(((unsigned long) m) & 255)) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s,
MODNAME ": apprentice: POINTER CLOBBERED! "
"m=\"%c%c%c%c\" line=%d",
@@ -1138,7 +1137,7 @@
s = l;
if (*l == '+' || *l == '-')
l++;
- if (isdigit((unsigned char) *l)) {
+ if (ap_isdigit((unsigned char) *l)) {
m->in.offset = strtol(l, &t, 0);
if (*s == '-')
m->in.offset = -m->in.offset;
@@ -1153,7 +1152,7 @@
}
- while (isascii((unsigned char) *l) && isdigit((unsigned char) *l))
+ while (ap_isdigit((unsigned char) *l))
++l;
EATAB;
@@ -1251,8 +1250,7 @@
}
/* FALL THROUGH */
default:
- if (*l == 'x' && isascii((unsigned char) l[1]) &&
- isspace((unsigned char) l[1])) {
+ if (*l == 'x' && ap_isspace((unsigned char) l[1])) {
m->reln = *l;
++l;
goto GetDesc; /* Bill The Cat */
@@ -1324,7 +1322,7 @@
register int val;
while ((c = *s++) != '\0') {
- if (isspace((unsigned char) c))
+ if (ap_isspace((unsigned char) c))
break;
if (p >= pmax) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, serv,
@@ -1427,9 +1425,7 @@
/* Single hex char to int; -1 if not a hex char. */
static int hextoint(int c)
{
- if (!isascii((unsigned char) c))
- return -1;
- if (isdigit((unsigned char) c))
+ if (ap_isdigit((unsigned char) c))
return c - '0';
if ((c >= 'a') && (c <= 'f'))
return c + 10 - 'a';
@@ -1519,7 +1515,7 @@
struct magic *m;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": match conf=%x file=%s m=%s m->next=%s last=%s",
conf,
conf->magicfile ? conf->magicfile : "NULL",
@@ -1530,11 +1526,11 @@
#if MIME_MAGIC_DEBUG
for (m = conf->magic; m; m = m->next) {
- if (isprint((((unsigned long) m) >> 24) & 255) &&
- isprint((((unsigned long) m) >> 16) & 255) &&
- isprint((((unsigned long) m) >> 8) & 255) &&
- isprint(((unsigned long) m) & 255)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ if (ap_isprint((((unsigned long) m) >> 24) & 255) &&
+ ap_isprint((((unsigned long) m) >> 16) & 255) &&
+ ap_isprint((((unsigned long) m) >> 8) & 255) &&
+ ap_isprint(((unsigned long) m) & 255)) {
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": match: POINTER CLOBBERED! "
"m=\"%c%c%c%c\"",
(((unsigned long) m) >> 24) & 255,
@@ -1549,7 +1545,7 @@
for (m = conf->magic; m; m = m->next) {
#if MIME_MAGIC_DEBUG
rule_counter++;
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": line=%d desc=%s", m->lineno, m->desc);
#endif
@@ -1569,7 +1565,7 @@
while (m_cont && (m_cont->cont_level != 0)) {
#if MIME_MAGIC_DEBUG
rule_counter++;
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": line=%d mc=%x mc->next=%x cont=%d desc=%s",
m_cont->lineno, m_cont,
m_cont->next, m_cont->cont_level,
@@ -1588,7 +1584,7 @@
/* if we get here, the main entry rule was a match */
/* this will be the last run through the loop */
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": rule matched, line=%d type=%d %s",
m->lineno, m->type,
(m->type == STRING) ? m->value.s : "");
@@ -1612,7 +1608,7 @@
m = m->next;
while (m && (m->cont_level != 0)) {
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": match line=%d cont=%d type=%d %s",
m->lineno, m->cont_level, m->type,
(m->type == STRING) ? m->value.s : "");
@@ -1656,13 +1652,13 @@
m = m->next;
}
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": matched after %d rules", rule_counter);
#endif
return 1; /* all through */
}
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": failed after %d rules", rule_counter);
#endif
return 0; /* no match at all */
@@ -1704,7 +1700,7 @@
/* who cares about the time when we're generating mime-types? */
return;
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": invalid m->type (%d) in mprint().",
m->type);
return;
@@ -1750,7 +1746,7 @@
((p->hl[3] << 24) | (p->hl[2] << 16) | (p->hl[1] << 8) | (p->hl[0]));
return 1;
default:
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": invalid type %d in mconvert().", m->type);
return 0;
}
@@ -1802,7 +1798,7 @@
int matched;
if ((m->value.s[0] == 'x') && (m->value.s[1] == '\0')) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": BOINK");
return 1;
}
@@ -1847,7 +1843,7 @@
break;
default:
/* bogosity, pretend that it just wasn't a match */
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": invalid type %d in mcheck().", m->type);
return 0;
}
@@ -1857,7 +1853,7 @@
switch (m->reln) {
case 'x':
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%lu == *any* = 1", v);
#endif
matched = 1;
@@ -1866,7 +1862,7 @@
case '!':
matched = v != l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%lu != %lu = %d", v, l, matched);
#endif
break;
@@ -1874,7 +1870,7 @@
case '=':
matched = v == l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%lu == %lu = %d", v, l, matched);
#endif
break;
@@ -1883,14 +1879,14 @@
if (m->flag & UNSIGNED) {
matched = v > l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%lu > %lu = %d", v, l, matched);
#endif
}
else {
matched = (long) v > (long) l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%ld > %ld = %d", v, l, matched);
#endif
}
@@ -1900,14 +1896,14 @@
if (m->flag & UNSIGNED) {
matched = v < l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%lu < %lu = %d", v, l, matched);
#endif
}
else {
matched = (long) v < (long) l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"%ld < %ld = %d", v, l, matched);
#endif
}
@@ -1916,7 +1912,7 @@
case '&':
matched = (v & l) == l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"((%lx & %lx) == %lx) = %d", v, l, l, matched);
#endif
break;
@@ -1924,7 +1920,7 @@
case '^':
matched = (v & l) != l;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
"((%lx & %lx) != %lx) = %d", v, l, l, matched);
#endif
break;
@@ -1932,7 +1928,7 @@
default:
/* bogosity, pretend it didn't match */
matched = 0;
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_ERR, r,
MODNAME ": mcheck: can't happen: invalid relation %d.",
m->reln);
break;
@@ -1946,7 +1942,7 @@
static int ascmagic(request_rec *r, unsigned char *buf, int nbytes)
{
- int i, has_escapes = 0;
+ int has_escapes = 0;
unsigned char *s;
char nbuf[HOWMANY + 1]; /* one extra for terminating '\0' */
char *token;
@@ -1963,16 +1959,15 @@
if (*buf == '.') {
unsigned char *tp = buf + 1;
- while (isascii(*tp) && isspace(*tp))
+ while (ap_isspace(*tp))
++tp; /* skip leading whitespace */
- if ((isascii(*tp) && (isalnum(*tp) || *tp == '\\') &&
- isascii(*(tp + 1)) && (isalnum(*(tp + 1)) || *tp == '"'))) {
+ if ((ap_isalnum(*tp) || *tp == '\\') &&
+ (ap_isalnum(*(tp + 1)) || *tp == '"')) {
magic_rsl_puts(r, "application/x-troff");
return 1;
}
}
- if ((*buf == 'c' || *buf == 'C') &&
- isascii(*(buf + 1)) && isspace(*(buf + 1))) {
+ if ((*buf == 'c' || *buf == 'C') && ap_isspace(*(buf + 1))) {
/* Fortran */
magic_rsl_puts(r, "text/plain");
return 1;
@@ -2009,11 +2004,6 @@
return 1;
}
- for (i = 0; i < nbytes; i++) {
- if (!isascii(*(buf + i)))
- return 0; /* not all ascii */
- }
-
/* all else fails, but it is ascii... */
if (has_escapes) {
/* text with escape sequences */
@@ -2115,7 +2105,7 @@
return (child_pid);
#else
execvp(compr[parm->method].argv[0], compr[parm->method].argv);
- ap_log_error(APLOG_MARK, APLOG_ERR, parm->r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, parm->r,
MODNAME ": could not execute `%s'.",
compr[parm->method].argv[0]);
return -1;
@@ -2145,14 +2135,14 @@
if (!ap_bspawn_child(sub_pool, uncompress_child, &parm, kill_always,
&bin, &bout, NULL)) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
MODNAME ": couldn't spawn uncompress process: %s", r->uri);
return -1;
}
if (ap_bwrite(bin, old, n) != n) {
ap_destroy_pool(sub_pool);
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
MODNAME ": write failed.");
return -1;
}
@@ -2160,7 +2150,7 @@
*newch = (unsigned char *) ap_palloc(r->pool, n);
if ((n = ap_bread(bout, *newch, n)) <= 0) {
ap_destroy_pool(sub_pool);
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
MODNAME ": read failed %s", r->filename);
return -1;
}
@@ -2234,7 +2224,7 @@
{
register long value;
- while (isspace(*where)) { /* Skip spaces */
+ while (ap_isspace(*where)) { /* Skip spaces */
where++;
if (--digs <= 0)
return -1; /* All blank field */
@@ -2245,7 +2235,7 @@
--digs;
}
- if (digs > 0 && *where && !isspace(*where))
+ if (digs > 0 && *where && !ap_isspace(*where))
return -1; /* Ended on non-space/nul */
return value;
@@ -2268,16 +2258,16 @@
request_rec *sub;
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": revision_suffix checking %s", r->filename);
#endif /* MIME_MAGIC_DEBUG */
/* check for recognized revision suffix */
suffix_pos = strlen(r->filename) - 1;
- if (!isdigit(r->filename[suffix_pos])) {
+ if (!ap_isdigit(r->filename[suffix_pos])) {
return 0;
}
- while (suffix_pos >= 0 && isdigit(r->filename[suffix_pos]))
+ while (suffix_pos >= 0 && ap_isdigit(r->filename[suffix_pos]))
suffix_pos--;
if (suffix_pos < 0 || r->filename[suffix_pos] != '@') {
return 0;
@@ -2287,7 +2277,7 @@
result = 0;
sub_filename = ap_pstrndup(r->pool, r->filename, suffix_pos);
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": subrequest lookup for %s", sub_filename);
#endif /* MIME_MAGIC_DEBUG */
sub = ap_sub_req_lookup_file(sub_filename, r);
@@ -2296,7 +2286,7 @@
if (sub->content_type) {
r->content_type = ap_pstrdup(r->pool, sub->content_type);
#if MIME_MAGIC_DEBUG
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, r,
MODNAME ": subrequest %s got %s",
sub_filename, r->content_type);
#endif /* MIME_MAGIC_DEBUG */
@@ -2345,10 +2335,10 @@
ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s,
MODNAME ": magic_init 1 test");
for (m = conf->magic; m; m = m->next) {
- if (isprint((((unsigned long) m) >> 24) & 255) &&
- isprint((((unsigned long) m) >> 16) & 255) &&
- isprint((((unsigned long) m) >> 8) & 255) &&
- isprint(((unsigned long) m) & 255)) {
+ if (ap_isprint((((unsigned long) m) >> 24) & 255) &&
+ ap_isprint((((unsigned long) m) >> 16) & 255) &&
+ ap_isprint((((unsigned long) m) >> 8) & 255) &&
+ ap_isprint(((unsigned long) m) & 255)) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_DEBUG, s,
MODNAME ": magic_init 1: POINTER CLOBBERED! "
"m=\"%c%c%c%c\" line=%d",
1.3 +15 -15 apache-2.0/apache-nspr/modules/standard/mod_negotiation.c
Index: mod_negotiation.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_negotiation.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_negotiation.c 1998/06/30 08:57:12 1.2
+++ mod_negotiation.c 1998/09/22 18:05:39 1.3
@@ -346,8 +346,8 @@
/* Look for 'var = value' --- and make sure the var is in lcase. */
- for (cp = parm; (*cp && !isspace(*cp) && *cp != '='); ++cp) {
- *cp = tolower(*cp);
+ for (cp = parm; (*cp && !ap_isspace(*cp) && *cp != '='); ++cp) {
+ *cp = ap_tolower(*cp);
}
if (!*cp) {
@@ -355,7 +355,7 @@
}
*cp++ = '\0'; /* Delimit var */
- while (*cp && (isspace(*cp) || *cp == '=')) {
+ while (*cp && (ap_isspace(*cp) || *cp == '=')) {
++cp;
}
@@ -366,7 +366,7 @@
end++);
}
else {
- for (end = cp; (*end && !isspace(*end)); end++);
+ for (end = cp; (*end && !ap_isspace(*end)); end++);
}
if (*end) {
*end = '\0'; /* strip ending quote or return */
@@ -583,7 +583,7 @@
/* If blank, just return it --- this ends information on this variant */
- for (cp = buffer; (*cp && isspace(*cp)); ++cp) {
+ for (cp = buffer; (*cp && ap_isspace(*cp)); ++cp) {
continue;
}
@@ -604,13 +604,13 @@
continue;
}
}
- else if (isspace(c)) {
+ else if (ap_isspace(c)) {
/* Leading whitespace. POSSIBLE continuation line
* Also, possibly blank --- if so, we ungetc() the final newline
* so that we will pick up the blank line the next time 'round.
*/
- while (c != EOF && c != '\n' && isspace(c)) {
+ while (c != EOF && c != '\n' && ap_isspace(c)) {
c = ap_bgetc(map);
}
@@ -677,21 +677,21 @@
char *cp = header;
for ( ; *cp && *cp != ':' ; ++cp) {
- *cp = tolower(*cp);
+ *cp = ap_tolower(*cp);
}
if (!*cp) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Syntax error in type map --- no ':': %s", r->filename);
return NULL;
}
do {
++cp;
- } while (*cp && isspace(*cp));
+ } while (*cp && ap_isspace(*cp));
if (!*cp) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Syntax error in type map --- no header body: %s",
r->filename);
return NULL;
@@ -713,7 +713,7 @@
map = ap_bopenf(neg->pool, rr->filename, PR_RDONLY, 0);
if (map == NULL) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"cannot access type map file: %s", rr->filename);
return HTTP_FORBIDDEN;
}
@@ -805,7 +805,7 @@
dirp = ap_popendir(neg->pool, neg->dir_name);
if (dirp == NULL) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"cannot read directory for multi: %s", neg->dir_name);
return HTTP_FORBIDDEN;
}
@@ -2052,7 +2052,7 @@
}
if (!best) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"no acceptable variant: %s", r->filename);
set_neg_headers(r, neg, na_result);
@@ -2139,7 +2139,7 @@
}
if (!best) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"no acceptable variant: %s", r->filename);
set_neg_headers(r, neg, na_result);
1.3 +58 -35 apache-2.0/apache-nspr/modules/standard/mod_rewrite.c
Index: mod_rewrite.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_rewrite.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_rewrite.c 1998/06/30 08:57:12 1.2
+++ mod_rewrite.c 1998/09/22 18:05:39 1.3
@@ -850,10 +850,10 @@
else if (strcasecmp(val, "seeother") == 0) {
status = HTTP_SEE_OTHER;
}
- else if (isdigit(*val)) {
+ else if (ap_isdigit(*val)) {
status = atoi(val);
}
- if (!is_HTTP_REDIRECT(status)) {
+ if (!ap_is_HTTP_REDIRECT(status)) {
return "RewriteRule: invalid HTTP response code "
"for flag 'R'";
}
@@ -1001,6 +1001,7 @@
char buf[512];
char docroot[512];
char *cp, *cp2;
+ const char *ccp;
unsigned int port;
int n;
int l;
@@ -1095,7 +1096,7 @@
* we can actually use it!
*/
if (!proxy_available) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"attempt to make remote request from mod_rewrite "
"without proxy enabled: %s", r->filename);
return FORBIDDEN;
@@ -1155,7 +1156,7 @@
}
/* determine HTTP redirect response code */
- if (is_HTTP_REDIRECT(r->status)) {
+ if (ap_is_HTTP_REDIRECT(r->status)) {
n = r->status;
r->status = HTTP_OK; /* make Apache kernel happy */
}
@@ -1228,8 +1229,8 @@
*/
n = prefix_stat(r->filename);
if (n == 0) {
- if ((cp = ap_document_root(r)) != NULL) {
- l = ap_cpystrn(docroot, cp, sizeof(docroot)) - docroot;
+ if ((ccp = ap_document_root(r)) != NULL) {
+ l = ap_cpystrn(docroot, ccp, sizeof(docroot)) - docroot;
/* always NOT have a trailing slash */
if (docroot[l-1] == '/') {
@@ -1302,6 +1303,7 @@
rewrite_perdir_conf *dconf;
char *cp;
char *cp2;
+ const char *ccp;
char *prefix;
int l;
int n;
@@ -1332,7 +1334,7 @@
*/
if (!(ap_allow_options(r) & (OPT_SYM_LINKS | OPT_SYM_OWNER))) {
/* FollowSymLinks is mandatory! */
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Options FollowSymLinks or SymLinksIfOwnerMatch is off "
"which implies that RewriteRule directive is forbidden: "
"%s", r->filename);
@@ -1444,7 +1446,7 @@
}
/* determine HTTP redirect response code */
- if (is_HTTP_REDIRECT(r->status)) {
+ if (ap_is_HTTP_REDIRECT(r->status)) {
n = r->status;
r->status = HTTP_OK; /* make Apache kernel happy */
}
@@ -1519,8 +1521,8 @@
* for this webserver and only try to remove the
* document_root if it is prefix
*/
- if ((cp = ap_document_root(r)) != NULL) {
- prefix = ap_pstrdup(r->pool, cp);
+ if ((ccp = ap_document_root(r)) != NULL) {
+ prefix = ap_pstrdup(r->pool, ccp);
/* always NOT have a trailing slash */
l = strlen(prefix);
if (prefix[l-1] == '/') {
@@ -1726,6 +1728,7 @@
{
char *uri;
char *output;
+ const char *vary;
char newuri[MAX_STRING_LEN];
char env[MAX_STRING_LEN];
regex_t *regexp;
@@ -1839,6 +1842,7 @@
/* One condition is false, but another can be
* still true, so we have to continue...
*/
+ ap_table_unset(r->notes, VARY_KEY_THIS);
continue;
}
else {
@@ -1864,13 +1868,30 @@
break;
}
}
+ vary = ap_table_get(r->notes, VARY_KEY_THIS);
+ if (vary != NULL) {
+ ap_table_merge(r->notes, VARY_KEY, vary);
+ ap_table_unset(r->notes, VARY_KEY_THIS);
+ }
}
/* if any condition fails the complete rule fails */
if (failed) {
+ ap_table_unset(r->notes, VARY_KEY);
+ ap_table_unset(r->notes, VARY_KEY_THIS);
return 0;
}
/*
+ * Regardless of what we do next, we've found a match. Check to see
+ * if any of the request header fields were involved, and add them
+ * to the Vary field of the response.
+ */
+ if ((vary = ap_table_get(r->notes, VARY_KEY)) != NULL) {
+ ap_table_merge(r->headers_out, "Vary", vary);
+ ap_table_unset(r->notes, VARY_KEY);
+ }
+
+ /*
* If this is a pure matching rule (`RewriteRule <pat> -')
* we stop processing and return immediately. The only thing
* we have not to forget are the environment variables
@@ -2153,7 +2174,7 @@
}
else if (strcmp(p->pattern, "-l") == 0) {
/* XXX: how do we do lstat in NSPR? */
-#if 0 /* !defined(__EMX__) && !defined(WIN32) */
+#if 0 /* !defined(OS2) && !defined(WIN32) */
if (lstat(input, &sb) == 0) {
if (S_ISLNK(sb.st_mode)) {
rc = 1;
@@ -2329,21 +2350,21 @@
char host[LONG_STRING_LEN];
char buf[MAX_STRING_LEN];
char *olduri;
+ int l;
-#ifdef APACHE_SSL
- if ( (!r->connection->client->ssl &&
- strncasecmp(r->filename, "http://", 7) == 0)
- || (r->connection->client->ssl &&
- strncasecmp(r->filename, "https://", 8) == 0)) {
-#else
- if (strncasecmp(r->filename, "http://", 7) == 0) {
-#endif
+ cp = ap_http_method(r);
+ l = strlen(cp);
+ if ( strlen(r->filename) > l+3
+ && strncasecmp(r->filename, cp, l) == 0
+ && r->filename[l] == ':'
+ && r->filename[l+1] == '/'
+ && r->filename[l+2] == '/' ) {
/* there was really a rewrite to a remote path */
olduri = ap_pstrdup(r->pool, r->filename); /* save for logging */
/* cut the hostname and port out of the URI */
- ap_cpystrn(buf, r->filename+strlen(ap_http_method(r))+3, sizeof(buf));
+ ap_cpystrn(buf, r->filename+(l+3), sizeof(buf));
hostp = buf;
for (cp = hostp; *cp != '\0' && *cp != '/' && *cp != ':'; cp++)
;
@@ -2594,8 +2615,8 @@
if (cpT != NULL) {
n = strlen(cpT);
if (cpO + n >= newuri + sizeof(newuri)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
- r->server, "insufficient space in "
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
+ r, "insufficient space in "
"expand_map_lookups, aborting");
return;
}
@@ -2605,8 +2626,8 @@
else {
n = strlen(defaultvalue);
if (cpO + n >= newuri + sizeof(newuri)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
- r->server, "insufficient space in "
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
+ r, "insufficient space in "
"expand_map_lookups, aborting");
return;
}
@@ -2620,8 +2641,8 @@
cpT = cpI+strlen(cpI);
n = cpT-cpI;
if (cpO + n >= newuri + sizeof(newuri)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
- r->server, "insufficient space in "
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
+ r, "insufficient space in "
"expand_map_lookups, aborting");
return;
}
@@ -2671,7 +2692,7 @@
if (strcmp(s->name, name) == 0) {
if (s->type == MAPTYPE_TXT) {
if (PR_GetFileInfo(s->checkfile, &st) != PR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"mod_rewrite: can't access text RewriteMap "
"file %s", s->checkfile);
rewritelog(r, 1, "can't open RewriteMap file, "
@@ -2706,7 +2727,7 @@
else if (s->type == MAPTYPE_DBM) {
#ifndef NO_DBM_REWRITEMAP
if (PR_GetFileInfo(s->checkfile, &st) != PR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"mod_rewrite: can't access DBM RewriteMap "
"file %s", s->checkfile);
rewritelog(r, 1, "can't open DBM RewriteMap file, "
@@ -2769,7 +2790,7 @@
}
else if (s->type == MAPTYPE_RND) {
if (PR_GetFileInfo(s->checkfile, &st) != PR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"mod_rewrite: can't access text RewriteMap "
"file %s", s->checkfile);
rewritelog(r, 1, "can't open RewriteMap file, "
@@ -2936,7 +2957,7 @@
for (cp = value = ap_pstrdup(r->pool, key); cp != NULL && *cp != '\0';
cp++) {
- *cp = toupper(*cp);
+ *cp = ap_toupper(*cp);
}
return value;
}
@@ -2947,7 +2968,7 @@
for (cp = value = ap_pstrdup(r->pool, key); cp != NULL && *cp != '\0';
cp++) {
- *cp = tolower(*cp);
+ *cp = ap_tolower(*cp);
}
return value;
}
@@ -3419,7 +3440,7 @@
child_pid = pi.dwProcessId;
}
}
-#elif defined(__EMX__)
+#elif defined(OS2)
/* IBM OS/2 */
execl(SHELL_PATH, SHELL_PATH, "/c", (char *)cmd, NULL);
#else
@@ -3595,7 +3616,8 @@
result = ap_get_server_version();
}
else if (strcasecmp(var, "API_VERSION") == 0) { /* non-standard */
- ap_snprintf(resultbuf, sizeof(resultbuf), "%d", MODULE_MAGIC_NUMBER);
+ ap_snprintf(resultbuf, sizeof(resultbuf), "%d:%d",
+ MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
result = resultbuf;
}
@@ -3745,6 +3767,7 @@
continue;
}
if (strcasecmp(hdrs[i].key, name) == 0) {
+ ap_table_merge(r->notes, VARY_KEY_THIS, name);
return hdrs[i].val;
}
}
@@ -4100,7 +4123,7 @@
#endif
if (rc < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"mod_rewrite: failed to lock file descriptor");
exit(1);
}
@@ -4130,7 +4153,7 @@
#endif
if (rc < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
"mod_rewrite: failed to unlock file descriptor");
exit(1);
}
1.3 +10 -2 apache-2.0/apache-nspr/modules/standard/mod_rewrite.h
Index: mod_rewrite.h
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_rewrite.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_rewrite.h 1998/06/30 08:57:12 1.2
+++ mod_rewrite.h 1998/09/22 18:05:40 1.3
@@ -96,11 +96,19 @@
/* Include from the Apache server ... */
#include "httpd.h"
#include "http_config.h"
+#include "http_conf_globals.h"
#include "http_request.h"
#include "http_core.h"
#include "http_log.h"
#include "http_vhost.h"
+ /*
+ * The key in the r->notes table wherein we store our accumulated
+ * Vary values, and the one used for per-condition checks in a chain.
+ */
+#define VARY_KEY "rewrite-Vary"
+#define VARY_KEY_THIS "rewrite-Vary-this"
+
/* The NDBM support:
* We support only NDBM files.
* But we have to stat the file for the mtime,
@@ -118,7 +126,7 @@
/* The locking support:
* Try to determine whether we should use fcntl() or flock().
- * Would be better conf.h could provide this... :-(
+ * Would be better ap_config.h could provide this... :-(
*/
#if defined(USE_FCNTL_SERIALIZED_ACCEPT)
#define USE_FCNTL 1
@@ -217,7 +225,7 @@
#define LONG_STRING_LEN 2048
#endif
-#define MAX_ENV_FLAGS 5
+#define MAX_ENV_FLAGS 15
#define MAX_NMATCH 10
1.3 +4 -0 apache-2.0/apache-nspr/modules/standard/mod_so.c
Index: mod_so.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_so.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_so.c 1998/06/30 08:57:12 1.2
+++ mod_so.c 1998/09/22 18:05:40 1.3
@@ -153,6 +153,10 @@
soc = (so_server_conf *)ap_pcalloc(p, sizeof(so_server_conf));
soc->loaded_modules = ap_make_array(p, DYNAMIC_MODULE_LIMIT,
sizeof(moduleinfo));
+#ifndef NO_DLOPEN
+ ap_os_dso_init();
+#endif
+
return (void *)soc;
}
1.3 +146 -66 apache-2.0/apache-nspr/modules/standard/mod_speling.c
Index: mod_speling.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_speling.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_speling.c 1998/06/30 08:57:13 1.2
+++ mod_speling.c 1998/09/22 18:05:41 1.3
@@ -68,7 +68,8 @@
* capitalizations. If it finds a match, it sends a redirect.
*
* 08-Aug-1997 <Ma...@Mch.SNI.De>
- * o Upgraded module interface to apache_1.3a2-dev API (more NULL's in speling_module).
+ * o Upgraded module interface to apache_1.3a2-dev API (more NULL's in
+ * speling_module).
* o Integrated tcsh's "spelling correction" routine which allows one
* misspelling (character insertion/omission/typo/transposition).
* Rewrote it to ignore case as well. This ought to catch the majority
@@ -84,29 +85,64 @@
MODULE_VAR_EXPORT module speling_module;
-/* We use the "unconventional" mod_userdir approach here. And heck,
- * here it's just one int!
+typedef struct {
+ int enabled;
+} spconfig;
+
+/*
+ * Create a configuration specific to this module for a server or directory
+ * location, and fill it with the default settings.
+ *
+ * The API says that in the absence of a merge function, the record for the
+ * closest ancestor is used exclusively. That's what we want, so we don't
+ * bother to have such a function.
+ */
+
+static void *mkconfig(pool *p)
+{
+ spconfig *cfg = ap_pcalloc(p, sizeof(spconfig));
+
+ cfg->enabled = 0;
+ return cfg;
+}
+
+/*
+ * Respond to a callback to create configuration record for a server or
+ * vhost environment.
*/
+static void *create_mconfig_for_server(pool *p, server_rec *s)
+{
+ return mkconfig(p);
+}
-static void *create_speling_config(pool *dummy, server_rec *s)
+/*
+ * Respond to a callback to create a config record for a specific directory.
+ */
+static void *create_mconfig_for_directory(pool *p, char *dir)
{
- return (void *) 0;
+ return mkconfig(p);
}
-static const char *set_speling(cmd_parms *cmd, void *dummy, int arg)
+/*
+ * Handler for the CheckSpelling directive, which is FLAG.
+ */
+static const char *set_speling(cmd_parms *cmd, void *mconfig, int arg)
{
- void *server_conf = cmd->server->module_config;
+ spconfig *cfg = (spconfig *) mconfig;
- /* any non-NULL pointer means speling is enabled */
- ap_set_module_config(server_conf, &speling_module, arg ? (void *) &speling_module : NULL);
+ cfg->enabled = arg;
return NULL;
}
+/*
+ * Define the directives specific to this module. This structure is referenced
+ * later by the 'module' structure.
+ */
static const command_rec speling_cmds[] =
{
- {"CheckSpelling", set_speling, NULL, RSRC_CONF, FLAG,
- "whether or not to fix miscapitalized/misspelled requests"},
- {NULL}
+ { "CheckSpelling", set_speling, NULL, OR_OPTIONS, FLAG,
+ "whether or not to fix miscapitalized/misspelled requests" },
+ { NULL }
};
typedef enum {
@@ -156,22 +192,29 @@
static sp_reason spdist(const char *s, const char *t)
{
- for (; tolower(*s) == tolower(*t); t++, s++)
- if (*t == '\0')
+ for (; ap_tolower(*s) == ap_tolower(*t); t++, s++) {
+ if (*t == '\0') {
return SP_MISCAPITALIZED; /* exact match (sans case) */
+ }
+ }
if (*s) {
if (*t) {
- if (s[1] && t[1] && tolower(*s) == tolower(t[1]) &&
- tolower(*t) == tolower(s[1]) && strcasecmp(s + 2, t + 2) == 0)
+ if (s[1] && t[1] && ap_tolower(*s) == ap_tolower(t[1])
+ && ap_tolower(*t) == ap_tolower(s[1])
+ && strcasecmp(s + 2, t + 2) == 0) {
return SP_TRANSPOSITION; /* transposition */
- if (strcasecmp(s + 1, t + 1) == 0)
+ }
+ if (strcasecmp(s + 1, t + 1) == 0) {
return SP_SIMPLETYPO; /* 1 char mismatch */
+ }
}
- if (strcasecmp(s + 1, t) == 0)
+ if (strcasecmp(s + 1, t) == 0) {
return SP_EXTRACHAR; /* extra character */
+ }
}
- if (*t && strcasecmp(s, t + 1) == 0)
+ if (*t && strcasecmp(s, t + 1) == 0) {
return SP_MISSINGCHAR; /* missing character */
+ }
return SP_VERYDIFFERENT; /* distance too large to fix. */
}
@@ -183,27 +226,32 @@
static int check_speling(request_rec *r)
{
- void *server_conf = r->server->module_config;
+ spconfig *cfg;
char *good, *bad, *postgood, *url;
int filoc, dotloc, urlen, pglen;
PRDir *dirp;
PRDirEntry *dir_entry;
array_header *candidates = NULL;
- if (!ap_get_module_config(server_conf, &speling_module))
+ cfg = ap_get_module_config(r->per_dir_config, &speling_module);
+ if (!cfg->enabled) {
return DECLINED;
+ }
/* We only want to worry about GETs */
- if (r->method_number != M_GET)
+ if (r->method_number != M_GET) {
return DECLINED;
+ }
/* We've already got a file of some kind or another */
if (r->proxyreq || r->file_exists)
return DECLINED;
+ }
/* This is a sub request - don't mess with it */
- if (r->main)
+ if (r->main) {
return DECLINED;
+ }
/*
* The request should end up looking like this:
@@ -214,9 +262,13 @@
*/
filoc = ap_rind(r->filename, '/');
- /* Don't do anything if the request doesn't contain a slash, or requests "/" */
- if (filoc == -1 || strcmp(r->uri, "/") == 0)
+ /*
+ * Don't do anything if the request doesn't contain a slash, or
+ * requests "/"
+ */
+ if (filoc == -1 || strcmp(r->uri, "/") == 0) {
return DECLINED;
+ }
/* good = /correct-file */
good = ap_pstrndup(r->pool, r->filename, filoc);
@@ -229,22 +281,25 @@
pglen = strlen(postgood);
/* Check to see if the URL pieces add up */
- if (strcmp(postgood, r->uri + (urlen - pglen)))
+ if (strcmp(postgood, r->uri + (urlen - pglen))) {
return DECLINED;
+ }
/* url = /correct-url */
url = ap_pstrndup(r->pool, r->uri, (urlen - pglen));
/* Now open the directory and do ourselves a check... */
dirp = ap_popendir(r->pool, good);
- if (dirp == NULL) /* Oops, not a directory... */
+ if (dirp == NULL) { /* Oops, not a directory... */
return DECLINED;
+ }
candidates = ap_make_array(r->pool, 2, sizeof(misspelled_file));
dotloc = ap_ind(bad, '.');
- if (dotloc == -1)
+ if (dotloc == -1) {
dotloc = strlen(bad);
+ }
while ((dir_entry = PR_ReadDir(dirp, PR_SKIP_NONE)) != NULL) {
sp_reason q;
@@ -263,7 +318,9 @@
* file, upper case request)
*/
else if (strcasecmp(bad, dir_entry->name) == 0) {
- misspelled_file *sp_new = (misspelled_file *) ap_push_array(candidates);
+ misspelled_file *sp_new;
+
+ sp_new = (misspelled_file *) ap_push_array(candidates);
sp_new->name = ap_pstrdup(r->pool, dir_entry->name);
sp_new->quality = SP_MISCAPITALIZED;
}
@@ -272,26 +329,31 @@
* missing/extra/transposed char)
*/
else if ((q = spdist(bad, dir_entry->name)) != SP_VERYDIFFERENT) {
- misspelled_file *sp_new = (misspelled_file *) ap_push_array(candidates);
+ misspelled_file *sp_new;
+
+ sp_new = (misspelled_file *) ap_push_array(candidates);
sp_new->name = ap_pstrdup(r->pool, dir_entry->name);
sp_new->quality = q;
}
- /* The spdist() should have found the majority of the misspelled requests.
- * it is of questionable use to continue looking for files with the same
- * base name, but potentially of totally wrong type (index.html <-> index.db)
- * I would propose to not set the WANT_BASENAME_MATCH define.
+ /*
+ * The spdist() should have found the majority of the misspelled
+ * requests. It is of questionable use to continue looking for
+ * files with the same base name, but potentially of totally wrong
+ * type (index.html <-> index.db).
+ * I would propose to not set the WANT_BASENAME_MATCH define.
* 08-Aug-1997 <Ma...@Mch.SNI.De>
*
* However, Alexei replied giving some reasons to add it anyway:
* > Oh, by the way, I remembered why having the
* > extension-stripping-and-matching stuff is a good idea:
* >
- * > If you're using MultiViews, and have a file named foobar.html, which you
- * > refer to as "foobar", and someone tried to access "Foobar", mod_speling
- * > won't find it, because it won't find anything matching that
- * > spelling. With the extension-munging, it would locate "foobar.html". Not
- * > perfect, but I ran into that problem when I first wrote the module.
- */
+ * > If you're using MultiViews, and have a file named foobar.html,
+ * > which you refer to as "foobar", and someone tried to access
+ * > "Foobar", mod_speling won't find it, because it won't find
+ * > anything matching that spelling. With the extension-munging,
+ * > it would locate "foobar.html". Not perfect, but I ran into
+ * > that problem when I first wrote the module.
+ */
else {
#ifdef WANT_BASENAME_MATCH
/*
@@ -311,7 +373,9 @@
if ((dotloc == entloc)
&& !strncasecmp(bad, dir_entry->name, dotloc)) {
- misspelled_file *sp_new = (misspelled_file *) ap_push_array(candidates);
+ misspelled_file *sp_new;
+
+ sp_new = (misspelled_file *) ap_push_array(candidates);
sp_new->name = ap_pstrdup(r->pool, dir_entry->name);
sp_new->quality = SP_VERYDIFFERENT;
}
@@ -335,23 +399,26 @@
/*
* Conditions for immediate redirection:
* a) the first candidate was not found by stripping the suffix
- * AND b) there exists only one candidate OR the best match is not ambigous
+ * AND b) there exists only one candidate OR the best match is not
+ * ambiguous
* then return a redirection right away.
*/
- if (variant[0].quality != SP_VERYDIFFERENT &&
- (candidates->nelts == 1 || variant[0].quality != variant[1].quality)) {
+ if (variant[0].quality != SP_VERYDIFFERENT
+ && (candidates->nelts == 1
+ || variant[0].quality != variant[1].quality)) {
nuri = ap_pstrcat(r->pool, url, variant[0].name, r->path_info,
r->parsed_uri.query ? "?" : "",
- r->parsed_uri.query ? r->parsed_uri.query : "", NULL);
+ r->parsed_uri.query ? r->parsed_uri.query : "",
+ NULL);
ap_table_setn(r->headers_out, "Location",
- ap_construct_url(r->pool, nuri, r));
+ ap_construct_url(r->pool, nuri, r));
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r->server,
- ref ? "Fixed spelling: %s to %s from %s"
- : "Fixed spelling: %s to %s",
- r->uri, nuri, ref);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r,
+ ref ? "Fixed spelling: %s to %s from %s"
+ : "Fixed spelling: %s to %s",
+ r->uri, nuri, ref);
return HTTP_MOVED_PERMANENTLY;
}
@@ -374,7 +441,8 @@
}
/* Generate the response text. */
- /* Since the text is expanded by repeated calls of
+ /*
+ * Since the text is expanded by repeated calls of
* t = pstrcat(p, t, ".."), we can avoid a little waste
* of memory by adding the header AFTER building the list.
* XXX: FIXME: find a way to build a string concatenation
@@ -387,12 +455,15 @@
/* The format isn't very neat... */
t = ap_pstrcat(p, t, "<li><a href=\"", url,
- variant[i].name, r->path_info, "\">",
variant[i].name, r->path_info,
r->parsed_uri.query ? "?" : "",
r->parsed_uri.query ? r->parsed_uri.query : "",
+ "\">", variant[i].name, r->path_info,
+ r->parsed_uri.query ? "?" : "",
+ r->parsed_uri.query ? r->parsed_uri.query : "",
"</a> (",
- sp_reason_str[(int) (variant[i].quality)], ")\n", NULL);
+ sp_reason_str[(int) (variant[i].quality)],
+ ")\n", NULL);
/*
* when we have printed the "close matches" and there are
@@ -404,26 +475,35 @@
if (i > 0 && i < candidates->nelts - 1
&& variant[i].quality != SP_VERYDIFFERENT
&& variant[i + 1].quality == SP_VERYDIFFERENT) {
- t = ap_pstrcat(p, t, "</ul>\nFurthermore, the following related documents were found:\n<ul>\n", NULL);
+ t = ap_pstrcat(p, t,
+ "</ul>\nFurthermore, the following related "
+ "documents were found:\n<ul>\n", NULL);
}
}
t = ap_pstrcat(p, "The document name you requested (<code>",
- r->uri, "</code>) could not be found on this server.\n"
- "However, we found documents with names similar to the one you requested.<p>"
- "Available documents:\n<ul>\n", t, "</ul>\n", NULL);
+ r->uri,
+ "</code>) could not be found on this server.\n"
+ "However, we found documents with names similar "
+ "to the one you requested.<p>"
+ "Available documents:\n<ul>\n", t, "</ul>\n", NULL);
/* If we know there was a referring page, add a note: */
- if (ref != NULL)
- t = ap_pstrcat(p, t, "Please consider informing the owner of the <a href=\"",
- ref, "\">referring page</a> about the broken link.\n", NULL);
+ if (ref != NULL) {
+ t = ap_pstrcat(p, t,
+ "Please consider informing the owner of the "
+ "<a href=\"", ref,
+ "\">referring page</a> "
+ "about the broken link.\n",
+ NULL);
+ }
/* Pass our table to http_protocol.c (see mod_negotiation): */
ap_table_setn(notes, "variant-list", t);
- ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r->server,
- ref ? "Spelling fix: %s: %d candidates from %s"
- : "Spelling fix: %s: %d candidates",
- r->uri, candidates->nelts, ref);
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r,
+ ref ? "Spelling fix: %s: %d candidates from %s"
+ : "Spelling fix: %s: %d candidates",
+ r->uri, candidates->nelts, ref);
return HTTP_MULTIPLE_CHOICES;
}
@@ -436,9 +516,9 @@
{
STANDARD_MODULE_STUFF,
NULL, /* initializer */
- NULL, /* create per-dir config */
+ create_mconfig_for_directory, /* create per-dir config */
NULL, /* merge per-dir config */
- create_speling_config, /* server config */
+ create_mconfig_for_server, /* server config */
NULL, /* merge server config */
speling_cmds, /* command table */
NULL, /* handlers */
1.4 +193 -149 apache-2.0/apache-nspr/modules/standard/mod_status.c
Index: mod_status.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_status.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- mod_status.c 1998/09/22 16:12:07 1.3
+++ mod_status.c 1998/09/22 18:05:41 1.4
@@ -91,27 +91,16 @@
* piece in short reports [Ben Laurie]
* 21.5.96 Additional Status codes (DNS and LOGGING only enabled if
* extended STATUS is enabled) [George Burgyan/Jim J.]
+ * 10.8.98 Allow for extended status info at runtime (no more STATUS)
+ * [Jim J.]
*/
-/*
- * Module definition information - the part between the -START and -END
- * lines below is used by Configure. This could be stored in a separate
- * instead.
- *
- * MODULE-DEFINITION-START
- * Name: status_module
- * ConfigStart
- if [ "$RULE_STATUS" = "yes" ]; then
- CFLAGS="$CFLAGS -DSTATUS"
- fi
- * ConfigEnd
- * MODULE-DEFINITION-END
- */
-
+#define CORE_PRIVATE
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_protocol.h"
+#include "http_conf_globals.h" /* for ap_extended_status */
#include "http_main.h"
#include "util_script.h"
#include <time.h>
@@ -145,9 +134,33 @@
module MODULE_VAR_EXPORT status_module;
-#ifdef STATUS
-/* Format the number of bytes nicely */
+/*
+ *command-related code. This is here to prevent use of ExtendedStatus
+ * without status_module included.
+ */
+static const char *set_extended_status(cmd_parms *cmd, void *dummy, char *arg)
+{
+ const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err != NULL) {
+ return err;
+ }
+ if (!strcasecmp(arg, "off") || !strcmp(arg, "0")) {
+ ap_extended_status = 0;
+ }
+ else {
+ ap_extended_status = 1;
+ }
+ return NULL;
+}
+
+static const command_rec status_module_cmds[] =
+{
+ { "ExtendedStatus", set_extended_status, NULL, RSRC_CONF, TAKE1,
+ "\"On\" to enable extended status information, \"Off\" to disable" },
+ {NULL}
+};
+/* Format the number of bytes nicely */
static void format_byte_out(request_rec *r, unsigned long bytes)
{
if (bytes < (5 * KBYTE))
@@ -169,9 +182,8 @@
else
ap_rprintf(r, "%.1f GB", (float) kbytes / MBYTE);
}
-
-#endif
+/* XXX: I'm sure this shouldn't be a long */
static void show_time(request_rec *r, long tsecs)
{
long days, hrs, mins, secs;
@@ -225,7 +237,6 @@
int i, res;
int ready = 0;
int busy = 0;
-#if defined(STATUS)
unsigned long count = 0;
unsigned long lres, bytes;
unsigned long my_lres, my_bytes, conn_bytes;
@@ -233,18 +244,19 @@
unsigned long bcount = 0;
unsigned long kbcount = 0;
PRTime req_time;
-#endif /* STATUS */
+ long req_time;
int short_report = 0;
int no_table_report = 0;
short_score score_record;
parent_score ps_record;
char stat_buffer[HARD_SERVER_LIMIT];
+ int pid_buffer[HARD_SERVER_LIMIT];
clock_t tu, ts, tcu, tcs;
tu = ts = tcu = tcs = 0;
if (!ap_exists_scoreboard_image()) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server,
+ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
"Server status unavailable in inetd mode");
return HTTP_INTERNAL_SERVER_ERROR;
}
@@ -265,10 +277,12 @@
switch (status_options[i].id) {
case STAT_OPT_REFRESH:
if (*(loc + strlen(status_options[i].form_data_str)) == '=')
- ap_table_set(r->headers_out, status_options[i].hdr_out_str,
- loc + strlen(status_options[i].hdr_out_str) + 1);
+ ap_table_set(r->headers_out,
+ status_options[i].hdr_out_str,
+ loc + strlen(status_options[i].hdr_out_str) + 1);
else
- ap_table_set(r->headers_out, status_options[i].hdr_out_str, "1");
+ ap_table_set(r->headers_out,
+ status_options[i].hdr_out_str, "1");
break;
case STAT_OPT_NOTABLE:
no_table_report = 1;
@@ -293,28 +307,29 @@
ps_record = ap_scoreboard_image->parent[i];
res = score_record.status;
stat_buffer[i] = status_flags[res];
+ pid_buffer[i] = (int) ps_record.pid;
if (res == SERVER_READY)
ready++;
else if (res != SERVER_DEAD)
busy++;
-#if defined(STATUS)
- lres = score_record.access_count;
- bytes = score_record.bytes_served;
- if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) {
+ if (ap_extended_status) {
+ lres = score_record.access_count;
+ bytes = score_record.bytes_served;
+ if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) {
#ifndef NO_TIMES
- tu += score_record.times.tms_utime;
- ts += score_record.times.tms_stime;
- tcu += score_record.times.tms_cutime;
- tcs += score_record.times.tms_cstime;
+ tu += score_record.times.tms_utime;
+ ts += score_record.times.tms_stime;
+ tcu += score_record.times.tms_cutime;
+ tcs += score_record.times.tms_cstime;
#endif /* NO_TIMES */
- count += lres;
- bcount += bytes;
- if (bcount >= KBYTE) {
- kbcount += (bcount >> 10);
- bcount = bcount & 0x3ff;
+ count += lres;
+ bcount += bytes;
+ if (bcount >= KBYTE) {
+ kbcount += (bcount >> 10);
+ bcount = bcount & 0x3ff;
+ }
}
}
-#endif /* STATUS */
}
up_time = nowtime - ap_restart_time;
@@ -324,73 +339,80 @@
ap_rputs("<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n</HEAD><BODY>\n", r);
ap_rputs("<H1>Apache Server Status for ", r);
ap_rvputs(r, ap_get_server_name(r), "</H1>\n\n", NULL);
- ap_rvputs(r, "Server Version: ", ap_get_server_version(), "<br>\n",
- NULL);
- ap_rvputs(r, "Server Built: ", ap_get_server_built(), "<br>\n<hr>\n",
- NULL);
-
- ap_rvputs(r, "Current Time: ", ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0),
+ ap_rvputs(r, "Server Version: ",
+ ap_get_server_version(), "<br>\n", NULL);
+ ap_rvputs(r, "Server Built: ",
+ ap_get_server_built(), "<br>\n<hr>\n", NULL);
+ ap_rvputs(r, "Current Time: ",
+ ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0),
"<br>\n", NULL);
- ap_rvputs(r, "Restart Time: ", ap_ht_time(r->pool, ap_restart_time, DEFAULT_TIME_FORMAT, 0),
+ ap_rvputs(r, "Restart Time: ",
+ ap_ht_time(r->pool, ap_restart_time, DEFAULT_TIME_FORMAT, 0),
"<br>\n", NULL);
ap_rputs("Server uptime: ", r);
show_time(r, (long)up_time);
ap_rputs("<br>\n", r);
}
-#if defined(STATUS)
- if (short_report) {
- ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %lu\n", count, kbcount);
+ if (ap_extended_status) {
+ if (short_report) {
+ ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %lu\n",
+ count, kbcount);
#ifndef NO_TIMES
- /* Allow for OS/2 not having CPU stats */
- if (ts || tu || tcu || tcs)
- ap_rprintf(r, "CPULoad: %g\n", (tu + ts + tcu + tcs) / tick / up_time * 100.);
+ /* Allow for OS/2 not having CPU stats */
+ if (ts || tu || tcu || tcs)
+ ap_rprintf(r, "CPULoad: %g\n",
+ (tu + ts + tcu + tcs) / tick / up_time * 100.);
#endif
-
- ap_rprintf(r, "Uptime: %ld\n", (long) (up_time));
- if (up_time > 0)
- ap_rprintf(r, "ReqPerSec: %g\n", (float) count / (float) up_time);
- if (up_time > 0)
- ap_rprintf(r, "BytesPerSec: %g\n", KBYTE * (float) kbcount / (float) up_time);
+ ap_rprintf(r, "Uptime: %ld\n", (long) (up_time));
+ if (up_time > 0)
+ ap_rprintf(r, "ReqPerSec: %g\n",
+ (float) count / (float) up_time);
- if (count > 0)
- ap_rprintf(r, "BytesPerReq: %g\n", KBYTE * (float) kbcount / (float) count);
- }
- else { /* !short_report */
- ap_rprintf(r, "Total accesses: %lu - Total Traffic: ", count);
- format_kbyte_out(r, kbcount);
+ if (up_time > 0)
+ ap_rprintf(r, "BytesPerSec: %g\n",
+ KBYTE * (float) kbcount / (float) up_time);
+
+ if (count > 0)
+ ap_rprintf(r, "BytesPerReq: %g\n",
+ KBYTE * (float) kbcount / (float) count);
+ }
+ else { /* !short_report */
+ ap_rprintf(r, "Total accesses: %lu - Total Traffic: ", count);
+ format_kbyte_out(r, kbcount);
#ifndef NO_TIMES
- /* Allow for OS/2 not having CPU stats */
- ap_rputs("<br>\n", r);
- ap_rprintf(r, "CPU Usage: u%g s%g cu%g cs%g",
- tu / tick, ts / tick, tcu / tick, tcs / tick);
+ /* Allow for OS/2 not having CPU stats */
+ ap_rputs("<br>\n", r);
+ ap_rprintf(r, "CPU Usage: u%g s%g cu%g cs%g",
+ tu / tick, ts / tick, tcu / tick, tcs / tick);
- if (ts || tu || tcu || tcs)
- ap_rprintf(r, " - %.3g%% CPU load", (tu + ts + tcu + tcs) / tick / up_time * 100.);
+ if (ts || tu || tcu || tcs)
+ ap_rprintf(r, " - %.3g%% CPU load",
+ (tu + ts + tcu + tcs) / tick / up_time * 100.);
#endif
- ap_rputs("<br>\n", r);
+ ap_rputs("<br>\n", r);
- if (up_time > 0)
- ap_rprintf(r, "%.3g requests/sec - ",
- (float) count / (float) up_time);
+ if (up_time > 0)
+ ap_rprintf(r, "%.3g requests/sec - ",
+ (float) count / (float) up_time);
- if (up_time > 0) {
- format_byte_out(r, KBYTE * (float) kbcount / (float) up_time);
- ap_rputs("/second - ", r);
- }
+ if (up_time > 0) {
+ format_byte_out(r, KBYTE * (float) kbcount / (float) up_time);
+ ap_rputs("/second - ", r);
+ }
- if (count > 0) {
- format_byte_out(r, KBYTE * (float) kbcount / (float) count);
- ap_rputs("/request", r);
- }
+ if (count > 0) {
+ format_byte_out(r, KBYTE * (float) kbcount / (float) count);
+ ap_rputs("/request", r);
+ }
- ap_rputs("<br>\n", r);
- } /* short_report */
-#endif /* STATUS */
+ ap_rputs("<br>\n", r);
+ } /* short_report */
+ } /* ap_extended_status */
if (!short_report)
ap_rprintf(r, "\n%d requests currently being processed, %d idle servers\n"
@@ -425,51 +447,70 @@
ap_rputs("\"<B><code>L</code></B>\" Logging, \n", r);
ap_rputs("\"<B><code>G</code></B>\" Gracefully finishing, \n", r);
ap_rputs("\"<B><code>.</code></B>\" Open slot with no current process<P>\n", r);
+ ap_rputs("<P>\n", r);
+ if (!ap_extended_status) {
+ int j = 0;
+ ap_rputs("PID Key: <br>\n", r);
+ ap_rputs("<PRE>\n", r);
+ for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
+ if (stat_buffer[i] != '.') {
+ ap_rprintf(r, " %d in state: %c ", pid_buffer[i],
+ stat_buffer[i]);
+ if (++j >= 3) {
+ ap_rputs("\n", r);
+ j = 0;
+ } else
+ ap_rputs(",", r);
+ }
+ }
+ ap_rputs("\n", r);
+ ap_rputs("</PRE>\n", r);
+ }
}
-#if defined(STATUS)
- if (!short_report) {
- if (no_table_report)
- ap_rputs("<p><hr><h2>Server Details</h2>\n\n", r);
- else
+ if (ap_extended_status) {
+ if (!short_report) {
+ if (no_table_report)
+ ap_rputs("<p><hr><h2>Server Details</h2>\n\n", r);
+ else
#ifdef NO_TIMES
- /* Allow for OS/2 not having CPU stats */
- ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Host<th>VHost<th>Request</tr>\n\n", r);
+ /* Allow for OS/2 not having CPU stats */
+ ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r);
#else
- ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Host<th>VHost<th>Request</tr>\n\n", r);
+ ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r);
#endif
- }
-
- for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
- score_record = ap_scoreboard_image->servers[i];
- ps_record = ap_scoreboard_image->parent[i];
-
- if (score_record.start_time == (PRTime)0 ||
- score_record.stop_time == (PRTime)0 )
- req_time = 0L;
- else {
- req_time = score_record.stop_time - score_record.start_time;
- req_time = req_time / PR_USEC_PER_MSEC;
}
- if (req_time < 0L)
- req_time = 0L;
- lres = score_record.access_count;
- my_lres = score_record.my_access_count;
- conn_lres = score_record.conn_count;
- bytes = score_record.bytes_served;
- my_bytes = score_record.my_bytes_served;
- conn_bytes = score_record.conn_bytes;
- if (lres != 0 || (score_record.status != SERVER_READY
- && score_record.status != SERVER_DEAD)) {
- if (!short_report) {
- if (no_table_report) {
- if (score_record.status == SERVER_DEAD)
- ap_rprintf(r, "<b>Server %d</b> (-): %d|%lu|%lu [",
- i, (int) conn_lres, my_lres, lres);
- else
- ap_rprintf(r, "<b>Server %d</b>: %d|%lu|%lu [",
- i, (int) conn_lres, my_lres, lres);
+ for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
+ score_record = ap_scoreboard_image->servers[i];
+ ps_record = ap_scoreboard_image->parent[i];
+
+ if (score_record.start_time == (PRTime)0 ||
+ score_record.stop_time == (PRTime)0 )
+ req_time = 0L;
+ else {
+ req_time = score_record.stop_time - score_record.start_time;
+ req_time = req_time / PR_USEC_PER_MSEC;
+ }
+ if (req_time < 0L)
+ req_time = 0L;
+
+ lres = score_record.access_count;
+ my_lres = score_record.my_access_count;
+ conn_lres = score_record.conn_count;
+ bytes = score_record.bytes_served;
+ my_bytes = score_record.my_bytes_served;
+ conn_bytes = score_record.conn_bytes;
+ if (lres != 0 || (score_record.status != SERVER_READY
+ && score_record.status != SERVER_DEAD)) {
+ if (!short_report) {
+ if (no_table_report) {
+ if (score_record.status == SERVER_DEAD)
+ ap_rprintf(r, "<b>Server %d</b> (-): %d|%lu|%lu [",
+ i, (int) conn_lres, my_lres, lres);
+ else
+ ap_rprintf(r, "<b>Server %d</b>: %d|%lu|%lu [",
+ i, (int) conn_lres, my_lres, lres);
switch (score_record.status) {
case SERVER_READY:
@@ -504,11 +545,11 @@
break;
}
#ifdef NO_TIMES
- /* Allow for OS/2 not having CPU stats */
- ap_rprintf(r, "]\n %.0f %ld (",
+ /* Allow for OS/2 not having CPU stats */
+ ap_rprintf(r, "]\n %.0f %ld (",
#else
- ap_rprintf(r, "] u%g s%g cu%g cs%g\n %.0f %ld (",
+ ap_rprintf(r, "] u%g s%g cu%g cs%g\n %.0f %ld (",
score_record.times.tms_utime / tick,
score_record.times.tms_stime / tick,
score_record.times.tms_cutime / tick,
@@ -578,10 +619,10 @@
PR_USEC_PER_SEC, (long)req_time);
#else
#ifdef NO_TIMES
- /* Allow for OS/2 not having CPU stats */
- ap_rprintf(r, "\n<td>%.0f<td>%ld",
+ /* Allow for OS/2 not having CPU stats */
+ ap_rprintf(r, "\n<td>%.0f<td>%ld",
#else
- ap_rprintf(r, "\n<td>%.2f<td>%.0f<td>%ld",
+ ap_rprintf(r, "\n<td>%.2f<td>%.0f<td>%ld",
(score_record.times.tms_utime +
score_record.times.tms_stime +
score_record.times.tms_cutime +
@@ -593,17 +634,22 @@
ap_rprintf(r, "<td>%-1.1f<td>%-2.2f<td>%-2.2f\n",
(float) conn_bytes / KBYTE, (float) my_bytes / MBYTE,
(float) bytes / MBYTE);
- ap_rprintf(r, "<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
- score_record.client, score_record.vhost,
- ap_escape_html(r->pool, score_record.request));
- } /* no_table_report */
- } /* !short_report */
- } /* if (<active child>) */
- } /* for () */
-
- if (!(short_report || no_table_report)) {
-#ifdef __EMX__
- ap_rputs("</table>\n \
+ if (score_record.status == SERVER_BUSY_READ)
+ ap_rprintf(r,
+ "<td>?<td nowrap>?<td nowrap>..reading.. </tr>\n\n");
+ else
+ ap_rprintf(r,
+ "<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
+ score_record.client, score_record.vhost,
+ ap_escape_html(r->pool, score_record.request));
+ } /* no_table_report */
+ } /* !short_report */
+ } /* if (<active child>) */
+ } /* for () */
+
+ if (!(short_report || no_table_report)) {
+#ifdef NO_TIMES
+ ap_rputs("</table>\n \
<hr> \
<table>\n \
<tr><th>Srv<td>Server number\n \
@@ -616,7 +662,7 @@
<tr><th>Slot<td>Total megabytes transferred this slot\n \
</table>\n", r);
#else
- ap_rputs("</table>\n \
+ ap_rputs("</table>\n \
<hr> \
<table>\n \
<tr><th>Srv<td>Server number\n \
@@ -630,16 +676,14 @@
<tr><th>Slot<td>Total megabytes transferred this slot\n \
</table>\n", r);
#endif
- }
+ }
-#else /* !defined(STATUS) */
+ } else {
- ap_rputs("<hr>To obtain a full report with current status information and", r);
- ap_rputs(" DNS and LOGGING status codes \n", r);
- ap_rputs("you need to recompile Apache after adding the line <pre>", r);
- ap_rputs("Rule STATUS=yes</pre>into the file <code>Configuration</code>\n", r);
+ ap_rputs("<hr>To obtain a full report with current status information ", r);
+ ap_rputs("you need to use the <code>ExtendedStatus On</code> directive. \n", r);
-#endif /* STATUS */
+ }
if (!short_report) {
ap_rputs(ap_psignature("<HR>\n",r), r);
@@ -678,7 +722,7 @@
NULL, /* dir merger --- default is to override */
NULL, /* server config */
NULL, /* merge server config */
- NULL, /* command table */
+ status_module_cmds, /* command table */
status_handlers, /* handlers */
NULL, /* filename translation */
NULL, /* check_user_id */
1.3 +1 -1 apache-2.0/apache-nspr/modules/standard/mod_userdir.c
Index: mod_userdir.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/modules/standard/mod_userdir.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mod_userdir.c 1998/06/30 08:57:13 1.2
+++ mod_userdir.c 1998/09/22 18:05:41 1.3
@@ -298,7 +298,7 @@
#else /* WIN32 */
struct passwd *pw;
if ((pw = getpwnam(w))) {
-#ifdef __EMX__
+#ifdef OS2
/* Need to manually add user name for OS/2 */
filename = ap_pstrcat(r->pool, pw->pw_dir, w, "/", userdir, NULL);
#else
1.3 +100 -14 apache-2.0/apache-nspr/os/unix/os.c
Index: os.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/os/unix/os.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- os.c 1998/09/05 16:54:13 1.2
+++ os.c 1998/09/22 18:05:53 1.3
@@ -3,7 +3,7 @@
* Any inlineable functions should be defined in os-inline.c instead.
*/
-#include "conf.h"
+#include "ap_config.h"
#include "os.h"
#include "ap.h"
@@ -27,29 +27,103 @@
* dynamic shared object (DSO) mechanism
*/
+#ifdef RHAPSODY
+#include <mach-o/dyld.h>
+#include "httpd.h"
+#include "http_log.h"
+
+ap_private_extern
+void undefined_symbol_handler(const char *symbolName)
+{
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, NULL,
+ "dyld found undefined symbol: %s\n"
+ "Aborting.\n",
+ symbolName);
+ abort();
+}
+
+ap_private_extern
+NSModule multiple_symbol_handler (NSSymbol s, NSModule old, NSModule new)
+{
+ /*
+ * Since we can't unload symbols, we're going to run into this
+ * every time we reload a module. Workaround here is to just
+ * rebind to the new symbol, and forget about the old one.
+ * This is crummy, because it's basically a memory leak.
+ * (See Radar 2262020 against dyld).
+ */
+
+#ifdef DEBUG
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, NULL,
+ "dyld found a multiply defined symbol %s in modules:\n"
+ "%s\n%s\n",
+ NSNameOfSymbol(s),
+ NSNameOfModule(old), NSNameOfModule(new));
+#endif
+
+ return(new);
+}
+
+ap_private_extern
+void linkEdit_symbol_handler (NSLinkEditErrors c, int errorNumber,
+ const char *fileName, const char *errorString)
+{
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, NULL,
+ "dyld errors during link edit for file %s\n%s\n",
+ fileName, errorString);
+ abort();
+}
+
+#endif /*RHAPSODY*/
+
+void ap_os_dso_init(void)
+{
+#if defined(RHAPSODY)
+ NSLinkEditErrorHandlers handlers;
+
+ handlers.undefined = undefined_symbol_handler;
+ handlers.multiple = multiple_symbol_handler;
+ handlers.linkEdit = linkEdit_symbol_handler;
+
+ NSInstallLinkEditErrorHandlers(&handlers);
+#endif
+}
+
void *ap_os_dso_load(const char *path)
{
#if defined(HPUX) || defined(HPUX10)
shl_t handle;
handle = shl_load(path, BIND_IMMEDIATE|BIND_VERBOSE|BIND_NOSTART, 0L);
return (void *)handle;
-#else
-#if defined(OSF1) ||\
+
+#elif defined(RHAPSODY)
+ NSObjectFileImage image;
+ if (NSCreateObjectFileImageFromFile(path, &image) !=
+ NSObjectFileImageSuccess)
+ return NULL;
+ return NSLinkModule(image, path, TRUE);
+
+#elif defined(OSF1) ||\
(defined(__FreeBSD_version) && (__FreeBSD_version >= 220000))
- return dlopen((char *)path, RTLD_NOW);
+ return dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL);
+
#else
- return dlopen(path, RTLD_NOW);
+ return dlopen(path, RTLD_NOW | RTLD_GLOBAL);
#endif
-#endif
}
-void ap_os_dso_unload(void *handle)
+void ap_os_dso_unload(void *handle)
{
#if defined(HPUX) || defined(HPUX10)
shl_unload((shl_t)handle);
+
+#elif defined(RHAPSODY)
+ NSUnLinkModule(handle,FALSE);
+
#else
dlclose(handle);
#endif
+
return;
}
@@ -64,23 +138,35 @@
if (status == -1 && errno == 0) /* try TYPE_DATA instead */
status = shl_findsym((shl_t *)&handle, symname, TYPE_DATA, &symaddr);
return (status == -1 ? NULL : symaddr);
-#else /* ndef HPUX */
-#ifdef DLSYM_NEEDS_UNDERSCORE
- char symbol[256];
- ap_snprintf(symbol, sizeof symbol, "_%s", symname);
- return dlsym(handle, symbol);
+
+#elif defined(RHAPSODY)
+ NSSymbol symbol;
+ char *symname2 = (char*)malloc(sizeof(char)*(strlen(symname)+2));
+ sprintf(symname2, "_%s", symname);
+ symbol = NSLookupAndBindSymbol(symname2);
+ free(symname2);
+ return NSAddressOfSymbol(symbol);
+
+#elif defined(DLSYM_NEEDS_UNDERSCORE)
+ char *symbol = (char*)malloc(sizeof(char)*(strlen(symname)+2));
+ void *retval;
+ sprintf(symbol, "_%s", symname);
+ retval = dlsym(handle, symbol);
+ free(symbol);
+ return retval;
+
#else
return dlsym(handle, symname);
#endif
-#endif /* ndef HPUX */
}
const char *ap_os_dso_error(void)
{
#if defined(HPUX) || defined(HPUX10)
return strerror(errno);
+#elif defined(RHAPSODY)
+ return NULL;
#else
return dlerror();
#endif
}
-
1.3 +72 -76 apache-2.0/apache-nspr/os/win32/modules.c
Index: modules.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/os/win32/modules.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- modules.c 1998/06/30 08:57:14 1.2
+++ modules.c 1998/09/22 18:05:54 1.3
@@ -1,76 +1,72 @@
-/* modules.c --- automatically generated by Apache
- * configuration script. DO NOT HAND EDIT!!!!!
- */
-
-#include "httpd.h"
-#include "http_config.h"
-
-/*
- * For now, exclude cgi_module, asis_module and isapi_module...
- * they need some effort to port to NSPR
- */
-
-extern module core_module;
-extern module so_module;
-extern module mime_module;
-extern module access_module;
-extern module auth_module;
-extern module negotiation_module;
-extern module includes_module;
-extern module autoindex_module;
-extern module dir_module;
-/* extern module cgi_module; */
-extern module userdir_module;
-extern module alias_module;
-extern module env_module;
-extern module config_log_module;
-/* extern module asis_module; */
-extern module imap_module;
-extern module action_module;
-extern module setenvif_module;
-/* extern module isapi_module; */
-
-module *ap_prelinked_modules[] = {
- &core_module,
- &so_module,
- &mime_module,
- &access_module,
- &auth_module,
- &negotiation_module,
- &includes_module,
- &autoindex_module,
- &dir_module,
-/* &cgi_module, */
- &userdir_module,
- &alias_module,
- &env_module,
- &config_log_module,
-/* &asis_module, */
- &imap_module,
- &action_module,
- &setenvif_module,
-/* &isapi_module, */
- NULL
-};
-module *ap_preloaded_modules[] = {
- &core_module,
- &so_module,
- &mime_module,
- &access_module,
- &auth_module,
- &negotiation_module,
- &includes_module,
- &autoindex_module,
- &dir_module,
-/* &cgi_module, */
- &userdir_module,
- &alias_module,
- &env_module,
- &config_log_module,
-/* &asis_module, */
- &imap_module,
- &action_module,
- &setenvif_module,
-/* &isapi_module, */
- NULL
-};
+/* modules.c --- major modules compiled into Apache for Win32.
+ * Only insert an entry for a module if it must be compiled into
+ * the core server
+ */
+
+#include "httpd.h"
+#include "http_config.h"
+
+extern module core_module;
+extern module so_module;
+extern module mime_module;
+extern module access_module;
+extern module auth_module;
+extern module negotiation_module;
+extern module includes_module;
+extern module autoindex_module;
+extern module dir_module;
+extern module cgi_module;
+extern module userdir_module;
+extern module alias_module;
+extern module env_module;
+extern module config_log_module;
+extern module asis_module;
+extern module imap_module;
+extern module action_module;
+extern module setenvif_module;
+extern module isapi_module;
+
+module *ap_prelinked_modules[] = {
+ &core_module,
+ &so_module,
+ &mime_module,
+ &access_module,
+ &auth_module,
+ &negotiation_module,
+ &includes_module,
+ &autoindex_module,
+ &dir_module,
+ &cgi_module,
+ &userdir_module,
+ &alias_module,
+ &env_module,
+ &config_log_module,
+ &asis_module,
+ &imap_module,
+ &action_module,
+ &setenvif_module,
+ &isapi_module,
+ NULL
+};
+module *ap_preloaded_modules[] = {
+ &core_module,
+ &so_module,
+ &mime_module,
+ &access_module,
+ &auth_module,
+ &negotiation_module,
+ &includes_module,
+ &autoindex_module,
+ &dir_module,
+ &cgi_module,
+ &userdir_module,
+ &alias_module,
+ &env_module,
+ &config_log_module,
+ &asis_module,
+ &imap_module,
+ &action_module,
+ &setenvif_module,
+ &isapi_module,
+ NULL
+};
1.3 +388 -274 apache-2.0/apache-nspr/os/win32/util_win32.c
Index: util_win32.c
===================================================================
RCS file: /export/home/cvs/apache-2.0/apache-nspr/os/win32/util_win32.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- util_win32.c 1998/06/30 08:57:15 1.2
+++ util_win32.c 1998/09/22 18:05:54 1.3
@@ -1,274 +1,388 @@
-#include <windows.h>
-#include <assert.h>
-#include <sys/stat.h>
-#include <stdarg.h>
-#include <process.h>
-
-#include "httpd.h"
-
-static void sub_canonical_filename(char *szCanon, const char *szFile)
-{
- char buf[HUGE_STRING_LEN];
- int n;
- char *szFilePart;
- WIN32_FIND_DATA d;
- HANDLE h;
-
- n = GetFullPathName(szFile, sizeof buf, buf, &szFilePart);
- assert(n);
- assert(n < sizeof buf);
-
- /* If we have \\machine\share, convert to \\machine\share\ */
- if (buf[0] == '\\' && buf[1] == '\\') {
- char *s=strchr(buf+2,'\\');
- if(s && !strchr(s+1,'\\'))
- strcat(s+1,"\\");
- }
-
- if (!strchr(buf, '*') && !strchr(buf, '?')) {
- h = FindFirstFile(buf, &d);
- if(h != INVALID_HANDLE_VALUE)
- FindClose(h);
- }
- else {
- h=INVALID_HANDLE_VALUE;
- }
-
- if (szFilePart < buf+3) {
- strcpy(szCanon, buf);
- if(szCanon[0] != '\\') { /* a \ at the start means it is UNC, otherwise it is x: */
- assert(isalpha(szCanon[0]));
- assert(szCanon[1] == ':');
- szCanon[2] = '/';
- }
- else {
- char *s;
-
- assert(szCanon[1] == '\\');
- for(s=szCanon ; *s ; ++s)
- if(*s == '\\')
- *s='/';
- }
- return;
- }
- if (szFilePart != buf+3) {
- char b2[_MAX_PATH];
- assert(szFilePart > buf+3);
-
- szFilePart[-1]='\0';
- sub_canonical_filename(b2, buf);
-
- strcpy(szCanon, b2);
- strcat(szCanon, "/");
- }
- else {
- strcpy(szCanon, buf);
- szCanon[2] = '/';
- szCanon[3] = '\0';
- }
- if (h == INVALID_HANDLE_VALUE)
- strcat(szCanon, szFilePart);
- else {
- strlwr(d.cFileName);
- strcat(szCanon, d.cFileName);
- }
-}
-
-/* UNC requires backslashes, hence the conversion before canonicalisation. Not sure how
- * many backslashes (could be that \\machine\share\some/path/is/ok for example). For now, do
- * them all.
- */
-API_EXPORT(char *) ap_os_canonical_filename(pool *pPool, const char *szFile)
-{
- char buf[HUGE_STRING_LEN];
- char b2[HUGE_STRING_LEN];
- char *s;
-
- strcpy(b2,szFile);
- for(s=b2 ; *s ; ++s)
- if(*s == '/')
- *s='\\';
-
- sub_canonical_filename(buf, b2);
- buf[0]=tolower(buf[0]);
-
- if (*szFile && szFile[strlen(szFile)-1] == '/' && buf[strlen(buf)-1] != '/')
- strcat(buf, "/");
-
- return ap_pstrdup(pPool, buf);
-}
-
-/* Win95 doesn't like trailing /s. NT and Unix don't mind. This works
- * around the problem.
- * Errr... except if it is UNC and we are referring to the root of the UNC, we MUST have
- * a trailing \ and we can't use /s. Jeez. Not sure if this refers to all UNCs or just roots,
- * but I'm going to fix it for all cases for now. (Ben)
- */
-
-#undef stat
-API_EXPORT(int) os_stat(const char *szPath, struct stat *pStat)
-{
- int n;
-
- ap_assert(szPath[1] == ':' || szPath[1] == '/'); // we are dealing with either UNC or a drive
-
- if(szPath[0] == '/') {
- char buf[_MAX_PATH];
- char *s;
- int nSlashes=0;
-
- ap_assert(strlen(szPath) < _MAX_PATH);
- strcpy(buf,szPath);
- for(s=buf ; *s ; ++s)
- if(*s == '/') {
- *s='\\';
- ++nSlashes;
- }
- if(nSlashes == 3) /* then we need to add one more to get \\machine\share\ */
- *s++='\\';
- *s='\0';
- return stat(buf,pStat);
- }
-
- n = strlen(szPath);
- if(szPath[n-1] == '\\' || szPath[n-1] == '/') {
- char buf[_MAX_PATH];
-
- ap_assert(n < _MAX_PATH);
- strcpy(buf, szPath);
- buf[n-1] = '\0';
-
- return stat(buf, pStat);
- }
- return stat(szPath, pStat);
-}
-
-/* Fix two really crap problems with Win32 spawn[lv]e*:
- *
- * 1. Win32 doesn't deal with spaces in argv.
- * 2. Win95 doesn't like / in cmdname.
- */
-
-#undef _spawnv
-API_EXPORT(int) os_spawnv(int mode, const char *cmdname, const char *const *argv)
-{
- int n;
- char **aszArgs;
- const char *szArg;
- char *szCmd;
- char *s;
-
- szCmd = _alloca(strlen(cmdname)+1);
- strcpy(szCmd, cmdname);
- for (s = szCmd; *s; ++s)
- if (*s == '/')
- *s = '\\';
-
- for (n=0; argv[n]; ++n)
- ;
-
- aszArgs = _alloca((n+1)*sizeof(const char *));
-
- for (n = 0; szArg = argv[n]; ++n)
- if (strchr(szArg, ' ')) {
- int l = strlen(szArg);
-
- aszArgs[n] = _alloca(l+2+1);
- aszArgs[n][0] = '"';
- strcpy(&aszArgs[n][1], szArg);
- aszArgs[n][l+1] = '"';
- aszArgs[n][l+2] = '\0';
- }
- else {
- aszArgs[n] = (char *)szArg;
- }
-
- aszArgs[n] = NULL;
-
- return _spawnv(mode, szCmd, aszArgs);
-}
-
-#undef _spawnve
-API_EXPORT(int) os_spawnve(int mode, const char *cmdname, const char *const *argv, const char *const *envp)
-{
- int n;
- char **aszArgs;
- const char *szArg;
- char *szCmd;
- char *s;
-
- szCmd = _alloca(strlen(cmdname)+1);
- strcpy(szCmd, cmdname);
- for (s = szCmd; *s; ++s)
- if (*s == '/')
- *s = '\\';
-
- for (n = 0; argv[n] ; ++n)
- ;
-
- aszArgs = _alloca((n+1)*sizeof(const char *));
-
- for (n = 0; szArg=argv[n]; ++n)
- if (strchr(szArg, ' ')) {
- int l = strlen(szArg);
-
- aszArgs[n] = _alloca(l+2+1);
- aszArgs[n][0] = '"';
- strcpy(&aszArgs[n][1], szArg);
- aszArgs[n][l+1] = '"';
- aszArgs[n][l+2] = '\0';
- }
- else {
- aszArgs[n]=(char *)szArg;
- }
-
- aszArgs[n] = NULL;
-
- return _spawnve(mode, szCmd, aszArgs, envp);
-}
-
-API_EXPORT(int) os_spawnle(int mode, const char *cmdname,...)
-{
- int n;
- va_list vlist;
- char **aszArgs;
- const char *szArg;
- const char *const *aszEnv;
- char *szCmd;
- char *s;
-
- szCmd = _alloca(strlen(cmdname)+1);
- strcpy(szCmd, cmdname);
- for (s = szCmd; *s; ++s)
- if(*s == '/')
- *s = '\\';
-
- va_start(vlist, cmdname);
- for (n = 0; va_arg(vlist, const char *); ++n)
- ;
- va_end(vlist);
-
- aszArgs = _alloca((n+1)*sizeof(const char *));
-
- va_start(vlist, cmdname);
- for (n = 0 ; szArg = va_arg(vlist, const char *) ; ++n)
- if (strchr(szArg,' ')) {
- int l = strlen(szArg);
-
- aszArgs[n] = _alloca(l+2+1);
- aszArgs[n][0] = '"';
- strcpy(&aszArgs[n][1],szArg);
- aszArgs[n][l+1] = '"';
- aszArgs[n][l+2] = '\0';
- }
- else {
- aszArgs[n]=(char *)szArg;
- }
-
- aszArgs[n] = NULL;
-
- aszEnv = va_arg(vlist, const char *const *);
- va_end(vlist);
-
- return _spawnve(mode, szCmd, aszArgs, aszEnv);
-}
+#include <windows.h>
+#include <sys/stat.h>
+#include <stdarg.h>
+
+#include "httpd.h"
+#include "http_log.h"
+
+/* Returns TRUE if the path is real, FALSE if it is PATH_INFO */
+static BOOL sub_canonical_filename(char *szCanon, unsigned nCanon,
+ const char *szInFile)
+{
+ char buf[HUGE_STRING_LEN];
+ int n;
+ char *szFilePart;
+ char *s;
+ int nSlashes;
+ WIN32_FIND_DATA d;
+ HANDLE h;
+ const char *szFile;
+
+ szFile = szInFile;
+ s = strrchr(szFile, '\\');
+ for (nSlashes = 0; s > szFile && s[-1] == '\\'; ++nSlashes, --s)
+ ;
+
+ n = GetFullPathName(szFile, sizeof buf, buf, &szFilePart);
+ ap_assert(n);
+ ap_assert(n < sizeof buf);
+
+ /*
+ * There is an implicit assumption that szInFile will contain a '\'.
+ * If this is not true (as in the case of <Directory *> or
+ * <File .htaccess>) we would assert in some of the code below. Therefore,
+ * if we don't get any '\' in the file name, then use the file name we get
+ * from GetFullPathName, because it will have at least one '\'. If there
+ * is no '\' in szInFile, it must just be a file name, so it should be
+ * valid to use the name from GetFullPathName. Be sure to adjust the
+ * 's' variable so the rest of the code functions normally.
+ */
+ if (!s) {
+ szFile = buf;
+ s = strrchr(szFile, '\\');
+ }
+
+ /* If we have \\machine\share, convert to \\machine\share\ */
+ if (buf[0] == '\\' && buf[1] == '\\') {
+ char *s = strchr(buf + 2, '\\');
+ if (s && !strchr(s + 1, '\\')) {
+ strcat(s + 1, "\\");
+ }
+ }
+
+ if (!strchr(buf, '*') && !strchr(buf, '?')) {
+ h = FindFirstFile(buf, &d);
+ if (h != INVALID_HANDLE_VALUE) {
+ FindClose(h);
+ }
+ }
+ else {
+ h = INVALID_HANDLE_VALUE;
+ }
+
+ if (szFilePart < buf + 3) {
+ ap_assert(strlen(buf) < nCanon);
+ strcpy(szCanon, buf);
+ /* a \ at the start means it is UNC, otherwise it is x: */
+ if (szCanon[0] != '\\') {
+ ap_assert(ap_isalpha(szCanon[0]));
+ ap_assert(szCanon[1] == ':');
+ szCanon[2] = '/';
+ }
+ else {
+ char *s;
+
+ ap_assert(szCanon[1] == '\\');
+ for (s = szCanon; *s; ++s) {
+ if (*s == '\\') {
+ *s = '/';
+ }
+ }
+ }
+ return TRUE;
+ }
+ if (szFilePart != buf + 3) {
+ char b2[_MAX_PATH];
+ char b3[_MAX_PATH];
+ ap_assert(szFilePart > buf + 3);
+ /* avoid SEGVs on things like "Directory *" */
+ ap_assert(s >= szFile && "this is a known bug");
+
+ memcpy(b3, szFile, s - szFile);
+ b3[s - szFile] = '\0';
+
+/* szFilePart[-1] = '\0'; */
+ sub_canonical_filename(b2, sizeof b2, b3);
+
+ ap_assert(strlen(b2)+1 < nCanon);
+ strcpy(szCanon, b2);
+ strcat(szCanon, "/");
+ }
+ else {
+ ap_assert(strlen(buf) < nCanon);
+ strcpy(szCanon, buf);
+ szCanon[2] = '/';
+ szCanon[3] = '\0';
+ }
+ if (h == INVALID_HANDLE_VALUE) {
+ ap_assert(strlen(szCanon) + strlen(szFilePart) + nSlashes < nCanon);
+ for (n = 0; n < nSlashes; ++n) {
+ strcat(szCanon, "/");
+ }
+ strcat(szCanon, szFilePart);
+ return FALSE;
+ }
+ else {
+ ap_assert(strlen(szCanon)+strlen(d.cFileName) < nCanon);
+ strlwr(d.cFileName);
+ strcat(szCanon, d.cFileName);
+ return TRUE;
+ }
+}
+
+/* UNC requires backslashes, hence the conversion before canonicalisation.
+ * Not sure how * many backslashes (could be that
+ * \\machine\share\some/path/is/ok for example). For now, do them all.
+ */
+API_EXPORT(char *) ap_os_canonical_filename(pool *pPool, const char *szFile)
+{
+ char buf[HUGE_STRING_LEN];
+ char b2[HUGE_STRING_LEN];
+ const char *s;
+ char *d;
+ int nSlashes = 0;
+
+ ap_assert(strlen(szFile) < sizeof b2);
+
+ /* Eliminate directories consisting of three or more dots.
+ * These act like ".." but are not detected by other machinery.
+ * Also get rid of trailing .s on any path component, which are ignored
+ * by the filesystem. Simultaneously, rewrite / to \.
+ * This is a bit of a kludge - Ben.
+ */
+ if (strlen(szFile) == 1) {
+ /*
+ * If the file is only one char (like in the case of / or .) then
+ * just pass that through to sub_canonical_filename. Convert a
+ * '/' to '\\' if necessary.
+ */
+ if (szFile[0] == '/') {
+ b2[0] = '\\';
+ }
+ else {
+ b2[0] = szFile[0];
+ }
+
+ b2[1] = '\0';
+ }
+ else {
+ for (s = szFile, d = b2; (*d = *s); ++d, ++s) {
+ if (*s == '/') {
+ *d = '\\';
+ }
+ if (*s == '.' && (s[1] == '/' || s[1] == '\\' || !s[1])) {
+ while (*d == '.') {
+ --d;
+ }
+ if (*d == '\\') {
+ --d;
+ }
+ }
+ }
+
+ /* Finally, a trailing slash(es) screws thing, so blow them away */
+ for (nSlashes = 0; d > b2 && d[-1] == '\\'; --d, ++nSlashes)
+ ;
+ /* XXXX this breaks '/' and 'c:/' cases */
+ *d = '\0';
+ }
+ sub_canonical_filename(buf, sizeof buf, b2);
+
+ buf[0] = ap_tolower(buf[0]);
+
+ ap_assert(strlen(buf)+nSlashes < sizeof buf);
+ while (nSlashes--) {
+ strcat(buf, "/");
+ }
+
+ return ap_pstrdup(pPool, buf);
+}
+
+/* Win95 doesn't like trailing /s. NT and Unix don't mind. This works
+ * around the problem.
+ * Errr... except if it is UNC and we are referring to the root of
+ * the UNC, we MUST have a trailing \ and we can't use /s. Jeez.
+ * Not sure if this refers to all UNCs or just roots,
+ * but I'm going to fix it for all cases for now. (Ben)
+ */
+
+#undef stat
+API_EXPORT(int) os_stat(const char *szPath, struct stat *pStat)
+{
+ int n;
+
+ /* be sure it is has a drive letter or is a UNC path; everything
+ * _must_ be canonicalized before getting to this point.
+ */
+ if (szPath[1] != ':' && szPath[1] != '/') {
+ ap_log_error(APLOG_MARK, APLOG_ERR, NULL,
+ "Invalid path in os_stat: \"%s\", "
+ "should have a drive letter or be a UNC path",
+ szPath);
+ return (-1);
+ }
+
+ if (szPath[0] == '/') {
+ char buf[_MAX_PATH];
+ char *s;
+ int nSlashes = 0;
+
+ ap_assert(strlen(szPath) < _MAX_PATH);
+ strcpy(buf, szPath);
+ for (s = buf; *s; ++s) {
+ if (*s == '/') {
+ *s = '\\';
+ ++nSlashes;
+ }
+ }
+ /* then we need to add one more to get \\machine\share\ */
+ if (nSlashes == 3) {
+ *s++ = '\\';
+ }
+ *s = '\0';
+ return stat(buf, pStat);
+ }
+
+ n = strlen(szPath);
+ if (szPath[n - 1] == '\\' || szPath[n - 1] == '/') {
+ char buf[_MAX_PATH];
+
+ ap_assert(n < _MAX_PATH);
+ strcpy(buf, szPath);
+ buf[n - 1] = '\0';
+
+ return stat(buf, pStat);
+ }
+ return stat(szPath, pStat);
+}
+
+/* Fix two really crap problems with Win32 spawn[lv]e*:
+ *
+ * 1. Win32 doesn't deal with spaces in argv.
+ * 2. Win95 doesn't like / in cmdname.
+ */
+
+#undef _spawnv
+API_EXPORT(int) os_spawnv(int mode, const char *cmdname,
+ const char *const *argv)
+{
+ int n;
+ char **aszArgs;
+ const char *szArg;
+ char *szCmd;
+ char *s;
+
+ szCmd = _alloca(strlen(cmdname)+1);
+ strcpy(szCmd, cmdname);
+ for (s = szCmd; *s; ++s) {
+ if (*s == '/') {
+ *s = '\\';
+ }
+ }
+
+ for (n = 0; argv[n]; ++n)
+ ;
+
+ aszArgs = _alloca((n + 1) * sizeof(const char *));
+
+ for (n = 0; szArg = argv[n]; ++n) {
+ if (strchr(szArg, ' ')) {
+ int l = strlen(szArg);
+
+ aszArgs[n] = _alloca(l + 2 + 1);
+ aszArgs[n][0] = '"';
+ strcpy(&aszArgs[n][1], szArg);
+ aszArgs[n][l + 1] = '"';
+ aszArgs[n][l + 2] = '\0';
+ }
+ else {
+ aszArgs[n] = (char *)szArg;
+ }
+ }
+
+ aszArgs[n] = NULL;
+
+ return _spawnv(mode, szCmd, aszArgs);
+}
+
+#undef _spawnve
+API_EXPORT(int) os_spawnve(int mode, const char *cmdname,
+ const char *const *argv, const char *const *envp)
+{
+ int n;
+ char **aszArgs;
+ const char *szArg;
+ char *szCmd;
+ char *s;
+
+ szCmd = _alloca(strlen(cmdname)+1);
+ strcpy(szCmd, cmdname);
+ for (s = szCmd; *s; ++s) {
+ if (*s == '/') {
+ *s = '\\';
+ }
+ }
+
+ for (n = 0; argv[n]; ++n)
+ ;
+
+ aszArgs = _alloca((n + 1)*sizeof(const char *));
+
+ for (n = 0; szArg = argv[n]; ++n){
+ if (strchr(szArg, ' ')) {
+ int l = strlen(szArg);
+
+ aszArgs[n] = _alloca(l + 2 + 1);
+ aszArgs[n][0] = '"';
+ strcpy(&aszArgs[n][1], szArg);
+ aszArgs[n][l + 1] = '"';
+ aszArgs[n][l + 2] = '\0';
+ }
+ else {
+ aszArgs[n] = (char *)szArg;
+ }
+ }
+
+ aszArgs[n] = NULL;
+
+ return _spawnve(mode, szCmd, aszArgs, envp);
+}
+
+API_EXPORT(int) os_spawnle(int mode, const char *cmdname, ...)
+{
+ int n;
+ va_list vlist;
+ char **aszArgs;
+ const char *szArg;
+ const char *const *aszEnv;
+ char *szCmd;
+ char *s;
+
+ szCmd = _alloca(strlen(cmdname)+1);
+ strcpy(szCmd, cmdname);
+ for (s = szCmd; *s; ++s) {
+ if (*s == '/') {
+ *s = '\\';
+ }
+ }
+
+ va_start(vlist, cmdname);
+ for (n = 0; va_arg(vlist, const char *); ++n)
+ ;
+ va_end(vlist);
+
+ aszArgs = _alloca((n + 1) * sizeof(const char *));
+
+ va_start(vlist, cmdname);
+ for (n = 0; szArg = va_arg(vlist, const char *); ++n) {
+ if (strchr(szArg, ' ')) {
+ int l = strlen(szArg);
+
+ aszArgs[n] = _alloca(l + 2 + 1);
+ aszArgs[n][0] = '"';
+ strcpy(&aszArgs[n][1], szArg);
+ aszArgs[n][l + 1] = '"';
+ aszArgs[n][l + 2] = '\0';
+ }
+ else {
+ aszArgs[n] = (char *)szArg;
+ }
+ }
+
+ aszArgs[n] = NULL;
+
+ aszEnv = va_arg(vlist, const char *const *);
+ va_end(vlist);
+
+ return _spawnve(mode, szCmd, aszArgs, aszEnv);
+}