You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by ko...@apache.org on 2023/04/12 13:32:15 UTC

svn commit: r1909093 - in /apr/apr/branches/1.8.x: ./ CHANGES file_io/win32/open.c test/testfile.c

Author: kotkov
Date: Wed Apr 12 13:32:15 2023
New Revision: 1909093

URL: http://svn.apache.org/viewvc?rev=1909093&view=rev
Log:
On 1.8.x branch: Merge r1909088, r1909089 from trunk:

  Revert r1808456 (Win32: Don't seek to the end when opening files with
  APR_FOPEN_APPEND).

  Add a regression test for the issue where appending to a buffered file
  was causing the content to be written at offset 0, rather than appended.

Modified:
    apr/apr/branches/1.8.x/   (props changed)
    apr/apr/branches/1.8.x/CHANGES
    apr/apr/branches/1.8.x/file_io/win32/open.c
    apr/apr/branches/1.8.x/test/testfile.c

Propchange: apr/apr/branches/1.8.x/
------------------------------------------------------------------------------
  Merged /apr/apr/trunk:r1909088-1909089

Modified: apr/apr/branches/1.8.x/CHANGES
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.8.x/CHANGES?rev=1909093&r1=1909092&r2=1909093&view=diff
==============================================================================
--- apr/apr/branches/1.8.x/CHANGES [utf-8] (original)
+++ apr/apr/branches/1.8.x/CHANGES [utf-8] Wed Apr 12 13:32:15 2023
@@ -22,9 +22,6 @@ Changes for APR 1.8.0
   *) apr_file_gets: Optimize for buffered files on Windows.
      [Evgeny Kotkov <evgeny.kotkov visualsvn.com>]
 
-  *) Don't seek to the end when opening files with APR_FOPEN_APPEND on Windows.
-     [Evgeny Kotkov <evgeny.kotkov visualsvn.com>]
-
   *) apr_file_write: Optimize large writes to buffered files on Windows.
      [Evgeny Kotkov <evgeny.kotkov visualsvn.com>]
 

