mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:07:35 +00:00
Implement utime() along with a naive /bin/touch.
This synchronous approach to inodes is silly, obviously. I need to rework it so that the in-memory CoreInode object is the canonical inode, and then we just need a sync() that flushes pending changes to disk.
This commit is contained in:
parent
e03d341615
commit
038d8641f9
22 changed files with 122 additions and 22 deletions
|
@ -716,16 +716,18 @@ bool Ext2FS::modify_link_count(InodeIndex inode, int delta)
|
|||
return write_ext2_inode(inode, *e2inode);
|
||||
}
|
||||
|
||||
bool Ext2FS::set_mtime(InodeIdentifier inode, dword timestamp)
|
||||
int Ext2FS::set_atime_and_mtime(InodeIdentifier inode, dword atime, dword mtime)
|
||||
{
|
||||
ASSERT(inode.fsid() == id());
|
||||
|
||||
auto e2inode = lookup_ext2_inode(inode.index());
|
||||
if (!e2inode)
|
||||
return false;
|
||||
return -EIO;
|
||||
|
||||
kprintf("changing inode %u mtime from %u to %u\n", inode.index(), e2inode->i_mtime, timestamp);
|
||||
e2inode->i_mtime = timestamp;
|
||||
dbgprintf("changing inode %u atime from %u to %u\n", inode.index(), e2inode->i_atime, atime);
|
||||
dbgprintf("changing inode %u mtime from %u to %u\n", inode.index(), e2inode->i_mtime, mtime);
|
||||
e2inode->i_mtime = mtime;
|
||||
e2inode->i_atime = atime;
|
||||
|
||||
return write_ext2_inode(inode.index(), *e2inode);
|
||||
}
|
||||
|
|
|
@ -72,7 +72,7 @@ private:
|
|||
virtual InodeIdentifier root_inode() const override;
|
||||
virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override;
|
||||
virtual InodeMetadata inode_metadata(InodeIdentifier) const override;
|
||||
virtual bool set_mtime(InodeIdentifier, dword timestamp) override;
|
||||
virtual int set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime) override;
|
||||
virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override;
|
||||
virtual ssize_t read_inode_bytes(InodeIdentifier, Unix::off_t offset, size_t count, byte* buffer, FileDescriptor*) const override;
|
||||
virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;
|
||||
|
|
|
@ -288,3 +288,17 @@ FileDescriptor::FileDescriptor(FIFO& fifo, FIFO::Direction direction)
|
|||
{
|
||||
m_fifo->open(direction);
|
||||
}
|
||||
|
||||
int FileDescriptor::set_atime_and_mtime(time_t atime, time_t mtime)
|
||||
{
|
||||
if (!m_vnode || !m_vnode->core_inode())
|
||||
return -EBADF;
|
||||
return m_vnode->core_inode()->set_atime_and_mtime(atime, mtime);
|
||||
}
|
||||
|
||||
int FileDescriptor::set_ctime(time_t ctime)
|
||||
{
|
||||
(void) ctime;
|
||||
// FIXME: Implement.
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
|
|
@ -64,13 +64,15 @@ public:
|
|||
|
||||
ByteBuffer& generator_cache() { return m_generator_cache; }
|
||||
|
||||
int set_atime_and_mtime(time_t, time_t);
|
||||
int set_ctime(time_t);
|
||||
|
||||
private:
|
||||
friend class VFS;
|
||||
explicit FileDescriptor(RetainPtr<Vnode>&&);
|
||||
FileDescriptor(FIFO&, FIFO::Direction);
|
||||
|
||||
RetainPtr<Vnode> m_vnode;
|
||||
RetainPtr<CoreInode> m_inode;
|
||||
|
||||
Unix::off_t m_current_offset { 0 };
|
||||
|
||||
|
|
|
@ -127,3 +127,8 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, size_t nl, InodeIdentifier i,
|
|||
CoreInode::~CoreInode()
|
||||
{
|
||||
}
|
||||
|
||||
int CoreInode::set_atime_and_mtime(Unix::time_t atime, Unix::time_t mtime)
|
||||
{
|
||||
return fs().set_atime_and_mtime(identifier(), atime, mtime);
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ public:
|
|||
byte fileType { 0 };
|
||||
};
|
||||
|
||||
virtual bool set_mtime(InodeIdentifier, dword timestamp) = 0;
|
||||
virtual int set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime) = 0;
|
||||
virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) = 0;
|
||||
virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) = 0;
|
||||
|
||||
|
@ -85,6 +85,8 @@ public:
|
|||
virtual InodeIdentifier lookup(const String& name) = 0;
|
||||
virtual String reverse_lookup(InodeIdentifier) = 0;
|
||||
|
||||
int set_atime_and_mtime(Unix::time_t atime, Unix::time_t mtime);
|
||||
|
||||
protected:
|
||||
CoreInode(FS& fs, unsigned index)
|
||||
: m_fs(fs)
|
||||
|
|
|
@ -146,11 +146,12 @@ InodeMetadata SynthFS::inode_metadata(InodeIdentifier inode) const
|
|||
return (*it).value->m_metadata;
|
||||
}
|
||||
|
||||
bool SynthFS::set_mtime(InodeIdentifier, dword timestamp)
|
||||
int SynthFS::set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime)
|
||||
{
|
||||
(void) timestamp;
|
||||
(void) atime;
|
||||
(void) mtime;
|
||||
kprintf("FIXME: Implement SyntheticFileSystem::setModificationTime().\n");
|
||||
return false;
|
||||
return -ENOTIMPL;
|
||||
}
|
||||
|
||||
InodeIdentifier SynthFS::create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size, int& error)
|
||||
|
|
|
@ -16,7 +16,7 @@ public:
|
|||
virtual InodeIdentifier root_inode() const override;
|
||||
virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override;
|
||||
virtual InodeMetadata inode_metadata(InodeIdentifier) const override;
|
||||
virtual bool set_mtime(InodeIdentifier, dword timestamp) override;
|
||||
virtual int set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime) override;
|
||||
virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override;
|
||||
virtual ssize_t read_inode_bytes(InodeIdentifier, Unix::off_t offset, size_t count, byte* buffer, FileDescriptor*) const override;
|
||||
virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;
|
||||
|
|
|
@ -264,6 +264,11 @@ typedef signed_qword off_t;
|
|||
typedef ::time_t time_t;
|
||||
#endif
|
||||
|
||||
struct utimbuf {
|
||||
time_t actime;
|
||||
time_t modtime;
|
||||
};
|
||||
|
||||
typedef dword blksize_t;
|
||||
typedef dword blkcnt_t;
|
||||
|
||||
|
|
|
@ -252,15 +252,6 @@ void VFS::traverse_directory_inode(CoreInode& dir_inode, Function<bool(const FS:
|
|||
});
|
||||
}
|
||||
|
||||
bool VFS::touch(const String& path)
|
||||
{
|
||||
int error;
|
||||
auto inode = resolve_path(path, root_inode_id(), error);
|
||||
if (!inode.is_valid())
|
||||
return false;
|
||||
return inode.fs()->set_mtime(inode, ktime(nullptr));
|
||||
}
|
||||
|
||||
RetainPtr<FileDescriptor> VFS::open(CharacterDevice& device, int options)
|
||||
{
|
||||
// FIXME: Respect options.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue