fixed an replace issue in rename
This commit is contained in:
parent
5ff046f0fe
commit
0788041ac9
@ -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);
|
||||||
|
@ -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,12 +728,20 @@ 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((new_inode->metadata.permissions & S_IFMT) == S_IFDIR){
|
if(check_replace){
|
||||||
fprintf(stderr,"[%s ,%d] %s/ already exists\n",__func__,__LINE__, name);
|
if((new_inode->metadata.permissions & S_IFMT) == S_IFDIR){
|
||||||
}else{
|
fprintf(stderr,"[%s ,%d] %s/ already exists\n",__func__,__LINE__, name);
|
||||||
fprintf(stderr,"[%s ,%d] %s already exists\n",__func__,__LINE__, name);
|
}else{
|
||||||
}
|
fprintf(stderr,"[%s ,%d] %s already exists\n",__func__,__LINE__, name);
|
||||||
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;
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user