apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Branko ─îibej <br...@xbc.nu>
Subject Re: setting timestamps
Date Fri, 04 Jul 2003 02:05:37 GMT
I wrote:

>This interface looks sane, and I can cobble up a Windows implementation
>in two eyeblinks.
>  
>
And here it is, including tests.

Index: include/apr_file_io.h
===================================================================
RCS file: /home/cvs/apr/include/apr_file_io.h,v
retrieving revision 1.141
diff -u -u -p -r1.141 apr_file_io.h
--- include/apr_file_io.h	15 Jun 2003 00:05:26 -0000	1.141
+++ include/apr_file_io.h	4 Jul 2003 01:55:23 -0000
@@ -655,6 +658,18 @@ APR_DECLARE(apr_status_t) apr_file_attrs
                                              apr_fileattrs_t attributes,
                                              apr_fileattrs_t attr_mask,
                                              apr_pool_t *cont);
+
+/**
+ * Set the mtime of the specified file.
+ * @param fname The full path to the file (using / on all systems)
+ * @param mtime The mtime to apply to the file.
+ * @param pool The pool to use.
+ * @warning Platforms which do not implement this feature will return
+ *      APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname,
+                                             apr_time_t mtime,
+                                             apr_pool_t *pool);
 
 /**
  * Create a new directory on the file system.
Index: include/arch/win32/apr_arch_file_io.h
===================================================================
RCS file: /home/cvs/apr/include/arch/win32/apr_arch_file_io.h,v
retrieving revision 1.2
diff -u -u -p -r1.2 apr_arch_file_io.h
--- include/arch/win32/apr_arch_file_io.h	24 Jan 2003 17:15:56 -0000	1.2
+++ include/arch/win32/apr_arch_file_io.h	4 Jul 2003 01:55:24 -0000
@@ -133,10 +133,11 @@ void *res_name_from_filename(const char 
 #endif
 
 /* Internal Flags for apr_file_open */
-#define APR_OPENINFO     0x4000    /* Open without READ or WRITE access */
-#define APR_OPENLINK     0x2000    /* Open a link itself, if supported */
-#define APR_READCONTROL  0x1000    /* Read the file's owner/perms */
-#define APR_WRITECONTROL 0x0800    /* Modifythe file's owner/perms */
+#define APR_OPENINFO     0x00100000 /* Open without READ or WRITE access */
+#define APR_OPENLINK     0x00200000 /* Open a link itself, if supported */
+#define APR_READCONTROL  0x00400000 /* Read the file's owner/perms */
+#define APR_WRITECONTROL 0x00800000 /* Modifythe file's owner/perms */
+#define APR_WRITEATTRS   0x01000000 /* Modify the file's attributes */
 
 /* Entries missing from the MSVC 5.0 Win32 SDK:
  */
Index: file_io/win32/open.c
===================================================================
RCS file: /home/cvs/apr/file_io/win32/open.c,v
retrieving revision 1.117
diff -u -u -p -r1.117 open.c
--- file_io/win32/open.c	7 Jan 2003 00:52:54 -0000	1.117
+++ file_io/win32/open.c	4 Jul 2003 01:55:23 -0000
@@ -309,7 +309,10 @@ APR_DECLARE(apr_status_t) apr_file_open(
     if (flag & APR_WRITE) {
         oflags |= GENERIC_WRITE;
     }
-    
+    if (flag & APR_WRITEATTRS) {
+        oflags |= FILE_WRITE_ATTRIBUTES;
+    }
+
     if (apr_os_level >= APR_WIN_NT) 
         sharemode |= FILE_SHARE_DELETE;
 
Index: file_io/win32/filestat.c
===================================================================
RCS file: /home/cvs/apr/file_io/win32/filestat.c,v
retrieving revision 1.80
diff -u -u -p -r1.80 filestat.c
--- file_io/win32/filestat.c	24 May 2003 10:30:39 -0000	1.80
+++ file_io/win32/filestat.c	4 Jul 2003 01:55:20 -0000
@@ -762,3 +762,37 @@ APR_DECLARE(apr_status_t) apr_file_attrs
 
     return APR_SUCCESS;
 }
