diff options
-rw-r--r-- | CHANGES | 7 | ||||
-rw-r--r-- | file_io/os2/dir.c | 14 | ||||
-rw-r--r-- | file_io/unix/dir.c | 12 | ||||
-rw-r--r-- | file_io/win32/dir.c | 10 | ||||
-rw-r--r-- | include/apr_file_info.h | 28 | ||||
-rw-r--r-- | test/testdir.c | 67 |
6 files changed, 11 insertions, 127 deletions
@@ -5,13 +5,6 @@ Changes for APR 2.0.0 *) apr_thread_exit() is now a void function. [Joe Orton] - *) apr_dir_read(): The returned finfo->name field is now duplicated - into the pool for all implementations. [Joe Orton] - - *) apr_dir_pread(): Add function which restricts per-read memory - consumption to a different pool to the apr_dir_t object. - [Joe Orton] - *) apr_crypto_openssl: Remove unused link to the ssl library. [Graham Leggett] diff --git a/file_io/os2/dir.c b/file_io/os2/dir.c index c26f39d1f..f1554b6f3 100644 --- a/file_io/os2/dir.c +++ b/file_io/os2/dir.c @@ -79,28 +79,24 @@ 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(pool, thedir->dirname, "/*", NULL), &thedir->handle, + rv = DosFindFirst(apr_pstrcat(thedir->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 = pool; + finfo->pool = thedir->pool; finfo->fname = NULL; finfo->valid = 0; @@ -122,7 +118,7 @@ APR_DECLARE(apr_status_t) apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, apr_os2_time_to_apr_time(&finfo->ctime, thedir->entry.fdateCreation, thedir->entry.ftimeCreation); - finfo->name = apr_pstrdup(pool, thedir->entry.achName); + finfo->name = thedir->entry.achName; finfo->valid = APR_FINFO_NAME | APR_FINFO_MTIME | APR_FINFO_ATIME | APR_FINFO_CTIME | APR_FINFO_TYPE | APR_FINFO_SIZE | APR_FINFO_CSIZE; diff --git a/file_io/unix/dir.c b/file_io/unix/dir.c index 5a17b8601..d9b344f30 100644 --- a/file_io/unix/dir.c +++ b/file_io/unix/dir.c @@ -142,12 +142,6 @@ 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; @@ -257,7 +251,7 @@ apr_status_t apr_dir_pread(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, pool); + ret = apr_stat(finfo, fspec, APR_FINFO_LINK | wanted, thedir->pool); /* We passed a stack name that will disappear */ finfo->fname = NULL; } @@ -269,7 +263,7 @@ apr_status_t apr_dir_pread(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 = pool; + finfo->pool = thedir->pool; finfo->valid = 0; #ifdef DIRENT_TYPE if (type != APR_UNKFILE) { @@ -285,7 +279,7 @@ apr_status_t apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, #endif } - finfo->name = apr_pstrdup(pool, thedir->entry->d_name); + finfo->name = apr_pstrdup(thedir->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 b02c9cdfd..f44bceb97 100644 --- a/file_io/win32/dir.c +++ b/file_io/win32/dir.c @@ -91,12 +91,6 @@ 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]; @@ -152,11 +146,11 @@ APR_DECLARE(apr_status_t) apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, if ((rv = unicode_to_utf8_path(thedir->name, APR_FILE_MAX * 3 + 1, thedir->entry->cFileName))) return rv; - fname = apr_pstrdup(pool, thedir->name); + fname = thedir->name; fillin_fileinfo(finfo, (WIN32_FILE_ATTRIBUTE_DATA *) thedir->entry, 0, 1, fname, wanted); - finfo->pool = pool; + finfo->pool = thedir->pool; finfo->valid |= APR_FINFO_NAME; finfo->name = fname; diff --git a/include/apr_file_info.h b/include/apr_file_info.h index 0cf34ff06..cfddc68da 100644 --- a/include/apr_file_info.h +++ b/include/apr_file_info.h @@ -257,45 +257,17 @@ APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *thedir); * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_ values * @param thedir the directory descriptor returned from apr_dir_open - * * @remark No ordering is guaranteed for the entries read. - * @c finfo->pool is set to the pool used to create @a thedir, - * and @c finfo->name is allocated from that pool. * * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may * not be filled in, and you need to check the @c finfo->valid bitmask * to verify that what you're looking for is there. When no more * entries are available, APR_ENOENT is returned. - * - * @warning Allocations will use the directory pool; use - * apr_dir_pread() and a temporary pool to restrict memory - * consumption for a large directory. */ APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, apr_dir_t *thedir); /** - * Read the next entry from the specified directory. - * @param finfo the file info structure and filled in by apr_dir_read - * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_ - values - * @param thedir the directory descriptor returned from apr_dir_open - * @param pool the pool to use for allocations - - * @remark No ordering is guaranteed for the entries read. - * @remark @c finfo->pool is set to @a pool, and @c finfo->name is - * allocated from that pool. - * - * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may - * not be filled in, and you need to check the @c finfo->valid bitmask - * to verify that what you're looking for is there. When no more - * entries are available, APR_ENOENT is returned. - */ -APR_DECLARE(apr_status_t) apr_dir_pread(apr_finfo_t *finfo, apr_int32_t wanted, - apr_dir_t *thedir, apr_pool_t *pool); - - -/** * Rewind the directory to the first entry. * @param thedir the directory descriptor to rewind. */ diff --git a/test/testdir.c b/test/testdir.c index a9f9e5275..21876be5d 100644 --- a/test/testdir.c +++ b/test/testdir.c @@ -21,7 +21,6 @@ #include "apr_file_info.h" #include "apr_errno.h" #include "apr_general.h" -#include "apr_strings.h" #include "apr_lib.h" #include "apr_thread_proc.h" #include "testutil.h" @@ -431,66 +430,6 @@ static void test_readmore_info(abts_case* tc, void* data) ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); } -#if APR_POOL_DEBUG -static void test_pread(abts_case *tc, void *data) -{ - apr_dir_t *dir; - apr_finfo_t finfo; - apr_size_t before, after; - apr_pool_t *subp; - - APR_ASSERT_SUCCESS(tc, "apr_dir_open failed", apr_dir_open(&dir, "data", p)); - - apr_pool_create(&subp, p); - - before = apr_pool_num_bytes(p, 0); - - APR_ASSERT_SUCCESS(tc, "apr_dir_read failed", - apr_dir_pread(&finfo, APR_FINFO_DIRENT, dir, subp)); - - after = apr_pool_num_bytes(p, 0); - - ABTS_PTR_EQUAL(tc, finfo.pool, subp); - - apr_pool_destroy(subp); - - APR_ASSERT_SUCCESS(tc, "apr_dir_close failed", apr_dir_close(dir)); - - ABTS_INT_EQUAL(tc, before, after); - -} -#endif - -/* Ensure that apr_dir_read() doesn't have side-effects, because - * finfo->name points to a static buffer inside the apr_dir_t */ -static void test_read_side_effects(abts_case *tc, void *data) -{ - apr_dir_t *dir; - apr_finfo_t f1; - apr_finfo_t f2; - char name[APR_PATH_MAX], fname[APR_PATH_MAX]; - - APR_ASSERT_SUCCESS(tc, "apr_dir_open failed", apr_dir_open(&dir, "data", p)); - - APR_ASSERT_SUCCESS(tc, "apr_dir_read failed", - apr_dir_read(&f1, APR_FINFO_DIRENT, dir)); - - if (f1.name) - apr_cpystrn(name, f1.name, sizeof name); - if (f1.fname) - apr_cpystrn(fname, f1.fname, sizeof fname); - - APR_ASSERT_SUCCESS(tc, "second apr_dir_read failed", - apr_dir_read(&f2, APR_FINFO_DIRENT, dir)); - - if (f1.name) - ABTS_STR_EQUAL(tc, name, f1.name); - if (f1.fname) - ABTS_STR_EQUAL(tc, fname, f1.fname); - - APR_ASSERT_SUCCESS(tc, "apr_dir_close failed", apr_dir_close(dir)); -} - abts_suite *testdir(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -512,11 +451,7 @@ abts_suite *testdir(abts_suite *suite) abts_run_test(suite, test_closedir, NULL); abts_run_test(suite, test_uncleared_errno, NULL); abts_run_test(suite, test_readmore_info, NULL); -#if APR_POOL_DEBUG - abts_run_test(suite, test_pread, NULL); -#endif - abts_run_test(suite, test_read_side_effects, NULL); - + return suite; } |