iliaa Mon Jan 27 20:48:57 2003 EDT Modified files: /php4/ext/standard dir.c php_dir.h basic_functions.c Log: Added scandir() function, which allows quick retrieval of all files & directories within the specified path and sort the output in alphabetical or reverse alphabetical order. Index: php4/ext/standard/dir.c diff -u php4/ext/standard/dir.c:1.114 php4/ext/standard/dir.c:1.115 --- php4/ext/standard/dir.c:1.114 Mon Jan 27 11:29:47 2003 +++ php4/ext/standard/dir.c Mon Jan 27 20:48:57 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dir.c,v 1.114 2003/01/27 16:29:47 edink Exp $ */ +/* $Id: dir.c,v 1.115 2003/01/28 01:48:57 iliaa Exp $ */ /* {{{ includes/startup/misc */ @@ -39,6 +39,10 @@ #include "win32/readdir.h" #endif +#if !HAVE_ALPHASORT || !HAVE_SCANDIR +#include "php_scandir.h" +#endif + #ifdef HAVE_GLOB #ifndef PHP_WIN32 #include <glob.h> @@ -421,6 +425,77 @@ } /* }}} */ #endif + +/* {{{ php_alphasortr +*/ +static int php_alphasortr(const struct dirent **a, const struct dirent **b) +{ + return strcoll((*b)->d_name, (*a)->d_name); +} +/* }}} */ + +/* {{{ proto array scandir(string dir [, int sorting_order]) + List files & directories inside the specified path */ +PHP_FUNCTION(scandir) +{ + char *dirn; + int dirn_len; + int flags = 0; + char *path; + struct dirent **namelist; + int n, i; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &dirn, &dirn_len, +&flags) == FAILURE) { + return; + } + +#ifdef ZTS + if(!IS_ABSOLUTE_PATH(dirn, dirn_len)) { + path = expand_filepath(dirn, NULL TSRMLS_CC); + } else +#endif + path = dirn; + + if (PG(safe_mode) && (!php_checkuid(path, NULL, CHECKUID_CHECK_FILE_AND_DIR))) +{ + RETVAL_FALSE; + goto err; + } + if(php_check_open_basedir(path TSRMLS_CC)) { + RETVAL_FALSE; + goto err; + } + + if (!flags) { + n = scandir(path, &namelist, 0, alphasort); + } else { + n = scandir(path, &namelist, 0, php_alphasortr); + } + + if (n < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "(errno %d): %s", errno, +strerror(errno)); + RETVAL_FALSE; + goto err; + } + + array_init(return_value); + + for (i = 0; i < n; i++) { + add_next_index_string(return_value, namelist[i]->d_name, 1); + free(namelist[i]); + } + + if (n) { + free(namelist); + } + +err: + if (path && path != dirn) { + efree(path); + } + + return; +} +/* }}} */ /* * Local variables: Index: php4/ext/standard/php_dir.h diff -u php4/ext/standard/php_dir.h:1.20 php4/ext/standard/php_dir.h:1.21 --- php4/ext/standard/php_dir.h:1.20 Tue Dec 31 11:07:50 2002 +++ php4/ext/standard/php_dir.h Mon Jan 27 20:48:57 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dir.h,v 1.20 2002/12/31 16:07:50 sebastian Exp $ */ +/* $Id: php_dir.h,v 1.21 2003/01/28 01:48:57 iliaa Exp $ */ #ifndef PHP_DIR_H #define PHP_DIR_H @@ -35,5 +35,6 @@ PHP_NAMED_FUNCTION(php_if_readdir); PHP_FUNCTION(getdir); PHP_FUNCTION(glob); +PHP_FUNCTION(scandir); #endif /* PHP_DIR_H */ Index: php4/ext/standard/basic_functions.c diff -u php4/ext/standard/basic_functions.c:1.565 php4/ext/standard/basic_functions.c:1.566 --- php4/ext/standard/basic_functions.c:1.565 Tue Jan 21 09:53:16 2003 +++ php4/ext/standard/basic_functions.c Mon Jan 27 20:48:57 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.565 2003/01/21 14:53:16 iliaa Exp $ */ +/* $Id: basic_functions.c,v 1.566 2003/01/28 01:48:57 iliaa Exp $ */ #include "php.h" #include "php_streams.h" @@ -724,6 +724,7 @@ PHP_FE(rewinddir, NULL) PHP_STATIC_FE("readdir", php_if_readdir, NULL) PHP_FALIAS(dir, getdir, NULL) + PHP_FE(scandir, + NULL) #ifdef HAVE_GLOB PHP_FE(glob, NULL) #endif
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php