diff --git a/src/disk.c b/src/disk.c index a1f8b5e..7617b69 100644 --- a/src/disk.c +++ b/src/disk.c @@ -297,6 +297,22 @@ int create_directory(disk *disk, inode *parent, char *dirname) { return new_idx; } +int check_if_name_is_already_taken(char* name, int dir_index, disk* d) { + if (dir_index < 0 || dir_index >= MAX_INODE) + return -1; + + int bloc = d->inodes[dir_index].blocs[0]; + char buff[MAX_INODE_NAME]; + + for (int i = 0; i < MAX_BYTES_PER_BLOC; i+= MAX_INODE_NAME + sizeof(int)) { + strncpy(buff, &d->blocs[bloc].datas[i], MAX_INODE_NAME); + if (strcmp(buff, name) == 0) { + return 1; + } + } + return 0; +} + int do_touch(disk *d, char *filepath) { char *parent_path; char *dirname; @@ -327,6 +343,11 @@ int do_touch(disk *d, char *filepath) { token = strtok(NULL, "/"); } + if (check_if_name_is_already_taken(dirname, dir_index, d)) { + dprintf(STDERR_FILENO, "touch: name '%s' is already taken \n", dirname); + return -1; + } + create_file(d, &d->inodes[dir_index], dirname); return 0; } @@ -361,6 +382,11 @@ int do_mkdir(disk *d, char *dirpath) { token = strtok(NULL, "/"); } + if (check_if_name_is_already_taken(dirname, dir_index, d)) { + dprintf(STDERR_FILENO, "mkdir: name '%s' is already taken \n", dirname); + return -1; + } + create_directory(d, &d->inodes[dir_index], dirname); return 0;