diff options
author | Joe Orton <jorton@apache.org> | 2019-06-25 14:21:56 +0000 |
---|---|---|
committer | Joe Orton <jorton@apache.org> | 2019-06-25 14:21:56 +0000 |
commit | 864ce9d1b1784c31386a7a5ff568e78f56a0a75f (patch) | |
tree | 75ac7cea477231ea31a07f15b37a47a6cd5e010b /file_io | |
parent | e0f71494adc916c15fca5038ac1e45b77113168c (diff) | |
download | apr-864ce9d1b1784c31386a7a5ff568e78f56a0a75f.tar.gz |
Add apr_dir_pread(), a variant of apr_dir_read() which allows callers
to read a directory with constant memory consumption:
* include/apr_file_info.h: Add warning on memory consumption for
apr_dir_read; declare apr_dir_pread.
* file_io/unix/dir.c (apr_dir_pread): Rename from apr_dir_read and
take pool argument. (apr_dir_read): Reimplement using it.
* file_io/win32/dir.c, file_io/os2/dir.c: Likewise, but untested.
* test/testdir.c (test_pread) [APR_POOL_DEBUG]: Add test case.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1862071 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io')
-rw-r--r-- | file_io/os2/dir.c | 12 | ||||
-rw-r--r-- | file_io/unix/dir.c | 12 | ||||
-rw-r--r-- | file_io/win32/dir.c | 8 |
3 files changed, 24 insertions, 8 deletions
diff --git a/file_io/os2/dir.c b/file_io/os2/dir.c index f1554b6f3..d1a0072cc 100644 --- a/file_io/os2/dir.c +++ b/file_io/os2/dir.c @@ -79,24 +79,28 @@ APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *thedir) return APR_FROM_OS_ERROR(rv); } - - APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_dir_t *thedir) { + return apr_dir_pread(finfo, wanted, thedir, thedir->pool); +} + +APR_DECLARE(apr_status_t) apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir, apr_pool_t *pool) +{ int rv; ULONG entries = 1; if (thedir->handle == 0) { thedir->handle = HDIR_CREATE; - rv = DosFindFirst(apr_pstrcat(thedir->pool, thedir->dirname, "/*", NULL), &thedir->handle, + rv = DosFindFirst(apr_pstrcat(pool, thedir->dirname, "/*", NULL), &thedir->handle, FILE_ARCHIVED|FILE_DIRECTORY|FILE_SYSTEM|FILE_HIDDEN|FILE_READONLY, &thedir->entry, sizeof(thedir->entry), &entries, FIL_STANDARD); } else { rv = DosFindNext(thedir->handle, &thedir->entry, sizeof(thedir->entry), &entries); } - finfo->pool = thedir->pool; + finfo->pool = pool; finfo->fname = NULL; finfo->valid = 0; diff --git a/file_io/unix/dir.c b/file_io/unix/dir.c index d9b344f30..5a17b8601 100644 --- a/file_io/unix/dir.c +++ b/file_io/unix/dir.c @@ -142,6 +142,12 @@ static apr_filetype_e filetype_from_dirent_type(int type) apr_status_t apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_dir_t *thedir) { + return apr_dir_pread(finfo, wanted, thedir, thedir->pool); +} + +apr_status_t apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir, apr_pool_t *pool) +{ apr_status_t ret = 0; #ifdef DIRENT_TYPE apr_filetype_e type; @@ -251,7 +257,7 @@ apr_status_t apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_cpystrn(end, thedir->entry->d_name, sizeof fspec - (end - fspec)); - ret = apr_stat(finfo, fspec, APR_FINFO_LINK | wanted, thedir->pool); + ret = apr_stat(finfo, fspec, APR_FINFO_LINK | wanted, pool); /* We passed a stack name that will disappear */ finfo->fname = NULL; } @@ -263,7 +269,7 @@ apr_status_t apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, /* We don't bail because we fail to stat, when we are only -required- * to readdir... but the result will be APR_INCOMPLETE */ - finfo->pool = thedir->pool; + finfo->pool = pool; finfo->valid = 0; #ifdef DIRENT_TYPE if (type != APR_UNKFILE) { @@ -279,7 +285,7 @@ apr_status_t apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, #endif } - finfo->name = apr_pstrdup(thedir->pool, thedir->entry->d_name); + finfo->name = apr_pstrdup(pool, thedir->entry->d_name); finfo->valid |= APR_FINFO_NAME; if (wanted) diff --git a/file_io/win32/dir.c b/file_io/win32/dir.c index f44bceb97..1703ac4b3 100644 --- a/file_io/win32/dir.c +++ b/file_io/win32/dir.c @@ -91,6 +91,12 @@ APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *dir) APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_dir_t *thedir) { + return apr_dir_pread(finfo, wanted, thedir, thedir->pool); +} + +APR_DECLARE(apr_status_t) apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir, apr_pool_t *pool) +{ apr_status_t rv; char *fname; apr_wchar_t wdirname[APR_PATH_MAX]; @@ -150,7 +156,7 @@ APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, fillin_fileinfo(finfo, (WIN32_FILE_ATTRIBUTE_DATA *) thedir->entry, 0, 1, fname, wanted); - finfo->pool = thedir->pool; + finfo->pool = pool; finfo->valid |= APR_FINFO_NAME; finfo->name = fname; |