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_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_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_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;
|
u_int64_t inode_num;
|
||||||
|
|
||||||
#define NUMBER_OF_METADATA_BYTES \
|
#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 {
|
struct INode_MetaData {
|
||||||
u_int64_t uid;
|
u_int64_t uid;
|
||||||
u_int64_t gid;
|
u_int64_t gid;
|
||||||
u_int64_t permissions;
|
u_int64_t permissions;
|
||||||
u_int64_t size; // not yet implemented
|
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 reference_count;
|
||||||
u_int32_t flags;
|
u_int32_t flags;
|
||||||
} metadata;
|
} 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_nlink = 2;//inode.metadata.reference_count;
|
||||||
stbuf->st_uid = inode.metadata.uid;
|
stbuf->st_uid = inode.metadata.uid;
|
||||||
stbuf->st_gid = inode.metadata.gid;
|
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;
|
stbuf->st_ino = inode.inode_num;
|
||||||
} else if(S_ISLNK(inode.metadata.permissions)){
|
} else if(S_ISLNK(inode.metadata.permissions)){
|
||||||
printf("THIS IS GOOD %d %llu\n", inode.metadata.size, inode.inode_num);
|
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_nlink = 1;//inode.metadata.reference_count;
|
||||||
stbuf->st_uid = inode.metadata.uid;
|
stbuf->st_uid = inode.metadata.uid;
|
||||||
stbuf->st_gid = inode.metadata.gid;
|
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_size = inode.metadata.size;
|
||||||
stbuf->st_ino = inode.inode_num;
|
stbuf->st_ino = inode.inode_num;
|
||||||
} else {
|
} 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_nlink = inode.metadata.reference_count;
|
||||||
stbuf->st_uid = inode.metadata.uid;
|
stbuf->st_uid = inode.metadata.uid;
|
||||||
stbuf->st_gid = inode.metadata.gid;
|
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_size = inode.metadata.size;
|
||||||
stbuf->st_ino = inode.inode_num;
|
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];
|
//char buffer[symlink_inode.metadata.size];
|
||||||
//memset(buffer, 0, sizeof(buffer));
|
//memset(buffer, 0, sizeof(buffer));
|
||||||
fs->read(&symlink_inode, buf, symlink_inode.metadata.size, 0);
|
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);
|
/*u_int64_t fh = namei(buffer);
|
||||||
if (fh == -1){
|
if (fh == -1){
|
||||||
return -ENOENT;
|
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
|
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) {
|
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) {
|
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,
|
.destroy = fischl_destroy,
|
||||||
.access = fischl_access,
|
.access = fischl_access,
|
||||||
.create = fischl_create,
|
.create = fischl_create,
|
||||||
//.utimens = fischl_utimens,
|
.utimens = fischl_utimens,
|
||||||
//.bmap = fischl_bmap,
|
//.bmap = fischl_bmap,
|
||||||
//.ioctl = fischl_ioctl,
|
//.ioctl = fischl_ioctl,
|
||||||
//.poll = fischl_poll,
|
//.poll = fischl_poll,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "fs.hpp"
|
#include "fs.hpp"
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
template <typename T> T write_int(T num, char buf[]) {
|
template <typename T> T write_int(T num, char buf[]) {
|
||||||
size_t i = 0;
|
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) {
|
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.uid = -1;
|
||||||
metadata.gid = -1;
|
metadata.gid = -1;
|
||||||
metadata.permissions = -1;
|
metadata.permissions = -1;
|
||||||
metadata.size = 0;
|
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;
|
metadata.reference_count = 1;
|
||||||
|
|
||||||
single_indirect_block = double_indirect_block = triple_indirect_block = 0;
|
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.gid, &buf[i]);
|
||||||
i += write_u64(metadata.permissions, &buf[i]);
|
i += write_u64(metadata.permissions, &buf[i]);
|
||||||
i += write_u64(metadata.size, &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.reference_count, &buf[i]);
|
||||||
i += write_u32(metadata.flags, &buf[i]);
|
i += write_u32(metadata.flags, &buf[i]);
|
||||||
return 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.gid, &buf[i]);
|
||||||
i += read_u64(&metadata.permissions, &buf[i]);
|
i += read_u64(&metadata.permissions, &buf[i]);
|
||||||
i += read_u64(&metadata.size, &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.reference_count, &buf[i]);
|
||||||
i += read_u32(&metadata.flags, &buf[i]);
|
i += read_u32(&metadata.flags, &buf[i]);
|
||||||
return i;
|
return i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user