Index: include/http_log.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/http_log.h,v
retrieving revision 1.35
diff -u -r1.35 http_log.h
--- include/http_log.h	22 Apr 2002 03:25:40 -0000	1.35
+++ include/http_log.h	9 Aug 2002 16:32:53 -0000
@@ -107,7 +107,7 @@
 /* Use APLOG_TOCLIENT to cause ap_log_rerror() to send the message
  * to the client in addition to recording it to the error log.
  */
-#define APLOG_TOCLIENT          (APLOG_LEVELMASK + 2)
+#define APLOG_TOCLIENT          ((APLOG_LEVELMASK + 1) * 2)
 
 /* normal but significant condition on startup, usually printed to stderr */
 #define APLOG_STARTUP           ((APLOG_LEVELMASK + 1) * 4) 
Index: modules/generators/mod_cgi.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgi.c,v
retrieving revision 1.134
diff -u -r1.134 mod_cgi.c
--- modules/generators/mod_cgi.c	22 Apr 2002 08:08:37 -0000	1.134
+++ modules/generators/mod_cgi.c	9 Aug 2002 16:32:56 -0000
@@ -477,8 +477,9 @@
     
         if (rc != APR_SUCCESS) {
             /* Bad things happened. Everyone should have cleaned up. */
-            ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r,
-                        "couldn't create child process: %d: %s", rc, r->filename);
+            ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rc, r,
+                        "couldn't create child process: %d: %s", rc, 
+                        apr_filename_of_pathname(r->filename));
         }
         else {
             apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT);
Index: modules/generators/mod_cgid.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgid.c,v
retrieving revision 1.128
diff -u -r1.128 mod_cgid.c
--- modules/generators/mod_cgid.c	22 Apr 2002 08:08:38 -0000	1.128
+++ modules/generators/mod_cgid.c	9 Aug 2002 16:32:59 -0000
@@ -644,8 +644,9 @@
 
             if (rc != APR_SUCCESS) {
                 /* Bad things happened. Everyone should have cleaned up. */
-                ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r,
-                        "couldn't create child process: %d: %s", rc, r->filename);
+                ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rc, r,
+                              "couldn't create child process: %d: %s", rc, 
+                              apr_filename_of_pathname(r->filename));
             }
         }
     } 
Index: modules/mappers/mod_negotiation.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/mappers/mod_negotiation.c,v
retrieving revision 1.101
diff -u -r1.101 mod_negotiation.c
--- modules/mappers/mod_negotiation.c	29 Mar 2002 08:17:23 -0000	1.101
+++ modules/mappers/mod_negotiation.c	9 Aug 2002 16:33:05 -0000
@@ -984,7 +984,7 @@
                      break;
                 }
                 mime_info.bytes = len;
