completed time and utimens

This commit is contained in:
FactorialN 2023-12-02 14:54:38 -08:00
parent 6cd81b2565
commit 5f13524f6a
5 changed files with 40 additions and 4 deletions

View File

@ -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);
};

View File

@ -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;

View File

@ -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;
}

View File

@ -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,

View File

@ -1,4 +1,5 @@
#include "fs.hpp"
#include <time.h>
template <typename T> 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;