SYSCALL_DEFINE1(chdir, const char*, path) { path = (const char*)user_to_kernel_check((uint32_t)path, MAX_PATH_SIZE, 0); int r; struct dirent *dirent; r = dirent_find(path, -1, &dirent); if (r < 0) return SYSCALL_RETURN(r); task_curr->fs.pwd = dirent; return SYSCALL_RETURN(0); }
int32 TFFS_fopen( IN tffs_handle_t hfs, IN byte * file_path, IN byte * open_mode, OUT tfile_handle_t * phfile) { int32 ret; tffs_t * ptffs = (tffs_t *)hfs; byte * fname, * path; byte * dup_file_path; tfile_t * pfile; tdir_t * pdir; tdir_entry_t * pdir_entry; if (!hfs || !file_path || !open_mode || !phfile) return ERR_TFFS_INVALID_PARAM; ret = TFFS_OK; pfile = (tfile_t *)Malloc(sizeof(tfile_t)); dup_file_path = dup_string(file_path); pdir_entry = dirent_malloc(); fname = (byte *)Malloc(DNAME_MAX); pfile->secbuf = (ubyte *)Malloc(ptffs->pbs->byts_per_sec); Memset(pfile->secbuf, 0, ptffs->pbs->byts_per_sec); path = dup_file_path; if (!divide_path(dup_file_path, fname)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if (!_parse_open_mode(open_mode, &pfile->open_mode)) { ret = ERR_TFFS_INVALID_OPENMODE; goto _release; } if ((dir_init(ptffs, path, &pdir)) != DIR_OK) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if (dirent_find(pdir, fname, pdir_entry) != DIRENTRY_OK) { DBG("%s(): can't find file [%s] at [%s]\n", __FUNCTION__, fname, path); if (pfile->open_mode == OPENMODE_READONLY) { ret = ERR_TFFS_FILE_NOT_EXIST; goto _release; } if (!dirent_init(fname, 0, TRUE, pdir_entry)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((ret = dir_append_direntry(pdir, pdir_entry)) != DIR_OK) { if (ret == ERR_DIR_NO_FREE_SPACE) { ret = ERR_TFFS_NO_FREE_SPACE; } else { ret = ERR_TFFS_DEVICE_FAIL; } goto _release; } } ret = _initialize_file(ptffs, pdir, pdir_entry, pfile); if (ret == FILE_OK) { *phfile = (tfile_handle_t)pfile; } _release: Free(fname); Free(dup_file_path); return ret; }
int32 TFFS_rmfile( IN tffs_handle_t hfs, IN byte * file_path) { int32 ret; byte * fname, * path; byte * dup_file_path; tdir_t * pdir; tffs_t * ptffs; tdir_entry_t * pdir_entry; ret = TFFS_OK; if (!hfs || !file_path) return ERR_TFFS_INVALID_PARAM; ptffs = (tffs_t *)hfs; dup_file_path = dup_string(file_path); fname = (byte *)Malloc(DNAME_MAX); pdir_entry = dirent_malloc(); path = dup_file_path; if (!divide_path(dup_file_path, fname)) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((dir_init(ptffs, path, &pdir)) != DIR_OK) { ret = ERR_TFFS_INVALID_PATH; goto _release; } if ((ret = dirent_find(pdir, fname, pdir_entry)) == DIRENTRY_OK) { if (dirent_get_dir_attr(pdir_entry) & ATTR_DIRECTORY) { ret = ERR_TFFS_IS_NOT_A_FILE; goto _release; } if (dir_del_direntry(pdir, fname) != DIR_OK) { ret = ERR_TFFS_REMOVE_FILE_FAIL; goto _release; } if (fat_free_clus(pdir->ptffs->pfat, dirent_get_clus(pdir_entry)) != FAT_OK) { ret = ERR_TFFS_REMOVE_FILE_FAIL; goto _release; } ret = TFFS_OK; } else { ret = ERR_TFFS_NO_SUCH_FILE; goto _release; } _release: Free(fname); Free(dup_file_path); dirent_release(pdir_entry); dir_destroy(pdir); return ret; }