lx_fs: add modification time

Issue #1784.
This commit is contained in:
Josef Söntgen 2019-03-20 13:59:56 +01:00 committed by Christian Helmuth
parent 2ec3aaf639
commit 2e5166efd7
4 changed files with 50 additions and 11 deletions

View File

@ -114,6 +114,17 @@ class Lx_fs::Directory : public Node
closedir(_fd);
}
void update_modification_time(Timestamp const time) override
{
struct timespec ts[2] = {
{ .tv_sec = (time_t)0, .tv_nsec = 0 },
{ .tv_sec = (time_t)time.value, .tv_nsec = 0 }
};
/* silently ignore errors */
futimens(dirfd(_fd), (const timespec*)&ts);
}
void rename(Directory &dir_to, char const *name_from, char const *name_to)
{
int ret = renameat(dirfd(_fd), name_from,
@ -217,10 +228,17 @@ class Lx_fs::Directory : public Node
Status status() override
{
struct stat st;
int fd = dirfd(_fd);
if (fd == -1 || fstat(fd, &st) < 0)
st.st_mtime = 0;
Status s;
s.inode = inode();
s.size = _num_entries() * sizeof(File_system::Directory_entry);
s.mode = File_system::Status::MODE_DIRECTORY;
s.modification_time = { st.st_mtime };
return s;
}
};

View File

@ -82,16 +82,6 @@ class Lx_fs::File : public Node
return fd;
}
file_size_t _length() const
{
struct stat s;
if (fstat(_fd, &s) < 0)
return 0;
return s.st_size;
}
public:
File(int dir,
@ -118,6 +108,17 @@ class Lx_fs::File : public Node
close(_fd);
}
void update_modification_time(Timestamp const time) override
{
struct timespec ts[2] = {
{ .tv_sec = (time_t)0, .tv_nsec = 0 },
{ .tv_sec = (time_t)time.value, .tv_nsec = 0 }
};
/* silently ignore errors */
futimens(_fd, (const timespec*)&ts);
}
size_t read(char *dst, size_t len, seek_off_t seek_offset) override
{
int ret = pread(_fd, dst, len, seek_offset);
@ -142,10 +143,18 @@ class Lx_fs::File : public Node
Status status() override
{
struct stat st;
if (fstat(_fd, &st) < 0) {
st.st_size = 0;
st.st_mtime = 0;
}
Status s;
s.inode = inode();
s.size = _length();
s.size = st.st_size;
s.mode = File_system::Status::MODE_FILE;
s.modification_time = { st.st_mtime };
return s;
}

View File

@ -97,6 +97,16 @@ class Lx_fs::Session_component : public Session_rpc_object
}
break;
case Packet_descriptor::WRITE_TIMESTAMP:
if (tx_sink()->packet_valid(packet) && (packet.length() <= packet.size())) {
packet.with_timestamp([&] (File_system::Timestamp const time) {
open_node.node().update_modification_time(time);
succeeded = true;
});
}
break;
case Packet_descriptor::CONTENT_CHANGED:
open_node.register_notify(*tx_sink());
/* notify_listeners may bounce the packet back*/

View File

@ -48,6 +48,8 @@ class Lx_fs::Node : public File_system::Node_base
*/
void name(char const *name) { Genode::strncpy(_name, name, sizeof(_name)); }
virtual void update_modification_time(Timestamp const) = 0;
virtual size_t read(char *dst, size_t len, seek_off_t) = 0;
virtual size_t write(char const *src, size_t len, seek_off_t) = 0;