bool filesys_chdir (const char* name) { struct dir* dir = containing_dir(name); char* file_name = get_name(name); struct inode *inode = NULL; if (dir != NULL){ if (strcmp(file_name, "..") == 0){ //Check parent if (!dir_parent(dir, &inode)){ free(file_name); return false; } } else if ((strlen(file_name) == 0 && (dir_is_root(dir))) || (strcmp(file_name, ".") == 0)){ thread_current()->cur_dir = dir; free(file_name); return true; }else{ dir_lookup (dir, file_name, &inode); } } dir_close (dir); free(file_name); dir = dir_open(inode); if (dir) { dir_close(thread_current()->cur_dir); thread_current()->cur_dir = dir; return true; } return false; }
/* Opens the file with the given NAME. Returns the new file if successful or a null pointer otherwise. Fails if no file named NAME exists, or if an internal memory allocation fails. */ struct file * filesys_open (const char *name) { if (strlen(name) == 0) { return NULL; } struct dir *dir = get_containing_dir (name); char* file_name = get_filename (name); struct inode *inode = NULL; if (dir != NULL) { if (strcmp(file_name, "..") == 0) { if (!dir_get_parent(dir, &inode)) { free (file_name); return NULL; } } else if ((dir_is_root(dir) && strlen(file_name) == 0) || strcmp(file_name, ".") == 0) { free (file_name); return (struct file*)dir; } else { dir_lookup(dir, file_name, &inode); } } dir_close (dir); free(file_name); if (!inode) { return NULL; } if (inode_is_dir(inode)) { return (struct file *)dir_open(inode); } return file_open (inode); }
/* changes the current working directory to path */ bool filesys_chdir(const char *path) { struct dir *dir = get_containing_dir(path); char *file_name = get_file_name(path); struct inode *inode = NULL; struct thread *cur = thread_current(); if (dir != NULL) { if(strcmp(file_name, "..") == 0) { if(!dir_get_parent(dir, &inode)) { free(file_name); return false; } } else if(strcmp(file_name, ".") == 0) { cur->cwd = dir; free(file_name); return true; } else if(dir_is_root(dir) && strlen(file_name) == 0) { cur->cwd = dir; free(file_name); return true; } else { dir_lookup (dir, file_name, &inode); } } dir_close(dir); free(file_name); dir = dir_open(inode); if(dir != NULL) { dir_close(cur->cwd); cur->cwd = dir; return true; } return false; }