From: Greg Beaver Date: Sun, 1 Jan 2006 20:16:09 +0000 (+0000) Subject: add sorting to opendir() so that it matches PHP_Archive exactly X-Git-Tag: RELEASE_1_0_4~167 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=edb6e4c9d5dc9998ad82b025748534e5a7d2d1d0;p=php add sorting to opendir() so that it matches PHP_Archive exactly --- diff --git a/ext/phar/EXPERIMENTAL b/ext/phar/EXPERIMENTAL index 2ac36c743d..093f87d3e1 100644 --- a/ext/phar/EXPERIMENTAL +++ b/ext/phar/EXPERIMENTAL @@ -1,6 +1,8 @@ TODO: -- implement openSSL signing of phars -- implement strnatcasecmp sorting of opendir directory listings like PHP_Archive + +bugs: +no known bugs features: -- stream context option for cleaning crap paths like phar://blah.phar/file//to\\here.php \ No newline at end of file +- stream context option for cleaning crap paths like phar://blah.phar/file//to\\here.php +- implement openSSL signing of phars diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 8bb63a0379..1f7229dc87 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -29,7 +29,9 @@ #include "ext/standard/url.h" #include "ext/standard/crc32.h" #include "zend_execute.h" +#include "zend_qsort.h" #include "zend_constants.h" +#include "zend_operators.h" #include "php_phar.h" #include "main/php_streams.h" #ifndef TRUE @@ -991,6 +993,33 @@ static int phar_add_empty(HashTable *ht, char *arKey, uint nKeyLength) return zend_hash_update(ht, arKey, nKeyLength, &dummy, sizeof(void *), NULL); } +static int compare_dir_name(const void *a, const void *b TSRMLS_DC) +{ + Bucket *f; + Bucket *s; + int result; + + f = *((Bucket **) a); + s = *((Bucket **) b); + + result = zend_binary_strcmp(f->arKey, f->nKeyLength - 1, + s->arKey, s->nKeyLength - 1); + + if (result == 0) { + return 0; + } + + if (result < 0) { + return -1; + } else if (result > 0) { + return 1; + } else { + return 0; + } + + return 0; +} + static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) { HashTable *data; @@ -1063,6 +1092,10 @@ PHAR_ADD_ENTRY: } if (HASH_KEY_NON_EXISTANT != zend_hash_has_more_elements(data)) { efree(dir); + if (zend_hash_sort(data, zend_qsort, compare_dir_name, 0 TSRMLS_CC) == FAILURE) { + FREE_HASHTABLE(data); + return NULL; + } return php_stream_alloc(&phar_dir_ops, data, NULL, "r"); } else { efree(dir);