diff --git a/apps/stat.cpp b/apps/stat.cpp index 4d110265..0aa9478b 100644 --- a/apps/stat.cpp +++ b/apps/stat.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include static const char* file_type(mode_t mode) { @@ -36,10 +36,20 @@ Result luna_main(int argc, char** argv) char buf[11]; os::format_mode(st.st_mode, buf); - printf(" File: %s\n", path.chars()); - printf(" Size: %zu (%s)\n", st.st_size, file_type(st.st_mode)); - printf("Inode: %lu Links: %lu\n", st.st_ino, st.st_nlink); - printf(" Mode: (%#o/%s) UID: %u GID: %u\n", st.st_mode & ~S_IFMT, buf, st.st_uid, st.st_gid); + char atime[256]; + strftime(atime, sizeof(atime), "%Y-%m-%d %H:%M:%S", gmtime(&st.st_atim.tv_sec)); + char mtime[256]; + strftime(mtime, sizeof(mtime), "%Y-%m-%d %H:%M:%S", gmtime(&st.st_mtim.tv_sec)); + char ctime[256]; + strftime(ctime, sizeof(ctime), "%Y-%m-%d %H:%M:%S", gmtime(&st.st_ctim.tv_sec)); + + printf(" File: %s\n", path.chars()); + printf(" Size: %zu (%s)\n", st.st_size, file_type(st.st_mode)); + printf(" Inode: %lu Links: %lu\n", st.st_ino, st.st_nlink); + printf(" Mode: (%#o/%s) UID: %u GID: %u\n", st.st_mode & ~S_IFMT, buf, st.st_uid, st.st_gid); + printf("Access: %s.%.9ld\n", atime, st.st_atim.tv_nsec); + printf("Modify: %s.%.9ld\n", mtime, st.st_mtim.tv_nsec); + printf("Change: %s.%.9ld\n", ctime, st.st_ctim.tv_nsec); return 0; } diff --git a/kernel/src/fs/ext2/FileSystem.cpp b/kernel/src/fs/ext2/FileSystem.cpp index 60701756..982c6a57 100644 --- a/kernel/src/fs/ext2/FileSystem.cpp +++ b/kernel/src/fs/ext2/FileSystem.cpp @@ -57,6 +57,9 @@ namespace Ext2 inode->m_metadata.nlinks = inode->m_raw_inode.nlinks; inode->m_metadata.uid = inode->m_raw_inode.uid; inode->m_metadata.gid = inode->m_raw_inode.gid; + inode->m_metadata.atime = { .tv_sec = inode->m_raw_inode.atime, .tv_nsec = 0 }; + inode->m_metadata.mtime = { .tv_sec = inode->m_raw_inode.mtime, .tv_nsec = 0 }; + inode->m_metadata.ctime = { .tv_sec = inode->m_raw_inode.create_time, .tv_nsec = 0 }; #ifdef EXT2_DEBUG kdbgln("ext2: Read inode %lu with mode %#x (%#x + %#o), size %lu", inum, inode->m_raw_inode.mode, diff --git a/kernel/src/fs/tmpfs/FileSystem.cpp b/kernel/src/fs/tmpfs/FileSystem.cpp index 6dd2a395..e5cec75a 100644 --- a/kernel/src/fs/tmpfs/FileSystem.cpp +++ b/kernel/src/fs/tmpfs/FileSystem.cpp @@ -1,4 +1,5 @@ #include "fs/tmpfs/FileSystem.h" +#include "arch/Timer.h" #include "fs/devices/DeviceRegistry.h" #include "fs/tmpfs/Inode.h" #include @@ -26,6 +27,7 @@ namespace TmpFS inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); inode->m_metadata.mode = mode; + inode->m_metadata.atime = inode->m_metadata.ctime = inode->m_metadata.mtime = *Timer::realtime_clock(); return (SharedPtr)inode; } @@ -35,6 +37,7 @@ namespace TmpFS inode->set_fs(*this, {}); TRY(inode->set_link(link, {})); inode->set_inode_number(m_next_inode_number++, {}); + inode->m_metadata.atime = inode->m_metadata.ctime = inode->m_metadata.mtime = *Timer::realtime_clock(); return (SharedPtr)inode; } @@ -49,6 +52,7 @@ namespace TmpFS inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); inode->m_metadata.mode = mode; + inode->m_metadata.atime = inode->m_metadata.ctime = inode->m_metadata.mtime = *Timer::realtime_clock(); return (SharedPtr)inode; } @@ -65,6 +69,7 @@ namespace TmpFS // device ID atm. inode->set_device_id(luna_dev_makedev(major, minor), {}); inode->m_metadata.mode = mode; + inode->m_metadata.atime = inode->m_metadata.ctime = inode->m_metadata.mtime = *Timer::realtime_clock(); return (SharedPtr)inode; } diff --git a/kernel/src/sys/stat.cpp b/kernel/src/sys/stat.cpp index 9a57db92..cd33fc7a 100644 --- a/kernel/src/sys/stat.cpp +++ b/kernel/src/sys/stat.cpp @@ -48,6 +48,9 @@ Result sys_fstatat(Registers*, SyscallArgs args) kstat.st_size = metadata.size; kstat.st_dev = inode->fs() ? inode->fs()->host_device_id() : 0; kstat.st_rdev = metadata.devid; + kstat.st_atim = metadata.atime; + kstat.st_mtim = metadata.mtime; + kstat.st_ctim = metadata.ctime; if (!MemoryManager::copy_to_user_typed(st, &kstat)) return err(EFAULT); diff --git a/libc/include/bits/struct_stat.h b/libc/include/bits/struct_stat.h index 84b4c2cf..451df158 100644 --- a/libc/include/bits/struct_stat.h +++ b/libc/include/bits/struct_stat.h @@ -3,6 +3,7 @@ #ifndef _BITS_STRUCT_STAT_H #define _BITS_STRUCT_STAT_H +#include #include struct stat @@ -15,10 +16,13 @@ struct stat gid_t st_gid; off_t st_size; dev_t st_rdev; - // FIXME: Actually fill these fields in. - time_t st_atime; - time_t st_mtime; - time_t st_ctime; + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + +#define st_atime st_atim.tv_sec +#define st_mtime st_mtim.tv_sec +#define st_ctime st_ctim.tv_sec }; #endif