*) Allow 'make depend' to work with non-GCC compilers.
[Justin Erenkrantz]
- *) Rename CacheMaxStreamingBuffer to MCacheMaxStreamingBuffer. Move
- implementation of MCacheMaxStreamingBuffer from mod_cache to
- mod_mem_cache. MCacheMaxStreamingBuffer now defaults to the
- lesser of 100,000 bytes or MCacheMaxCacheObjectSize. This should
- eliminate the need for explicitly coding MCacheMaxStreamingBuffer
- in most configurations. [Bill Stoddard]
-
*) mod_cache: Fix PR 15113, a core dump in cache_in_filter when
a redirect occurs. The code was passing a format string and
integer to apr_pstrcat. Changed to apr_psprintf.
Changes with Apache 2.0.45
+ *) mod_autoindex: Bring forward the IndexOptions IgnoreCase option
+ from Apache 1.3. PR 14276
+ [David Shane Holden <dpejesh@yahoo.com>, William Rowe]
+
*) mod_mime: Workaround to prevent a segfault if r->filename=NULL
[Brian Pane]
Changes with Apache 2.0.44
+ *) Rename CacheMaxStreamingBuffer to MCacheMaxStreamingBuffer. Move
+ implementation of MCacheMaxStreamingBuffer from mod_cache to
+ mod_mem_cache. MCacheMaxStreamingBuffer now defaults to the
+ lesser of 100,000 bytes or MCacheMaxCacheObjectSize. This should
+ eliminate the need for explicitly coding MCacheMaxStreamingBuffer
+ in most configurations. [Bill Stoddard]
+
*) Replace APU_HAS_LDAPSSL_CLIENT_INIT with APU_HAS_LDAP_NETSCAPE_SSL
as set by apr-util in util_ldap.c. This should allow mod_ldap
to work with the Netscape/Mozilla LDAP library. [Øyvin Sømme
* Handling configuration directives...
*/
-#define NO_OPTIONS 0x0001 /* Indexing options */
-#define ICONS_ARE_LINKS 0x0002
-#define SCAN_HTML_TITLES 0x0004
-#define SUPPRESS_ICON 0x0008
-#define SUPPRESS_LAST_MOD 0x0010
-#define SUPPRESS_SIZE 0x0020
-#define SUPPRESS_DESC 0x0040
-#define SUPPRESS_PREAMBLE 0x0080
-#define SUPPRESS_COLSORT 0x0100
-#define SUPPRESS_RULES 0x0200
-#define FOLDERS_FIRST 0x0400
-#define VERSION_SORT 0x0800
-#define TRACK_MODIFIED 0x1000
-#define FANCY_INDEXING 0x2000
-#define TABLE_INDEXING 0x4000
-#define IGNORE_CLIENT 0x8000
+#define NO_OPTIONS (1 << 0) /* Indexing options */
+#define ICONS_ARE_LINKS (1 << 1)
+#define SCAN_HTML_TITLES (1 << 2)
+#define SUPPRESS_ICON (1 << 3)
+#define SUPPRESS_LAST_MOD (1 << 4)
+#define SUPPRESS_SIZE (1 << 5)
+#define SUPPRESS_DESC (1 << 6)
+#define SUPPRESS_PREAMBLE (1 << 7)
+#define SUPPRESS_COLSORT (1 << 8)
+#define SUPPRESS_RULES (1 << 9)
+#define FOLDERS_FIRST (1 << 10)
+#define VERSION_SORT (1 << 11)
+#define TRACK_MODIFIED (1 << 12)
+#define FANCY_INDEXING (1 << 13)
+#define TABLE_INDEXING (1 << 14)
+#define IGNORE_CLIENT (1 << 15)
+#define IGNORE_CASE (1 << 16)
#define K_NOADJUST 0
#define K_ADJUST 1
else if (!strcasecmp(w, "IconsAreLinks")) {
option = ICONS_ARE_LINKS;
}
+ else if (!strcasecmp(w, "IgnoreCase")) {
+ option = IGNORE_CASE;
+ }
else if (!strcasecmp(w, "IgnoreClient")) {
option = IGNORE_CLIENT;
}
apr_off_t size;
apr_time_t lm;
struct ent *next;
- int ascending, version_sort;
+ int ascending, ignore_case, version_sort;
char key;
int isdir;
};
p->key = apr_toupper(keyid);
p->ascending = (apr_toupper(direction) == D_ASCENDING);
p->version_sort = !!(autoindex_opts & VERSION_SORT);
+ p->ignore_case = !!(autoindex_opts & IGNORE_CASE);
if (autoindex_opts & (FANCY_INDEXING | TABLE_INDEXING)) {
p->lm = rr->finfo.mtime;
}
break;
}
+
+ /* names may identical when treated case-insensitively,
+ * so always fall back on strcmp() flavors to put entries
+ * in deterministic order. This means that 'ABC' and 'abc'
+ * will always appear in the same order, rather than
+ * variably between 'ABC abc' and 'abc ABC' order.
+ */
+
if (c1->version_sort) {
- return apr_strnatcmp(c1->name, c2->name);
+ if (c1->ignore_case) {
+ result = apr_strnatcasecmp (c1->name, c2->name);
+ }
+ if (!result) {
+ result = apr_strnatcmp(c1->name, c2->name);
+ }
}
- else {
- return strcmp(c1->name, c2->name);
+
+ /* The names may be identical in respects other other than
+ * filename case when strnatcmp is used above, so fall back
+ * to strcmp on conflicts so that fn1.01.zzz and fn1.1.zzz
+ * are also sorted in a deterministic order.
+ */
+
+ if (!result && c1->ignore_case) {
+ result = strcasecmp (c1->name, c2->name);
}
+
+ if (!result) {
+ result = strcmp (c1->name, c2->name);
+ }
+
+ return result;
}