-                mime_info.file_name = rr->filename;
+                mime_info.file_name = apr_filename_of_pathname(rr->filename);
             }
         }
         else {
@@ -1048,15 +1048,15 @@
 
     clean_var_rec(&mime_info);
 
-    if (!(filp = strrchr(r->filename, '/'))) {
-        return DECLINED;        /* Weird... */
+    if (r->proxyreq || !r->filename 
+                    || !ap_os_is_path_absolute(neg->pool, r->filename)) {
+        return DECLINED;
     }
 
-    /* XXX this should be more general, and quit using 'specials' */
-    if (strncmp(r->filename, "proxy:", 6) == 0) {
+    /* Only absolute paths here */
+    if (!(filp = strrchr(r->filename, '/'))) {
         return DECLINED;
     }
-
     ++filp;
     prefix_len = strlen(filp);
 
@@ -2685,8 +2685,15 @@
              * non-neighboring variant.  We can have a non-neighboring
              * variant when processing a type map.  
              */
-            if (ap_strchr_c(variant->file_name, '/'))
+            if (ap_strchr(variant->file_name, '/'))
+                neg->is_transparent = 0;
+
+            /* We can't be transparent, because of the behavior
+             * of variant typemap bodies.  
+             */
+            if (variant->body) {
                 neg->is_transparent = 0;
+            }
         }
     }
 
@@ -2818,9 +2825,6 @@
         apr_bucket *e;
 
         ap_allow_standard_methods(r, REPLACE_ALLOW, M_GET, M_OPTIONS, M_POST, -1);
-        if ((res = ap_discard_request_body(r)) != OK) {
-            return res;
-        }
         /*if (r->method_number == M_OPTIONS) {
          *    return ap_send_http_options(r);
          *}
@@ -2841,6 +2845,9 @@
             return res;
         }
 
+        if ((res = ap_discard_request_body(r)) != OK) {
+            return res;
+        }
         bb = apr_brigade_create(r->pool, c->bucket_alloc);
         e = apr_bucket_file_create(map, best->body, 
                                    (apr_size_t)best->bytes, r->pool,
Index: server/util.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/util.c,v
retrieving revision 1.127
diff -u -r1.127 util.c
--- server/util.c	29 Apr 2002 07:20:46 -0000	1.127
+++ server/util.c	9 Aug 2002 16:33:10 -0000
@@ -115,6 +115,16 @@
  */
 #define TEST_CHAR(c, f)	(test_char_table[(unsigned)(c)] & (f))
 
+/* Win32/NetWare/OS2 need to check for both forward and back slashes
+ * in ap_getparents() and ap_escape_url.
+ */
+#ifdef CASE_BLIND_FILESYSTEM
+#define IS_SLASH(s) ((s == '/') || (s == '\\'))
+#else
+#define IS_SLASH(s) (s == '/')
+#endif
+
+
 /*
  * Examine a field value (such as a media-/content-type) string and return
  * it sans any parameters; e.g., strip off any ';charset=foo' and the like.
@@ -485,7 +495,7 @@
     }
     l = w = first_dot = next - name;
     while (name[l] != '\0') {
-	if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l - 1] == '/'))
+	if (name[l] == '.' && IS_SLASH(name[l + 1]) && (l == 0 || IS_SLASH(name[l - 1])))
 	    l += 2;
 	else
 	    name[w++] = name[l++];
@@ -494,7 +504,7 @@
     /* b) remove trailing . path, segment */
     if (w == 1 && name[0] == '.')
 	w--;
-    else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/')
+    else if (w > 1 && name[w - 1] == '.' && IS_SLASH(name[w - 2]))
 	w--;
     name[w] = '\0';
 
@@ -502,13 +512,13 @@
     l = first_dot;
 
     while (name[l] != '\0') {
-	if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' &&
-	    (l == 0 || name[l - 1] == '/')) {
+	if (name[l] == '.' && name[l + 1] == '.' && IS_SLASH(name[l + 2]) &&
+	    (l == 0 || IS_SLASH(name[l - 1]))) {
 	    register int m = l + 3, n;
 
 	    l = l - 2;
 	    if (l >= 0) {
-		while (l >= 0 && name[l] != '/')
+		while (l >= 0 && !IS_SLASH(name[l]))
 		    l--;
 		l++;
 	    }
@@ -525,10 +535,10 @@
     /* d) remove trailing xx/.. segment. */
     if (l == 2 && name[0] == '.' && name[1] == '.')
 	name[0] = '\0';
-    else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') {
+    else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && IS_SLASH(name[l - 3])) {
 	l = l - 4;
 	if (l >= 0) {
-	    while (l >= 0 && name[l] != '/')
+	    while (l >= 0 && !IS_SLASH(name[l]))
 		l--;
 	    l++;
 	}
@@ -1547,7 +1557,7 @@
 	    else {
 		*x = x2c(y + 1);
 		y += 2;
-		if (*x == '/' || *x == '\0')
+		if (IS_SLASH(*x) || *x == '\0')
 		    badpath = 1;
 	    }
 	}

