fixed an replace issue in rename

This commit is contained in:
FactorialN 2023-12-03 01:39:35 -08:00
parent 5ff046f0fe
commit 0788041ac9
3 changed files with 55 additions and 14 deletions

View File

@ -17,12 +17,13 @@ class FilesOperation {
void printbuffer(const char*,int); void printbuffer(const char*,int);
void printDirectory(u_int64_t); void printDirectory(u_int64_t);
INode_Data* create_new_inode(u_int64_t parent_inode_number, const char* name, mode_t mode); INode_Data* create_new_inode(u_int64_t parent_inode_number, const char* name, mode_t mode);
int insert_inode_to(u_int64_t parent_inode_number, const char* name, INode_Data *new_inode); int insert_inode_to(u_int64_t parent_inode_number, const char* name, INode_Data *new_inode, bool check_replace);
void unlink_inode(u_int64_t inode_number); void unlink_inode(u_int64_t inode_number);
u_int64_t disk_namei(const char* path); u_int64_t disk_namei(const char* path);
u_int64_t namei(const char* path); u_int64_t namei(const char* path);
int fischl_mkdir(const char*, mode_t); int fischl_mkdir(const char*, mode_t);
int fischl_mknod(const char*, mode_t, dev_t);//for special file int fischl_mknod(const char*, mode_t, dev_t);//for special file
int fischl_access(const char* path, int mask);
int fischl_create(const char *, mode_t, struct fuse_file_info *);//for regular file int fischl_create(const char *, mode_t, struct fuse_file_info *);//for regular file
int fischl_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi); int fischl_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi);
int fischl_readdir(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *, enum fuse_readdir_flags); int fischl_readdir(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *, enum fuse_readdir_flags);

View File

@ -190,6 +190,40 @@ u_int64_t FilesOperation::namei(const char* path) {
else return -1; else return -1;
} }
int FilesOperation::fischl_access(const char* path, int mask) {
int res = 0;
u_int64_t fh = namei(path);
if (fh == -1){
return -ENOENT;
}
INode_Data inode;
inode.inode_num = fh;
inode.metadata.permissions = -1;
printf("ACCESS %d %d\n", mask, inode.metadata.permissions);
mode_t per = inode.metadata.permissions;
fs->inode_manager->load_inode(&inode);
if ((mask & R_OK) && !(per & S_IRUSR)) {
printf("DENIED R %d %d\n", (mask & R_OK), (per& S_IRUSR));
return -EACCES; // Permission denied for reading
}
if ((mask & W_OK) && !(per & S_IWUSR)) {
printf("DENIED W %d %d\n", (mask & W_OK), (per & S_IWUSR));
return -EACCES; // Permission denied for writing
}
if ((mask & X_OK) && !(per & S_IXUSR)) {
printf("DENIED X %d %d %d %d\n", (mask & X_OK), (per & S_IXUSR), per, S_IXUSR);
return -EACCES; // Permission denied for executing
}/**/
// return 0 when access is allowed
return 0;
}
int FilesOperation::fischl_mkdir(const char* path, mode_t mode) { int FilesOperation::fischl_mkdir(const char* path, mode_t mode) {
//check path //check path
char *pathdup = strdup(path); char *pathdup = strdup(path);
@ -290,9 +324,9 @@ int FilesOperation::fischl_getattr(const char *path, struct stat *stbuf, struct
stbuf->st_gid = inode.metadata.gid; stbuf->st_gid = inode.metadata.gid;
stbuf->st_atime = (time_t)(inode.metadata.access_time / 1000000000ULL); stbuf->st_atime = (time_t)(inode.metadata.access_time / 1000000000ULL);
stbuf->st_mtime = (time_t)(inode.metadata.modification_time / 1000000000ULL); stbuf->st_mtime = (time_t)(inode.metadata.modification_time / 1000000000ULL);
stbuf->st_size = IO_BLOCK_SIZE;
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);
stbuf->st_mode = S_IFLNK; stbuf->st_mode = S_IFLNK;
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;
@ -672,7 +706,7 @@ int FilesOperation::fischl_symlink(const char* to, const char* from){
return 0;//SUCESS return 0;//SUCESS
} }
int FilesOperation::insert_inode_to(u_int64_t parent_inode_number, const char* name, INode_Data *new_inode) { int FilesOperation::insert_inode_to(u_int64_t parent_inode_number, const char* name, INode_Data *new_inode, bool check_replace) {
// trys to create a file under parent directory // trys to create a file under parent directory
if (strlen(name)>=256) { if (strlen(name)>=256) {
perror("Name too long, cannot create file or directory"); perror("Name too long, cannot create file or directory");
@ -694,6 +728,7 @@ int FilesOperation::insert_inode_to(u_int64_t parent_inode_number, const char* n
for(int i=0;i<=IO_BLOCK_SIZE-264;i+=264){ for(int i=0;i<=IO_BLOCK_SIZE-264;i+=264){
ent.deserialize(r_buffer+i); ent.deserialize(r_buffer+i);
if (strcmp(ent.file_name, name)==0 && ent.inode_number != 0) { if (strcmp(ent.file_name, name)==0 && ent.inode_number != 0) {
if(check_replace){
if((new_inode->metadata.permissions & S_IFMT) == S_IFDIR){ if((new_inode->metadata.permissions & S_IFMT) == S_IFDIR){
fprintf(stderr,"[%s ,%d] %s/ already exists\n",__func__,__LINE__, name); fprintf(stderr,"[%s ,%d] %s/ already exists\n",__func__,__LINE__, name);
}else{ }else{
@ -701,6 +736,13 @@ int FilesOperation::insert_inode_to(u_int64_t parent_inode_number, const char* n
} }
return -1; return -1;
} }
else{
ent.inode_number = new_inode->inode_num;
ent.serialize(r_buffer+i);
fs->write(&inode, r_buffer, IO_BLOCK_SIZE, idx*IO_BLOCK_SIZE);
return 0;
}
}
} }
} }
@ -763,7 +805,7 @@ int FilesOperation::fischl_link(const char* from, const char* to){
} }
u_int64_t parent_inode_number = parent_filenode->inode_number; u_int64_t parent_inode_number = parent_filenode->inode_number;
if(insert_inode_to(parent_inode_number, newFilename, &ret)<0){ if(insert_inode_to(parent_inode_number, newFilename, &ret, true)<0){
return -1; return -1;
} }
@ -901,7 +943,7 @@ int FilesOperation::fischl_rename(const char *old_path, const char *new_path, un
INode_Data ret; INode_Data ret;
ret.inode_num = rename_info.oldFileNode->inode_number; ret.inode_num = rename_info.oldFileNode->inode_number;
fs->inode_manager->load_inode(&ret); fs->inode_manager->load_inode(&ret);
if(insert_inode_to(rename_info.newParentNode->inode_number, rename_info.newName, &ret)<0){ if(insert_inode_to(rename_info.newParentNode->inode_number, rename_info.newName, &ret, false)<0){
return -1; return -1;
} }
bool change_flag = false; bool change_flag = false;

View File

@ -51,9 +51,7 @@ static int fischl_getattr(const char *path, struct stat *stbuf, struct fuse_file
} }
static int fischl_access(const char* path, int mask) { static int fischl_access(const char* path, int mask) {
return options.fsop->fischl_access(path, mask);
// return 0 when access is allowed
return 0;
} }
static int fischl_readlink(const char* path, char* buf, size_t size) { static int fischl_readlink(const char* path, char* buf, size_t size) {