diff --git a/src/main/java/org/filesys/server/filesys/NetworkFile.java b/src/main/java/org/filesys/server/filesys/NetworkFile.java index 87a940f..c2fe579 100644 --- a/src/main/java/org/filesys/server/filesys/NetworkFile.java +++ b/src/main/java/org/filesys/server/filesys/NetworkFile.java @@ -118,6 +118,9 @@ public enum Flags { protected long m_modifyDate; protected long m_accessDate; + // Track whether file date needs updating on file close + protected boolean m_modifyDateDirty; + // Granted file access type protected Access m_grantedAccess; @@ -566,6 +569,17 @@ public final long getModifyDate() { return m_modifyDate; } + /** + * Return whether the file modify date/time is dirty due to file writes. Calling + * {@link incrementWriteCount} marks the modify date/time as dirty, setting the + * date/time via {@link setModifyDate} resets it back to clean. + * + * @return boolean + */ + public final boolean isModifyDateDirty() { + return m_modifyDateDirty; + } + /** * Get the write count for the file * @@ -580,6 +594,7 @@ public final int getWriteCount() { */ public final void incrementWriteCount() { m_writeCount++; + m_modifyDateDirty = true; } /** @@ -799,6 +814,7 @@ public final void setDelayedClose(boolean delayClose) { */ public final void setModifyDate(long dattim) { m_modifyDate = dattim; + m_modifyDateDirty = false; } /** diff --git a/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java b/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java index 1f80c07..4506727 100755 --- a/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java +++ b/src/main/java/org/filesys/server/filesys/db/DBDiskDriver.java @@ -1488,8 +1488,12 @@ public void setFileInformation(SrvSession sess, TreeConnection tree, String name if (info.hasSetFlag(FileInfo.SetCreationDate)) dbInfo.setAccessDateTime(info.getCreationDateTime()); - if (info.hasSetFlag(FileInfo.SetModifyDate)) - dbInfo.setAccessDateTime(info.getModifyDateTime()); + if (info.hasSetFlag(FileInfo.SetModifyDate)) { + long modifyDate = info.getModifyDateTime(); + dbInfo.setAccessDateTime(modifyDate); + if (info.hasNetworkFile()) + info.getNetworkFile().setModifyDate(modifyDate); + } if (info.hasSetFlag(FileInfo.SetChangeDate)) dbInfo.setAccessDateTime(info.getChangeDateTime()); diff --git a/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java b/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java index 09a0653..697f2a9 100755 --- a/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java +++ b/src/main/java/org/filesys/server/filesys/db/LocalDataNetworkFile.java @@ -244,8 +244,11 @@ public void closeFile() { m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - m_file.setLastModified(System.currentTimeMillis()); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + m_file.setLastModified(curTime); + this.setModifyDate(curTime); + } // Set the new file size setFileSize(m_file.length()); diff --git a/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java b/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java index be36396..45196c8 100644 --- a/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java +++ b/src/main/java/org/filesys/server/filesys/pseudo/PseudoNetworkFile.java @@ -97,8 +97,11 @@ public void closeFile() m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - m_file.setLastModified(System.currentTimeMillis()); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + m_file.setLastModified(curTime); + this.setModifyDate(curTime); + } // Indicate that the file is closed setClosed(true); diff --git a/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java b/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java index bb5d5dc..3448019 100644 --- a/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java +++ b/src/main/java/org/filesys/smb/server/CoreProtocolHandler.java @@ -2608,6 +2608,9 @@ protected void procSetFileInformation(SMBSrvPacket smbPkt, SMBV1Parser parser) // Access the disk interface that is associated with the shared device DiskInterface disk = (DiskInterface) conn.getSharedDevice().getInterface(); + // Store the associated network file in the file information object + finfo.setNetworkFile(netFile); + // Get the file information for the specified file/directory finfo.setFileInformationFlags(setFlags); disk.setFileInformation(m_sess, conn, netFile.getFullName(), finfo); diff --git a/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java b/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java index b25cb62..2803843 100644 --- a/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java +++ b/src/main/java/org/filesys/smb/server/disk/JavaNIODiskDriver.java @@ -855,6 +855,10 @@ public void setFileInformation(SrvSession sess, TreeConnection tree, String name // Update the file/folder modify date/time Files.setLastModifiedTime( filePath, FileTime.fromMillis( info.getModifyDateTime())); + + // Update the associated network file, too, if possible + if (info.hasNetworkFile()) + info.getNetworkFile().setModifyDate(info.getModifyDateTime()); } } diff --git a/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java b/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java index d5e2a9b..298dd0d 100644 --- a/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java +++ b/src/main/java/org/filesys/smb/server/disk/JavaNIONetworkFile.java @@ -130,8 +130,11 @@ public void closeFile() throws IOException { m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - Files.setLastModifiedTime(m_path, FileTime.fromMillis( System.currentTimeMillis())); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + Files.setLastModifiedTime(m_path, FileTime.fromMillis(curTime)); + this.setModifyDate(curTime); + } // Indicate that the file is closed setClosed(true); diff --git a/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java b/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java index 5b9f5c4..143af80 100644 --- a/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java +++ b/src/main/java/org/filesys/smb/server/disk/original/JavaFileDiskDriver.java @@ -810,6 +810,10 @@ public void setFileInformation(SrvSession sess, TreeConnection tree, String n // Update the file/folder modify date/time File file = new File(fname); file.setLastModified(info.getModifyDateTime()); + + // Update the associated network file, too, if possible + if (info.hasNetworkFile()) + info.getNetworkFile().setModifyDate(info.getModifyDateTime()); } } diff --git a/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java b/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java index 0b658a9..473e2c1 100644 --- a/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java +++ b/src/main/java/org/filesys/smb/server/disk/original/JavaNetworkFile.java @@ -198,8 +198,11 @@ public void closeFile() throws IOException { m_io = null; // Set the last modified date/time for the file - if (this.getWriteCount() > 0) - m_file.setLastModified(System.currentTimeMillis()); + if (this.isModifyDateDirty()) { + long curTime = System.currentTimeMillis(); + m_file.setLastModified(curTime); + this.setModifyDate(curTime); + } // Indicate that the file is closed setClosed(true);