From 27bdbf1c9d6eac648c5a51e953e60224c80a519b Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Thu, 16 May 2013 17:58:16 +0200 Subject: [PATCH] Add utimens support to inodes. --- sortix/descriptor.cpp | 6 +++-- sortix/fs/kram.cpp | 30 ++++++++++++++++------- sortix/fs/user.cpp | 14 ++++++++--- sortix/include/sortix/kernel/descriptor.h | 3 ++- sortix/include/sortix/kernel/inode.h | 8 ++++-- sortix/include/sortix/kernel/vnode.h | 3 ++- sortix/inode.cpp | 22 +++++++++++------ sortix/io.cpp | 4 +-- sortix/vnode.cpp | 6 +++-- 9 files changed, 66 insertions(+), 30 deletions(-) diff --git a/sortix/descriptor.cpp b/sortix/descriptor.cpp index 2c15fb35..ca1a4f33 100644 --- a/sortix/descriptor.cpp +++ b/sortix/descriptor.cpp @@ -271,9 +271,11 @@ ssize_t Descriptor::pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t return vnode->pwrite(ctx, buf, count, off); } -int Descriptor::utimens(ioctx_t* ctx, const struct timespec times[2]) +int Descriptor::utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, + const struct timespec* mtime) { - return vnode->utimens(ctx, times); + return vnode->utimens(ctx, atime, ctime, mtime); } int Descriptor::isatty(ioctx_t* ctx) diff --git a/sortix/fs/kram.cpp b/sortix/fs/kram.cpp index f4908f19..fe7eb9f8 100644 --- a/sortix/fs/kram.cpp +++ b/sortix/fs/kram.cpp @@ -22,21 +22,31 @@ *******************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include + +#include #include #include -#include #include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include + #include "kram.h" namespace Sortix { @@ -70,6 +80,7 @@ int File::truncate(ioctx_t* ctx, off_t length) { ScopedLock lock(&metalock); stat_size = fcache.GetFileSize(); + stat_mtim = Time::Get(CLOCK_REALTIME); } return ret; } @@ -91,6 +102,7 @@ ssize_t File::pwrite(ioctx_t* ctx, const uint8_t* src, size_t count, off_t off) { ScopedLock lock(&metalock); stat_size = fcache.GetFileSize(); + stat_mtim = Time::Get(CLOCK_REALTIME); } return ret; } diff --git a/sortix/fs/user.cpp b/sortix/fs/user.cpp index ba715014..bec77d4c 100644 --- a/sortix/fs/user.cpp +++ b/sortix/fs/user.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -193,7 +194,9 @@ public: virtual ssize_t write(ioctx_t* ctx, const uint8_t* buf, size_t count); virtual ssize_t pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off); - virtual int utimens(ioctx_t* ctx, const struct timespec times[2]); + virtual int utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, + const struct timespec* mtime); virtual int isatty(ioctx_t* ctx); virtual ssize_t readdirents(ioctx_t* ctx, struct kernel_dirent* dirent, size_t size, off_t start, size_t maxcount); @@ -840,7 +843,10 @@ ssize_t Unode::pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off) return ret; } -int Unode::utimens(ioctx_t* /*ctx*/, const struct timespec times[2]) +int Unode::utimens(ioctx_t* /*ctx*/, + const struct timespec* atime, + const struct timespec* /*ctime*/, + const struct timespec* mtime) { Channel* channel = server->Connect(); if ( !channel ) @@ -848,8 +854,8 @@ int Unode::utimens(ioctx_t* /*ctx*/, const struct timespec times[2]) int ret = -1; struct fsm_req_utimens msg; msg.ino = ino; - msg.times[0] = times[0]; - msg.times[1] = times[1]; + msg.times[0] = atime ? *atime : timespec_nul(); + msg.times[1] = mtime ? *mtime : timespec_nul(); if ( SendMessage(channel, FSM_REQ_UTIMENS, &msg, sizeof(msg)) && RecvMessage(channel, FSM_RESP_SUCCESS, NULL, 0) ) ret = 0; diff --git a/sortix/include/sortix/kernel/descriptor.h b/sortix/include/sortix/kernel/descriptor.h index 1bf49a3a..ef60ed5f 100644 --- a/sortix/include/sortix/kernel/descriptor.h +++ b/sortix/include/sortix/kernel/descriptor.h @@ -64,7 +64,8 @@ public: ssize_t pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t off); ssize_t write(ioctx_t* ctx, const uint8_t* buf, size_t count); ssize_t pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off); - int utimens(ioctx_t* ctx, const struct timespec timespec[2]); + int utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, const struct timespec* mtime); int isatty(ioctx_t* ctx); ssize_t readdirents(ioctx_t* ctx, struct kernel_dirent* dirent, size_t size, size_t maxcount); diff --git a/sortix/include/sortix/kernel/inode.h b/sortix/include/sortix/kernel/inode.h index 519c287c..09a1296e 100644 --- a/sortix/include/sortix/kernel/inode.h +++ b/sortix/include/sortix/kernel/inode.h @@ -68,7 +68,9 @@ public: virtual ssize_t write(ioctx_t* ctx, const uint8_t* buf, size_t count) = 0; virtual ssize_t pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off) = 0; - virtual int utimens(ioctx_t* ctx, const struct timespec timespec[2]) = 0; + virtual int utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, + const struct timespec* mtime) = 0; virtual int isatty(ioctx_t* ctx) = 0; virtual ssize_t readdirents(ioctx_t* ctx, struct kernel_dirent* dirent, size_t size, off_t start, size_t maxcount) = 0; @@ -142,7 +144,9 @@ public: virtual ssize_t write(ioctx_t* ctx, const uint8_t* buf, size_t count); virtual ssize_t pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off); - virtual int utimens(ioctx_t* ctx, const struct timespec timespec[2]); + virtual int utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, + const struct timespec* mtime); virtual int isatty(ioctx_t* ctx); virtual ssize_t readdirents(ioctx_t* ctx, struct kernel_dirent* dirent, size_t size, off_t start, size_t maxcount); diff --git a/sortix/include/sortix/kernel/vnode.h b/sortix/include/sortix/kernel/vnode.h index ceb5cd8e..de586ef2 100644 --- a/sortix/include/sortix/kernel/vnode.h +++ b/sortix/include/sortix/kernel/vnode.h @@ -61,7 +61,8 @@ public: ssize_t pread(ioctx_t* ctx, uint8_t* buf, size_t count, off_t off); ssize_t write(ioctx_t* ctx, const uint8_t* buf, size_t count); ssize_t pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off); - int utimens(ioctx_t* ctx, const struct timespec timespec[2]); + int utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, const struct timespec* mtime); int isatty(ioctx_t* ctx); ssize_t readdirents(ioctx_t* ctx, struct kernel_dirent* dirent, size_t size, off_t start, size_t maxcount); diff --git a/sortix/inode.cpp b/sortix/inode.cpp index 92cf52ab..33c9149c 100644 --- a/sortix/inode.cpp +++ b/sortix/inode.cpp @@ -24,8 +24,8 @@ #include #include -#include +#include #include #include @@ -34,6 +34,7 @@ #include #include #include +#include namespace Sortix { @@ -46,9 +47,9 @@ AbstractInode::AbstractInode() stat_uid = 0; stat_gid = 0; stat_size = 0; - stat_atim = timespec_nul(); - stat_ctim = timespec_nul(); - stat_mtim = timespec_nul(); + stat_atim = Time::Get(CLOCK_REALTIME); + stat_ctim = Time::Get(CLOCK_REALTIME); + stat_mtim = Time::Get(CLOCK_REALTIME); stat_blksize = 0; stat_blocks = 0; } @@ -152,10 +153,17 @@ ssize_t AbstractInode::pwrite(ioctx_t* /*ctx*/, const uint8_t* /*buf*/, return errno = EBADF, -1; } - -int AbstractInode::utimens(ioctx_t* /*ctx*/, const struct timespec /*times*/[2]) +int AbstractInode::utimens(ioctx_t* /*ctx*/, const struct timespec* atime, + const struct timespec* ctime, + const struct timespec* mtime) { - // TODO: Implement this! + ScopedLock lock(&metalock); + if ( atime ) + stat_atim = *atime; + if ( ctime ) + stat_ctim = *ctime; + if ( mtime ) + stat_mtim = *mtime; return 0; } diff --git a/sortix/io.cpp b/sortix/io.cpp index 25a4e972..e189d016 100644 --- a/sortix/io.cpp +++ b/sortix/io.cpp @@ -461,7 +461,7 @@ static int sys_futimens(int fd, const struct timespec user_times[2]) if ( !desc ) return -1; ioctx_t ctx; SetupUserIOCtx(&ctx); - return desc->utimens(&ctx, times); + return desc->utimens(&ctx, ×[0], NULL, ×[1]); } static int sys_utimensat(int dirfd, const char* path, @@ -484,7 +484,7 @@ static int sys_utimensat(int dirfd, const char* path, delete[] pathcopy; if ( !desc ) return -1; - return desc->utimens(&ctx, times); + return desc->utimens(&ctx, ×[0], NULL, ×[1]); } static int sys_linkat(int olddirfd, const char* oldpath, diff --git a/sortix/vnode.cpp b/sortix/vnode.cpp index fef23370..20e3a8f5 100644 --- a/sortix/vnode.cpp +++ b/sortix/vnode.cpp @@ -144,9 +144,11 @@ ssize_t Vnode::pwrite(ioctx_t* ctx, const uint8_t* buf, size_t count, off_t off) return inode->pwrite(ctx, buf, count, off); } -int Vnode::utimens(ioctx_t* ctx, const struct timespec times[2]) +int Vnode::utimens(ioctx_t* ctx, const struct timespec* atime, + const struct timespec* ctime, + const struct timespec* mtime) { - return inode->utimens(ctx, times); + return inode->utimens(ctx, atime, ctime, mtime); } int Vnode::isatty(ioctx_t* ctx)