add: rmdir
This commit is contained in:
parent
15ff8e5b23
commit
5b67775c82
100
src/disk.c
100
src/disk.c
@ -49,6 +49,26 @@ int find_offset_in_parent_bloc(bloc *parent_bloc) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int is_dir_empty(disk *d, int bloc_index) {
|
||||||
|
for (int i = 0; i < MAX_BYTES_PER_BLOC; i+= MAX_INODE_NAME + sizeof(int)) {
|
||||||
|
char name[MAX_INODE_NAME];
|
||||||
|
strncpy(name, &d->blocs[bloc_index].datas[i], MAX_INODE_NAME);
|
||||||
|
if (strcmp(name, "..") != 0 && strcmp(name, ".") != 0 && name[0] != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_file_empty(disk *d, int bloc_index) {
|
||||||
|
for (int i = 0; i < MAX_BYTES_PER_BLOC; i++) {
|
||||||
|
if (d->blocs[bloc_index].datas[i] != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int allocate_node(disk *disk, inode *parent, char *name, char type) {
|
int allocate_node(disk *disk, inode *parent, char *name, char type) {
|
||||||
int inode_index = 0;
|
int inode_index = 0;
|
||||||
while (inode_index < MAX_INODE &&
|
while (inode_index < MAX_INODE &&
|
||||||
@ -82,7 +102,7 @@ int allocate_node(disk *disk, inode *parent, char *name, char type) {
|
|||||||
return inode_index;
|
return inode_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int remove_file(disk *disk, inode *parent, inode *inode_to_remove,
|
int remove_inode(disk *disk, inode *parent, inode *inode_to_remove,
|
||||||
int inode_to_remove_idx) {
|
int inode_to_remove_idx) {
|
||||||
|
|
||||||
if (parent == inode_to_remove) {
|
if (parent == inode_to_remove) {
|
||||||
@ -96,7 +116,7 @@ int remove_file(disk *disk, inode *parent, inode *inode_to_remove,
|
|||||||
|
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
// on efface la référence du fichier dans son parent
|
// on efface la référence de l'inode dans son parent
|
||||||
for (int i = 0; i < MAX_BYTES_PER_BLOC && !found;
|
for (int i = 0; i < MAX_BYTES_PER_BLOC && !found;
|
||||||
i += MAX_INODE_NAME + sizeof(int)) {
|
i += MAX_INODE_NAME + sizeof(int)) {
|
||||||
if (*(int *)&disk->blocs[parent_bloc_idx].datas[i + MAX_INODE_NAME] ==
|
if (*(int *)&disk->blocs[parent_bloc_idx].datas[i + MAX_INODE_NAME] ==
|
||||||
@ -107,7 +127,7 @@ int remove_file(disk *disk, inode *parent, inode *inode_to_remove,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// on efface tout le contenu du fichier
|
// on efface tout le contenu de l'inode
|
||||||
int bloc_inode_idx = inode_to_remove->blocs[0];
|
int bloc_inode_idx = inode_to_remove->blocs[0];
|
||||||
memset(&disk->blocs[bloc_inode_idx].datas[0], 0, MAX_BYTES_PER_BLOC);
|
memset(&disk->blocs[bloc_inode_idx].datas[0], 0, MAX_BYTES_PER_BLOC);
|
||||||
|
|
||||||
@ -119,6 +139,68 @@ int remove_file(disk *disk, inode *parent, inode *inode_to_remove,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int do_rmdir(disk *disk, char *filepath) {
|
||||||
|
char *parent_path = NULL;
|
||||||
|
char *dirname = NULL;
|
||||||
|
|
||||||
|
if (get_dirname_and_parent_path_by_absolute_path(filepath, &parent_path, &dirname) == -1) {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: path error\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parent_index = 0;
|
||||||
|
char *token = strtok(parent_path, "/");
|
||||||
|
|
||||||
|
while (token != NULL) {
|
||||||
|
parent_index = find_dir_inode_by_name(token, parent_index, disk);
|
||||||
|
|
||||||
|
if (parent_index == -1) {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: path '%s' does not exist\n", token);
|
||||||
|
free(parent_path); free(dirname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disk->inodes[parent_index].filetype != TYPE_DIRECTORY) {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: '%s' is not a directory\n", token);
|
||||||
|
free(parent_path); free(dirname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
token = strtok(NULL, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_index = find_dir_inode_by_name(dirname, parent_index, disk);
|
||||||
|
|
||||||
|
if (file_index == -1) {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: can't delete '%s': no such directory\n", dirname);
|
||||||
|
free(parent_path); free(dirname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disk->inodes[file_index].filetype != TYPE_DIRECTORY) {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: can't delete '%s': not a directory\n", dirname);
|
||||||
|
free(parent_path); free(dirname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(is_dir_empty(disk, disk->inodes[file_index].blocs[0]) == 1)) {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: directory not empty\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int res = remove_inode(disk, &disk->inodes[parent_index], &disk->inodes[file_index], file_index);
|
||||||
|
|
||||||
|
if (res == 1) {
|
||||||
|
} else {
|
||||||
|
dprintf(STDERR_FILENO, "rmdir: can't delete because of a fatal error\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(parent_path);
|
||||||
|
free(dirname);
|
||||||
|
|
||||||
|
return (res == 1) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
int do_rm(disk *disk, char *filepath) {
|
int do_rm(disk *disk, char *filepath) {
|
||||||
char *parent_path = NULL;
|
char *parent_path = NULL;
|
||||||
char *dirname = NULL;
|
char *dirname = NULL;
|
||||||
@ -135,13 +217,13 @@ int do_rm(disk *disk, char *filepath) {
|
|||||||
parent_index = find_dir_inode_by_name(token, parent_index, disk);
|
parent_index = find_dir_inode_by_name(token, parent_index, disk);
|
||||||
|
|
||||||
if (parent_index == -1) {
|
if (parent_index == -1) {
|
||||||
dprintf(STDERR_FILENO, "rm: le chemin '%s' n'existe pas\n", token);
|
dprintf(STDERR_FILENO, "rm: path '%s' does not exist\n", token);
|
||||||
free(parent_path); free(dirname);
|
free(parent_path); free(dirname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disk->inodes[parent_index].filetype != TYPE_DIRECTORY) {
|
if (disk->inodes[parent_index].filetype != TYPE_DIRECTORY) {
|
||||||
dprintf(STDERR_FILENO, "rm: '%s' n'est pas un dossier\n", token);
|
dprintf(STDERR_FILENO, "rm: '%s' is not a directory\n", token);
|
||||||
free(parent_path); free(dirname);
|
free(parent_path); free(dirname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -152,23 +234,23 @@ int do_rm(disk *disk, char *filepath) {
|
|||||||
int file_index = find_dir_inode_by_name(dirname, parent_index, disk);
|
int file_index = find_dir_inode_by_name(dirname, parent_index, disk);
|
||||||
|
|
||||||
if (file_index == -1) {
|
if (file_index == -1) {
|
||||||
dprintf(STDERR_FILENO, "rm: impossible de supprimer '%s': Aucun fichier de ce nom\n", dirname);
|
dprintf(STDERR_FILENO, "rm: can't delete '%s': no such file\n", dirname);
|
||||||
free(parent_path); free(dirname);
|
free(parent_path); free(dirname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disk->inodes[file_index].filetype != TYPE_FILE &&
|
if (disk->inodes[file_index].filetype != TYPE_FILE &&
|
||||||
disk->inodes[file_index].filetype != TYPE_SYMBOLIC_LINK) {
|
disk->inodes[file_index].filetype != TYPE_SYMBOLIC_LINK) {
|
||||||
dprintf(STDERR_FILENO, "rm: impossible de supprimer '%s': est un dossier\n", dirname);
|
dprintf(STDERR_FILENO, "rm: can't delete '%s': not a file\n", dirname);
|
||||||
free(parent_path); free(dirname);
|
free(parent_path); free(dirname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = remove_file(disk, &disk->inodes[parent_index], &disk->inodes[file_index], file_index);
|
int res = remove_inode(disk, &disk->inodes[parent_index], &disk->inodes[file_index], file_index);
|
||||||
|
|
||||||
if (res == 1) {
|
if (res == 1) {
|
||||||
} else {
|
} else {
|
||||||
dprintf(STDERR_FILENO, "rm: erreur fatale lors de la suppression en mémoire\n");
|
dprintf(STDERR_FILENO, "rm: can't delete because of a fatal error\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
free(parent_path);
|
free(parent_path);
|
||||||
|
|||||||
@ -19,5 +19,6 @@ int do_touch(disk *d, char *filepath);
|
|||||||
int do_mkdir(disk* d, char *dirpath);
|
int do_mkdir(disk* d, char *dirpath);
|
||||||
int do_df(disk *d);
|
int do_df(disk *d);
|
||||||
int do_rm(disk *disk, char *filepath);
|
int do_rm(disk *disk, char *filepath);
|
||||||
|
int do_rmdir(disk *disk, char *filepath);
|
||||||
int find_dir_inode_by_name(char *name, int dir_index, disk *d);
|
int find_dir_inode_by_name(char *name, int dir_index, disk *d);
|
||||||
void persist_on_disk(disk* d);
|
void persist_on_disk(disk* d);
|
||||||
@ -100,6 +100,8 @@ int child_process_job(disk *d, char **args) {
|
|||||||
do_df(d);
|
do_df(d);
|
||||||
} else if (strcmp("rm", args[0]) == 0) {
|
} else if (strcmp("rm", args[0]) == 0) {
|
||||||
do_rm(d, args[1]);
|
do_rm(d, args[1]);
|
||||||
|
} else if (strcmp("rmdir", args[0]) == 0) {
|
||||||
|
do_rmdir(d, args[1]);
|
||||||
} else {
|
} else {
|
||||||
dprintf(STDERR_FILENO, "%s: no such command\n", args[0]);
|
dprintf(STDERR_FILENO, "%s: no such command\n", args[0]);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user