]> granicus.if.org Git - apache/commitdiff
Bring forward the IndexOptions IgnoreCase option to mod_autoindex
authorWilliam A. Rowe Jr <wrowe@apache.org>
Mon, 6 Jan 2003 15:20:32 +0000 (15:20 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Mon, 6 Jan 2003 15:20:32 +0000 (15:20 +0000)
  from Apache 1.3 for both 2.0 and 2.1 (since the patch/feature was
  previously accepted for 1.3, I'm committing without the usual vote
  specific to 2.0.)  Only small modification of David's patch to avoid
  future reformatting of the options list and better handle the strnatcmp
  side effects.

PR: 14276
Obtained from:
Submitted by: David Shane Holden <dpejesh@yahoo.com>
Reviewed by:

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@98181 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/generators/mod_autoindex.c

diff --git a/CHANGES b/CHANGES
index edba4093d16417fc5dd5958119273265e080a85e..f65b3b12721b645f9efa60971515688780874fd9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -18,13 +18,6 @@ Changes with Apache 2.1.0-dev
   *) 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.
@@ -65,6 +58,10 @@ Changes with Apache 2.1.0-dev
 
 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]
 
@@ -80,6 +77,13 @@ Changes with Apache 2.0.45
 
 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
index defc0c05fe47d81ce0781c12d0cca89a6391067a..fc5d86560681d4ae6639069effbc6a28b2d84a11 100644 (file)
@@ -94,22 +94,23 @@ module AP_MODULE_DECLARE_DATA autoindex_module;
  * 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
@@ -374,6 +375,9 @@ static const char *add_opts(cmd_parms *cmd, void *d, const char *optstr)
         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;
         }
@@ -724,7 +728,7 @@ struct ent {
     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;
 };
@@ -1345,6 +1349,7 @@ static struct ent *make_autoindex_entry(const apr_finfo_t *dirent,
     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;
@@ -1897,12 +1902,38 @@ static int dsortf(struct ent **e1, struct ent **e2)
         }
         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;
 }