make mkdir and mknod return error if file or dir already exists; add tests
This commit is contained in:
parent
5dbac3d9e3
commit
68212773a6
@ -163,6 +163,20 @@ u_int64_t FilesOperation::create_new_inode(u_int64_t parent_inode_number, const
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Check if file or directory already exists
|
||||
char r_buffer[IO_BLOCK_SIZE] = {0};
|
||||
for (u_int64_t idx=0; idx<inode.size; idx++) {
|
||||
read_datablock(inode, idx, r_buffer);
|
||||
DirectoryEntry ent;
|
||||
for(int i=0;i<=IO_BLOCK_SIZE-64;i+=64){
|
||||
ent.deserialize(r_buffer+i);
|
||||
if (strcmp(ent.file_name, name)==0) {
|
||||
printf("Already exists file or directory with name %s, cannot not create\n", name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u_int64_t new_inode_number = 0;
|
||||
|
||||
char rw_buffer[IO_BLOCK_SIZE] = {0};
|
||||
|
@ -29,7 +29,9 @@ int main(int argc, char *argv[]) {
|
||||
u_int64_t f1 = fsop.fischl_mkdir("foo/bar",0);
|
||||
u_int64_t f2 = fsop.fischl_mkdir("/doesnt_exist/bar",0);
|
||||
u_int64_t f3 = fsop.fischl_mkdir("/test/bar",0);
|
||||
// TODO: guard against creating an existing file or diretory, such as fsop.fischl_mkdir("/test",0)
|
||||
u_int64_t f4 = fsop.fischl_mkdir("/test",0);
|
||||
u_int64_t f5 = fsop.fischl_mkdir("/foo/bar",0);
|
||||
u_int64_t f6 = fsop.fischl_mkdir("/foo/bar/..",0);
|
||||
|
||||
// write to files (TODO: fischl_write)
|
||||
// read and write to indirect datablocks are not supported yet
|
||||
@ -102,4 +104,13 @@ int main(int argc, char *argv[]) {
|
||||
assert(inode_number == inode_numbers[i]);
|
||||
}
|
||||
fsop.printDirectory(file_pressure);
|
||||
std::string newprefix = "/pressure/New";
|
||||
for(int i=0;i<700;i+=2){
|
||||
inode_numbers[i] = fsop.fischl_mkdir((newprefix+std::to_string(i)).c_str(), 0);
|
||||
}
|
||||
for(int i=0;i<700;i+=2){
|
||||
u_int64_t inode_number = fsop.namei((newprefix+std::to_string(i)).c_str());
|
||||
assert(inode_number == inode_numbers[i]);
|
||||
}
|
||||
fsop.printDirectory(file_pressure);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user