+
+
+APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname,
+                                             apr_time_t mtime,
+                                             apr_pool_t *pool)
+{
+    apr_file_t *thefile;
+    apr_status_t rv;
+
+    rv = apr_file_open(&thefile, fname,
+                       APR_READ | APR_WRITEATTRS,
+                       APR_OS_DEFAULT, pool);
+    if (!rv)
+    {
+        FILETIME file_ctime;
+        FILETIME file_atime;
+        FILETIME file_mtime;
+
+        if (!GetFileTime(thefile->filehand,
+                         &file_ctime, &file_atime, &file_mtime))
+            rv = apr_get_os_error();
+        else
+        {
+            AprTimeToFileTime(&file_mtime, mtime);
+            if (!SetFileTime(thefile->filehand,
+                             &file_ctime, &file_atime, &file_mtime))
+                rv = apr_get_os_error();
+        }
+
+        apr_file_close(thefile);
+    }
+
+    return rv;
+}
Index: test/testfileinfo.c
===================================================================
RCS file: /home/cvs/apr/test/testfileinfo.c,v
retrieving revision 1.10
diff -u -u -p -r1.10 testfileinfo.c
--- test/testfileinfo.c	7 Feb 2003 12:33:00 -0000	1.10
+++ test/testfileinfo.c	4 Jul 2003 01:55:24 -0000
3@@ -59,6 +59,7 @@
 #include "apr_general.h"
 #include "apr_poll.h"
 #include "apr_lib.h"
+#include "apr_time.h"
 #include "test_apr.h"
 
 #define FILENAME "data/file_datafile.txt"
@@ -239,6 +240,53 @@ static void test_buffered_write_size(CuT
     apr_file_close(thefile);
 }
 
+static void test_mtime_set(CuTest *tc)
+{
+    apr_file_t *thefile;
+    apr_finfo_t finfo;
+    apr_time_t epoch = 0;
+    apr_status_t rv;
+
+    /* This test sort of depends on the system clock being at least
+     * marginally ccorrect; We'll be setting the modification time to
+     * the epoch.
+     */
+    rv = apr_file_open(&thefile, NEWFILENAME,
+                       APR_READ | APR_WRITE | APR_CREATE | APR_TRUNCATE
+                       | APR_BUFFERED | APR_DELONCLOSE,
+                       APR_OS_DEFAULT, p);
+    apr_assert_success(tc, "open file", rv);
+
+    /* Check that the current mtime is not the epoch */
+    rv = apr_stat(&finfo, NEWFILENAME, APR_FINFO_MTIME, p);
+    if (rv  == APR_INCOMPLETE) {
+        char *str;
+	int i;
+        str = apr_pstrdup(p, "APR_INCOMPLETE:  Missing ");
+        for (i = 0; vfi[i].bits; ++i) {
+            if (vfi[i].bits & ~finfo.valid) {
+                str = apr_pstrcat(p, str, vfi[i].description, " ", NULL);
+            }
+        }
+        CuFail(tc, str);
+    }
+    apr_assert_success(tc, "get initial mtime", rv);
+    CuAssertTrue(tc, finfo.mtime != epoch);
+
+    /* Reset the mtime to the epoch and verify the result.
+     * Note: we blindly assume that if the first apr_stat succeeded,
+     * the second one will, too.
+     */
+    rv = apr_file_mtime_set(NEWFILENAME, epoch, p);
+    apr_assert_success(tc, "set mtime", rv);
+
+    rv = apr_stat(&finfo, NEWFILENAME, APR_FINFO_MTIME, p);
+    apr_assert_success(tc, "get modified mtime", rv);
+    CuAssertTrue(tc, finfo.mtime == epoch);
+
+    apr_file_close(thefile);
+}
+
 CuSuite *testfileinfo(void)
 {
     CuSuite *suite = CuSuiteNew("File Info");
@@ -247,6 +296,7 @@ CuSuite *testfileinfo(void)
     SUITE_ADD_TEST(suite, test_stat);
     SUITE_ADD_TEST(suite, test_stat_eq_finfo);
     SUITE_ADD_TEST(suite, test_buffered_write_size);
+    SUITE_ADD_TEST(suite, test_mtime_set);
 
     return suite;
 }




-- 
Brane ─îibej   <brane@xbc.nu>   http://www.xbc.nu/brane/


Mime
View raw message