diff --git a/include/files.h b/include/files.h index 7546845..0c30d23 100644 --- a/include/files.h +++ b/include/files.h @@ -40,4 +40,5 @@ class FilesOperation { int fischl_release (const char *, struct fuse_file_info *);//close file int fischl_write(const char *, const char *, size_t, off_t, struct fuse_file_info *); int fischl_read(const char *, char *, size_t, off_t, struct fuse_file_info *); + int fischl_utimens(const char *path, const struct timespec tv[2], struct fuse_file_info *fi); }; \ No newline at end of file diff --git a/include/fs/fs_data_types.hpp b/include/fs/fs_data_types.hpp index 134db85..9242c0c 100644 --- a/include/fs/fs_data_types.hpp +++ b/include/fs/fs_data_types.hpp @@ -25,12 +25,14 @@ public: u_int64_t inode_num; #define NUMBER_OF_METADATA_BYTES \ - (4 * sizeof(u_int64_t) + (2 * sizeof(u_int32_t))) + (6 * sizeof(u_int64_t) + (2 * sizeof(u_int32_t))) struct INode_MetaData { u_int64_t uid; u_int64_t gid; u_int64_t permissions; u_int64_t size; // not yet implemented + u_int64_t access_time; + u_int64_t modification_time; u_int32_t reference_count; u_int32_t flags; } metadata; diff --git a/lib/files.cpp b/lib/files.cpp index f1e6d9a..796afc4 100644 --- a/lib/files.cpp +++ b/lib/files.cpp @@ -303,6 +303,8 @@ int FilesOperation::fischl_getattr(const char *path, struct stat *stbuf, struct stbuf->st_nlink = 2;//inode.metadata.reference_count; stbuf->st_uid = inode.metadata.uid; stbuf->st_gid = inode.metadata.gid; + stbuf->st_atime = (time_t)(inode.metadata.access_time / 1000000000ULL); + stbuf->st_mtime = (time_t)(inode.metadata.modification_time / 1000000000ULL); stbuf->st_ino = inode.inode_num; } else if(S_ISLNK(inode.metadata.permissions)){ printf("THIS IS GOOD %d %llu\n", inode.metadata.size, inode.inode_num); @@ -310,6 +312,8 @@ int FilesOperation::fischl_getattr(const char *path, struct stat *stbuf, struct stbuf->st_nlink = 1;//inode.metadata.reference_count; stbuf->st_uid = inode.metadata.uid; stbuf->st_gid = inode.metadata.gid; + stbuf->st_atime = (time_t)(inode.metadata.access_time / 1000000000ULL); + stbuf->st_mtime = (time_t)(inode.metadata.modification_time / 1000000000ULL); stbuf->st_size = inode.metadata.size; stbuf->st_ino = inode.inode_num; } else { @@ -317,6 +321,8 @@ int FilesOperation::fischl_getattr(const char *path, struct stat *stbuf, struct stbuf->st_nlink = inode.metadata.reference_count; stbuf->st_uid = inode.metadata.uid; stbuf->st_gid = inode.metadata.gid; + stbuf->st_atime = (time_t)(inode.metadata.access_time / 1000000000ULL); + stbuf->st_mtime = (time_t)(inode.metadata.modification_time / 1000000000ULL); stbuf->st_size = inode.metadata.size; stbuf->st_ino = inode.inode_num; } @@ -624,7 +630,7 @@ int FilesOperation::fischl_readlink(const char* path, char* buf, size_t size){ //char buffer[symlink_inode.metadata.size]; //memset(buffer, 0, sizeof(buffer)); fs->read(&symlink_inode, buf, symlink_inode.metadata.size, 0); - printf("READLINK %d %s\n", symlink_inode.metadata.size, buf); + //printf("READLINK %d %s\n", symlink_inode.metadata.size, buf); /*u_int64_t fh = namei(buffer); if (fh == -1){ return -ENOENT; @@ -946,4 +952,22 @@ int FilesOperation::fischl_read(const char *path, char *buf, size_t size, off_t }*/ return bytes_read; // Return the actual number of bytes read +} + +int FilesOperation::fischl_utimens(const char *path, const struct timespec tv[2], struct fuse_file_info *fi){ + (void) fi; + int res = 0; + u_int64_t fh = namei(path); + + if (fh == -1){ + return -ENOENT; + } + + INode_Data inode; + inode.inode_num = fh; + fs->inode_manager->load_inode(&inode); + inode.metadata.access_time = (u_int64_t)tv[0].tv_sec * 1000000000ULL + tv[0].tv_nsec; + inode.metadata.modification_time = (u_int64_t)tv[1].tv_sec * 1000000000ULL + tv[1].tv_nsec; + fs->inode_manager->save_inode(&inode); + return 0; } \ No newline at end of file diff --git a/lib/fischl.cpp b/lib/fischl.cpp index 38c3931..a760d36 100644 --- a/lib/fischl.cpp +++ b/lib/fischl.cpp @@ -110,7 +110,7 @@ static int fischl_truncate(const char *path, off_t offset, struct fuse_file_info } static int fischl_utimens(const char *path, const struct timespec tv[2], struct fuse_file_info *fi) { - return -1; + return options.fsop->fischl_utimens(path, tv, fi); } static int fischl_open(const char *path, struct fuse_file_info *fi) { @@ -173,7 +173,7 @@ static const struct fuse_operations fischl_oper = { .destroy = fischl_destroy, .access = fischl_access, .create = fischl_create, - //.utimens = fischl_utimens, + .utimens = fischl_utimens, //.bmap = fischl_bmap, //.ioctl = fischl_ioctl, //.poll = fischl_poll, diff --git a/lib/fs/fs_data_types.cpp b/lib/fs/fs_data_types.cpp index 425f910..7680f35 100644 --- a/lib/fs/fs_data_types.cpp +++ b/lib/fs/fs_data_types.cpp @@ -1,4 +1,5 @@ #include "fs.hpp" +#include template T write_int(T num, char buf[]) { size_t i = 0; @@ -50,10 +51,14 @@ void SuperBlock_Data::deserialize(char buf[]) { } INode_Data::INode_Data(u_int64_t inode_num) : inode_num(inode_num) { + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); metadata.uid = -1; metadata.gid = -1; metadata.permissions = -1; metadata.size = 0; + metadata.access_time = (u_int64_t)ts.tv_sec * 1000000000ULL + ts.tv_nsec; + metadata.modification_time = (u_int64_t)ts.tv_sec * 1000000000ULL + ts.tv_nsec; metadata.reference_count = 1; single_indirect_block = double_indirect_block = triple_indirect_block = 0; @@ -68,6 +73,8 @@ size_t INode_Data::serialize_metadata(char buf[]) { i += write_u64(metadata.gid, &buf[i]); i += write_u64(metadata.permissions, &buf[i]); i += write_u64(metadata.size, &buf[i]); + i += write_u64(metadata.access_time, &buf[i]); + i += write_u64(metadata.modification_time, &buf[i]); i += write_u32(metadata.reference_count, &buf[i]); i += write_u32(metadata.flags, &buf[i]); return i; @@ -79,6 +86,8 @@ size_t INode_Data::deserialize_metadata(char buf[]) { i += read_u64(&metadata.gid, &buf[i]); i += read_u64(&metadata.permissions, &buf[i]); i += read_u64(&metadata.size, &buf[i]); + i += read_u64(&metadata.access_time, &buf[i]); + i += read_u64(&metadata.modification_time, &buf[i]); i += read_u32(&metadata.reference_count, &buf[i]); i += read_u32(&metadata.flags, &buf[i]); return i;