jdk/src/solaris/classes/sun/nio/fs/UnixFileAttributes.java
changeset 15275 6e5b8f8361eb
parent 9035 1255eb81cc2f
child 17154 e8991539c4d7
--- a/jdk/src/solaris/classes/sun/nio/fs/UnixFileAttributes.java	Fri Jan 18 17:34:40 2013 +0000
+++ b/jdk/src/solaris/classes/sun/nio/fs/UnixFileAttributes.java	Fri Jan 18 18:48:44 2013 +0000
@@ -45,9 +45,12 @@
     private int     st_uid;
     private int     st_gid;
     private long    st_size;
-    private long    st_atime;
-    private long    st_mtime;
-    private long    st_ctime;
+    private long    st_atime_sec;
+    private long    st_atime_nsec;
+    private long    st_mtime_sec;
+    private long    st_mtime_nsec;
+    private long    st_ctime_sec;
+    private long    st_ctime_nsec;
 
     // created lazily
     private volatile UserPrincipal owner;
@@ -101,8 +104,20 @@
     int uid()   { return st_uid; }
     int gid()   { return st_gid; }
 
+    private static FileTime toFileTime(long sec, long nsec) {
+        if (nsec == 0) {
+            return FileTime.from(sec, TimeUnit.SECONDS);
+        } else {
+            // truncate to microseconds to avoid overflow with timestamps
+            // way out into the future. We can re-visit this if FileTime
+            // is updated to define a from(secs,nsecs) method.
+            long micro = sec*1000000L + nsec/1000L;
+            return FileTime.from(micro, TimeUnit.MICROSECONDS);
+        }
+    }
+
     FileTime ctime() {
-        return FileTime.from(st_ctime, TimeUnit.SECONDS);
+        return toFileTime(st_ctime_sec, st_ctime_nsec);
     }
 
     boolean isDevice() {
@@ -114,12 +129,12 @@
 
     @Override
     public FileTime lastModifiedTime() {
-        return FileTime.from(st_mtime, TimeUnit.SECONDS);
+        return toFileTime(st_mtime_sec, st_mtime_nsec);
     }
 
     @Override
     public FileTime lastAccessTime() {
-        return FileTime.from(st_atime, TimeUnit.SECONDS);
+        return toFileTime(st_atime_sec, st_atime_nsec);
     }
 
     @Override