Modified: apr/apr/branches/1.8.x/file_io/win32/open.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.8.x/file_io/win32/open.c?rev=1909093&r1=1909092&r2=1909093&view=diff
==============================================================================
--- apr/apr/branches/1.8.x/file_io/win32/open.c (original)
+++ apr/apr/branches/1.8.x/file_io/win32/open.c Wed Apr 12 13:32:15 2023
@@ -445,6 +445,7 @@ APR_DECLARE(apr_status_t) apr_file_open(
 
     if (flag & APR_FOPEN_APPEND) {
         (*new)->append = 1;
+        SetFilePointer((*new)->filehand, 0, NULL, FILE_END);
     }
     if (flag & APR_FOPEN_BUFFERED) {
         (*new)->buffered = 1;

Modified: apr/apr/branches/1.8.x/test/testfile.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.8.x/test/testfile.c?rev=1909093&r1=1909092&r2=1909093&view=diff
==============================================================================
--- apr/apr/branches/1.8.x/test/testfile.c (original)
+++ apr/apr/branches/1.8.x/test/testfile.c Wed Apr 12 13:32:15 2023
@@ -1893,56 +1893,6 @@ static void test_append_locked(abts_case
     apr_file_remove(fname, p);
 }
 
-static void test_append_read(abts_case *tc, void *data)
-{
-    apr_status_t rv;
-    apr_file_t *f;
-    const char *fname = "data/testappend_read.dat";
-    apr_off_t offset;
-    char buf[64];
-
-    apr_file_remove(fname, p);
-
-    /* Create file with contents. */
-    rv = apr_file_open(&f, fname, APR_FOPEN_WRITE | APR_FOPEN_CREATE,
-                       APR_FPROT_OS_DEFAULT, p);
-    APR_ASSERT_SUCCESS(tc, "create file", rv);
-
-    rv = apr_file_puts("abc", f);
-    APR_ASSERT_SUCCESS(tc, "write to file", rv);
-    apr_file_close(f);
-
-    /* Re-open it with APR_FOPEN_APPEND. */
-    rv = apr_file_open(&f, fname,
-                       APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_APPEND,
-                       APR_FPROT_OS_DEFAULT, p);
-    APR_ASSERT_SUCCESS(tc, "open file", rv);
-
-    /* Test the initial file offset.  Even though we used APR_FOPEN_APPEND,
-     * the offset should be kept in the beginning of the file until the
-     * first append.  (Previously, the Windows implementation performed
-     * an erroneous seek to the file's end right after opening it.)
-     */
-    offset = 0;
-    rv = apr_file_seek(f, APR_CUR, &offset);
-    APR_ASSERT_SUCCESS(tc, "get file offset", rv);
-    ABTS_INT_EQUAL(tc, 0, (int)offset);
-
-    /* Test reading from the file. */
-    rv = apr_file_gets(buf, sizeof(buf), f);
-    APR_ASSERT_SUCCESS(tc, "read from file", rv);
-    ABTS_STR_EQUAL(tc, "abc", buf);
-
-    /* Test the file offset after reading. */
-    offset = 0;
-    rv = apr_file_seek(f, APR_CUR, &offset);
-    APR_ASSERT_SUCCESS(tc, "get file offset", rv);
-    ABTS_INT_EQUAL(tc, 3, (int)offset);
-
-    apr_file_close(f);
-    apr_file_remove(fname, p);
-}
-
 static void test_empty_read_buffered(abts_case *tc, void *data)
 {
     apr_status_t rv;
@@ -2301,6 +2251,50 @@ static void test_read_buffered_seek(abts
     apr_file_remove(fname, p);
 }
 
+static void test_append_buffered(abts_case *tc, void *data)
+{
+    apr_status_t rv;
+    apr_file_t *f;
+    const char *fname = "data/testappend_buffered.dat";
+    apr_size_t bytes_written;
+    char buf[64];
+
+    apr_file_remove(fname, p);
+
+    /* Create file with contents. */
+    rv = apr_file_open(&f, fname, APR_FOPEN_WRITE | APR_FOPEN_CREATE,
+                       APR_FPROT_OS_DEFAULT, p);
+    APR_ASSERT_SUCCESS(tc, "create file", rv);
+
+    rv = apr_file_write_full(f, "abc", 3, &bytes_written);
+    APR_ASSERT_SUCCESS(tc, "write to file", rv);
+    apr_file_close(f);
+
+    /* Re-open it with APR_FOPEN_APPEND and APR_FOPEN_BUFFERED. */
+    rv = apr_file_open(&f, fname,
+                       APR_FOPEN_READ | APR_FOPEN_WRITE |
+                       APR_FOPEN_APPEND | APR_FOPEN_BUFFERED,
+                       APR_FPROT_OS_DEFAULT, p);
+    APR_ASSERT_SUCCESS(tc, "open file", rv);
+
+    /* Append to the file. */
+    rv = apr_file_write_full(f, "def", 3, &bytes_written);
+    APR_ASSERT_SUCCESS(tc, "write to file", rv);
+    apr_file_close(f);
+
+    rv = apr_file_open(&f, fname, APR_FOPEN_READ,
+                       APR_FPROT_OS_DEFAULT, p);
+    APR_ASSERT_SUCCESS(tc, "open file", rv);
+
+    /* Test the file contents. */
+    rv = apr_file_gets(buf, sizeof(buf), f);
+    APR_ASSERT_SUCCESS(tc, "read from file", rv);
+    ABTS_STR_EQUAL(tc, "abcdef", buf);
+
+    apr_file_close(f);
+    apr_file_remove(fname, p);
+}
+
 abts_suite *testfile(abts_suite *suite)
 {
     suite = ADD_SUITE(suite)
@@ -2359,7 +2353,6 @@ abts_suite *testfile(abts_suite *suite)
     abts_run_test(suite, test_datasync_on_stream, NULL);
     abts_run_test(suite, test_atomic_append, NULL);
     abts_run_test(suite, test_append_locked, NULL);
-    abts_run_test(suite, test_append_read, NULL);
     abts_run_test(suite, test_empty_read_buffered, NULL);
     abts_run_test(suite, test_large_read_buffered, NULL);
     abts_run_test(suite, test_two_large_reads_buffered, NULL);
@@ -2367,6 +2360,7 @@ abts_suite *testfile(abts_suite *suite)
     abts_run_test(suite, test_read_buffered_spanning_over_bufsize, NULL);
     abts_run_test(suite, test_single_byte_reads_buffered, NULL);
     abts_run_test(suite, test_read_buffered_seek, NULL);
+    abts_run_test(suite, test_append_buffered, NULL);
 
     return suite;
 }