rm命令为remove files or directories的简写,它与mkdir相反,功能为删除文件/文件夹。同样,rm命令也只能在可写入的文件/目录上执行。实现如下:
session = malloc(sizeof(s_session)); session->current_path = malloc(SHELL_CMD_LEN); int params[2]; params[0] = 7; params[1] = (int) session; __asm__ volatile("int $0x80" :: "a"(params)); u8 flag = 0x0; char *path = malloc(0x200); for (int i = 1; i < argc; i++) { if (args[i][0] == '-') { for (int j = 1; j < str_len(args[i]); j++) { if (args[i][j] == 'r') { //递归删除,通指删除文件夹 flag |= (0x1 << 0); } else if (args[i][j] == 'f') { //强制删除,通指只读文件或文件夹 flag |= (0x1 << 1); } } } else { str_copy(args[i], path); } } if (str_len(path) > 0) { char *full_path = malloc(SHELL_CMD_LEN); full_path[0] = '\0'; if (path[0] == '/') { repath(path, NULL, full_path); } //不是以'/'开头: 相对路径 else { repath(path, session->current_path, full_path); } FILE *fp = fopen(full_path, FS_MODE_READ); if (fp != NULL) { fclose(fp); del_file(full_path); return 0; } fclose(fp); int len = str_len(full_path); if (full_path[len - 1] != '/') { full_path[len] = '/'; full_path[len + 1] = '\0'; } s_fs *fs_work = malloc(sizeof(s_fs)); u32 dev_id = 0; int status = fs_find_path_by_user(full_path, session->uid, session->gid, &dev_id, fs_work); if (status == FS_STATUS_NO_FILE_DIR) { printf("-bash: \"%s\": no such file or directory.\n", path); } else if (status == FS_STATUS_NO_PERMISSION) { printf("-bash: \"%s\": permission denied.\n", path); } else { if ((flag >> 0) & 0x1 == 1) { del_dir(full_path); } else { printf("rm: cannot remove \"%s\": is a directory.\n", path); } } free(fs_work); free(full_path); } free(path); free(session->current_path); free(session);
运行结果:
源代码的下载地址为:
https https://github.com/magicworldos/lidqos.git git git@github.com:magicworldos/lidqos.git subverion https://github.com/magicworldos/lidqos branch v0.30
Copyright © 2015-2023 问渠网 辽ICP备15013245号