completed time and utimens
This commit is contained in:
parent
6cd81b2565
commit
5f13524f6a
@ -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);
|
||||
};
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
@ -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,
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user