diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2003-01-27 20:39:31 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2003-01-27 20:39:31 +0000 |
commit | d59d500af7204cf419d91553dccfc2ff0069ca65 (patch) | |
tree | 4a7db0482e34008067657447c3e5c1cc19e34215 | |
parent | e4ec7372e951f11c1d5696605858e404434782a9 (diff) | |
download | php-git-d59d500af7204cf419d91553dccfc2ff0069ca65.tar.gz |
Moved the scandir code into it's own files so that it can be used by other
OSes where libc does not have a native scandir() implementation.
-rw-r--r-- | configure.in | 4 | ||||
-rw-r--r-- | main/php_ini.c | 8 | ||||
-rw-r--r-- | main/php_scandir.c | 112 | ||||
-rw-r--r-- | main/php_scandir.h | 18 | ||||
-rw-r--r-- | win32/readdir.c | 80 | ||||
-rw-r--r-- | win32/readdir.h | 5 |
6 files changed, 136 insertions, 91 deletions
diff --git a/configure.in b/configure.in index 5596c4c1e8..2532ededfe 100644 --- a/configure.in +++ b/configure.in @@ -445,6 +445,7 @@ dnl ------------------------------------------------------------------------- AC_FUNC_VPRINTF AC_CHECK_FUNCS( +alphasort \ asctime_r \ chroot \ ctime_r \ @@ -480,6 +481,7 @@ random \ rand_r \ regcomp \ res_search \ +scandir \ setitimer \ setlocale \ localeconv \ @@ -1093,7 +1095,7 @@ PHP_SUBST(install_targets) PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c) PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \ - safe_mode.c fopen_wrappers.c alloca.c \ + safe_mode.c fopen_wrappers.c alloca.c php_scandir.c \ php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c \ streams.c network.c php_open_temporary_file.c php_logos.c \ diff --git a/main/php_ini.c b/main/php_ini.c index ed9ac9cb98..97038fbbcd 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -31,12 +31,10 @@ #include "SAPI.h" #include "php_main.h" -#ifdef PHP_WIN32 -#include "readdir.h" -/* this makes no sence, vc6 errors if this declaration is not here */ -extern int alphasort(const struct dirent **a, const struct dirent **b); +#if !HAVE_SCANDIR || !HAVE_ALPHASORT + #include "php_scandir.h" #else -#include "dirent.h" + #include <dirent.h> #endif #ifndef S_ISREG diff --git a/main/php_scandir.c b/main/php_scandir.c new file mode 100644 index 0000000000..8974a69889 --- /dev/null +++ b/main/php_scandir.c @@ -0,0 +1,112 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2003 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Shane Caraveo <shane@caraveo.com> | + | Ilia Alshanetsky <ilia@prohost.org> | + +----------------------------------------------------------------------+ + */ + +#include "php_scandir.h" +#include "php_config.h" + +#ifndef HAVE_SCANDIR + #include <sys/types.h> + + #ifdef HAVE_DIRENT_H + #include <dirent.h> + #endif + + #ifdef PHP_WIN32 + #include "win32/readdir.h" + #endif + + #include <stdlib.h> + #include <search.h> +#endif + +#ifndef HAVE_ALPHASORT +int alphasort(const struct dirent **a, const struct dirent **b) +{ + return strcoll((*a)->d_name,(*b)->d_name); +} +#endif + +#ifndef HAVE_SCANDIR +int scandir(const char *dirname, struct dirent **namelist[], int (*selector) (const struct dirent *entry), int (*compare) (const struct dirent **a, const struct dirent **b)) +{ + DIR *dirp = NULL; + struct dirent **vector = NULL; + struct dirent *dp = NULL; + int vector_size = 0; + int nfiles = 0; + + if (namelist == NULL) { + return -1; + } + + if (!(dirp = opendir(dirname))) { + return -1; + } + + while ((dp = readdir(dirp)) != NULL) { + int dsize = 0; + struct dirent *newdp = NULL; + + if (selector && (*selector)(dp) == 0) { + continue; + } + + if (nfiles == vector_size) { + struct dirent **newv; + if (vector_size == 0) { + vector_size = 10; + } else { + vector_size *= 2; + } + + newv = (struct dirent **) realloc (vector, vector_size * sizeof (struct dirent *)); + if (!newv) { + return -1; + } + vector = newv; + } + + dsize = sizeof (struct dirent) + ((strlen(dp->d_name) + 1) * sizeof(char)); + newdp = (struct dirent *) malloc(dsize); + + if (newdp == NULL) { + goto fail; + } + + vector[nfiles++] = (struct dirent *) memcpy(newdp, dp, dsize); + } + + closedir(dirp); + + *namelist = vector; + + if (compare) { + qsort (*namelist, nfiles, sizeof(struct dirent *), compare); + } + + return nfiles; + +fail: + while (nfiles-- > 0) { + free(vector[nfiles]); + } + free(vector); + return -1; +} +#endif diff --git a/main/php_scandir.h b/main/php_scandir.h new file mode 100644 index 0000000000..a658ad02a9 --- /dev/null +++ b/main/php_scandir.h @@ -0,0 +1,18 @@ +#include <sys/types.h> +#include "php_config.h" + +#ifdef HAVE_DIRENT_H +# include <dirent.h> +#endif + +#ifdef PHP_WIN32 +#include "win32/readdir.h" +#endif + +#ifndef HAVE_ALPHASORT +int alphasort(const struct dirent **a, const struct dirent **b); +#endif + +#ifndef HAVE_SCANDIR +int scandir(const char *dirname, struct dirent **namelist[], int (*selector) (const struct dirent *entry), int (*compare) (const struct dirent **a, const struct dirent **b)); +#endif diff --git a/win32/readdir.c b/win32/readdir.c index 78db689b29..e33d19bde5 100644 --- a/win32/readdir.c +++ b/win32/readdir.c @@ -141,83 +141,3 @@ int rewinddir(DIR *dp) return 0; } - -int alphasort(const struct dirent **a, const struct dirent **b) -{ - return strcoll((*a)->d_name,(*b)->d_name); -} - -int scandir(const char *dirname, - struct dirent **namelist[], - int (*selector) (const struct dirent *entry), - int (*compare) (const struct dirent **a, const struct dirent **b)) -{ - DIR *dirp = NULL; - struct dirent **vector = NULL; - struct dirent *dp = NULL; - int vector_size = 0; - - int nfiles = 0; - int fail = 0; - - if (namelist == NULL) - return -1; - - dirp = opendir(dirname); - if (dirp == NULL) - return -1; - - for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) - { - int dsize = 0; - struct dirent *newdp = NULL; - - if (selector && (*selector)(dp) == 0) - continue; - - if (nfiles == vector_size) - { - struct dirent **newv; - if (vector_size == 0) - vector_size = 10; - else - vector_size *= 2; - - newv = (struct dirent **) realloc (vector, vector_size * sizeof (struct dirent *)); - if (newv == NULL) - { - fail = 1; - break; - } - vector = newv; - } - - dsize = sizeof (struct dirent) + ((strlen(dp->d_name) + 1) * sizeof(char)); - newdp = (struct dirent *) malloc(dsize); - - if (newdp == NULL) - { - fail = 1; - break; - } - - vector[nfiles++] = (struct dirent *) memcpy(newdp, dp, dsize); - } - - closedir(dirp); - - if (fail) - { - while (nfiles-- > 0) free(vector[nfiles]); - free(vector); - return -1; - } - - - *namelist = vector; - - if (compare) - qsort (*namelist,nfiles,sizeof (struct dirent *),compare); - - return nfiles; -} diff --git a/win32/readdir.h b/win32/readdir.h index b63015355a..419dc95c24 100644 --- a/win32/readdir.h +++ b/win32/readdir.h @@ -39,10 +39,5 @@ struct dirent *readdir(DIR *); int readdir_r(DIR *, struct dirent *, struct dirent **); int closedir(DIR *); int rewinddir(DIR *); -int scandir(const char *dirname, - struct dirent **namelist[], - int (*selector) (const struct dirent *entry), - int (*compare) (const struct dirent **a, const struct dirent **b)); -int alphasort(const struct dirent **a, const struct dirent **b); #endif /* READDIR_H */ |