We need to decide how we are going to handle this test. The only way to
test for this condition on Unix is to do a stat in apr_file_info. That
seems like an incredibly heavy-weight solution.
The problem is that Windows can't open a directory with CreateFile, which
is the API that we use under the covers in apr_file_open.
Does anybody know of a light-weight solution for Unix or an API that can
open both files and directories on Windows?
Ryan
On 29 Dec 2002 [EMAIL PROTECTED] wrote:
> wrowe 2002/12/29 11:51:34
>
> Modified: test testfile.c
> Log:
> apr_file_open(f, "directory", ..., p) is not portable, test for it.
>
> Revision Changes Path
> 1.64 +22 -18 apr/test/testfile.c
>
> Index: testfile.c
> ===================================================================
> RCS file: /home/cvs/apr/test/testfile.c,v
> retrieving revision 1.63
> retrieving revision 1.64
> diff -u -r1.63 -r1.64
> --- testfile.c 29 Dec 2002 19:41:20 -0000 1.63
> +++ testfile.c 29 Dec 2002 19:51:34 -0000 1.64
> @@ -61,7 +61,8 @@
> #include "apr_lib.h"
> #include "test_apr.h"
>
> -#define FILENAME "data/file_datafile.txt"
> +#define DIRNAME "data"
> +#define FILENAME DIRNAME "/file_datafile.txt"
> #define TESTSTR "This is the file data file."
>
> #define TESTREAD_BLKSIZE 1024
> @@ -79,14 +80,26 @@
> APR_UREAD | APR_UWRITE | APR_GREAD, p);
> CuAssertTrue(tc, rv != APR_SUCCESS);
> CuAssertIntEquals(tc, 1, APR_STATUS_IS_EACCES(rv));
> -#if 0
> - /* I consider this a bug, if we are going to return an error, we
> shouldn't
> - * allocate the file pointer. But, this would make us fail the text,
> so
> - * I am commenting it out for now.
> - */
> CuAssertPtrEquals(tc, NULL, thefile);
> -#endif
> - apr_file_close(thefile);
> + if (thefile) {
> + apr_file_close(thefile);
> + }
> +}
> +
> +static void test_open_dir_read(CuTest *tc)
> +{
> + apr_status_t rv;
> + apr_file_t *thedir = NULL;
> +
> + rv = apr_file_open(&thedir, DIRNAME,
> + APR_READ,
> + APR_UREAD | APR_UWRITE | APR_GREAD, p);
> + CuAssertTrue(tc, rv != APR_SUCCESS);
> + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EACCES(rv));
> + CuAssertPtrEquals(tc, NULL, thedir);
> + if (thedir) {
> + apr_file_close(thedir);
> + }
> }
>
> static void test_open_excl(CuTest *tc)
> @@ -99,17 +112,7 @@
> APR_UREAD | APR_UWRITE | APR_GREAD, p);
> CuAssertTrue(tc, rv != APR_SUCCESS);
> CuAssertIntEquals(tc, 1, APR_STATUS_IS_EEXIST(rv));
> -#if 0
> - /* I consider this a bug, if we are going to return an error, we
> shouldn't
> - * allocate the file pointer. But, this would make us fail the text,
> so
> - * I am commenting it out for now.
> - */
> CuAssertPtrEquals(tc, NULL, thefile);
> -#endif
> - /* And this too is a bug... Win32 (correctly) does not allocate
> - * an apr_file_t, and (correctly) returns NULL. Closing objects
> - * that failed to open is invalid. Apparently someone is doing so.
> - */
> if (thefile) {
> apr_file_close(thefile);
> }
> @@ -526,6 +529,7 @@
> CuSuite *suite = CuSuiteNew("File I/O");
>
> SUITE_ADD_TEST(suite, test_open_noreadwrite);
> + SUITE_ADD_TEST(suite, test_open_dir_read);
> SUITE_ADD_TEST(suite, test_open_excl);
> SUITE_ADD_TEST(suite, test_open_read);
> SUITE_ADD_TEST(suite, test_open_readwrite);
>
>
>
>