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); > > > >