int vfs_getfree(char *filesystem) { fs_t *fs = NULL; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; semaphore_P(vfs_table.sem); fs = vfs_get_filesystem(filesystem); if(fs == NULL) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } ret = fs->getfree(fs); semaphore_V(vfs_table.sem); vfs_end_op(); return ret; }
int vfs_file(char *pathname, int idx, char *buffer) { char volumename[VFS_NAME_LENGTH]; char dirname[VFS_NAME_LENGTH]; fs_t *fs = NULL; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if (vfs_parse_pathname(pathname, volumename, dirname) != VFS_OK) { vfs_end_op(); return VFS_ERROR; } semaphore_P(vfs_table.sem); fs = vfs_get_filesystem(volumename); if(fs == NULL) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } ret = fs->file(fs, dirname, idx, buffer); semaphore_V(vfs_table.sem); vfs_end_op(); return ret; }
int vfs_create(char *pathname, int size) { char volumename[VFS_NAME_LENGTH]; char filename[VFS_NAME_LENGTH]; fs_t *fs = NULL; int ret; KERNEL_ASSERT(size >= 0); if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if(vfs_parse_pathname(pathname, volumename, filename) != VFS_OK) { vfs_end_op(); return VFS_ERROR; } semaphore_P(vfs_table.sem); fs = vfs_get_filesystem(volumename); if(fs == NULL) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } ret = fs->create(fs, filename, size); semaphore_V(vfs_table.sem); vfs_end_op(); return ret; }
/** * Removes given file from filesystem. * * @param pathname Full name of the file, including mountpoint. * * @return VFS_OK on success, negative (VFS_*) on failure. * */ int vfs_remove(const char *pathname) { char volumename[VFS_NAME_LENGTH]; char filename[VFS_NAME_LENGTH]; fs_t *fs = NULL; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if (vfs_parse_pathname(pathname, volumename, filename) != VFS_OK) { vfs_end_op(); return VFS_INVALID_PARAMS; } semaphore_P(vfs_table.sem); fs = vfs_get_filesystem(volumename); if(fs == NULL) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } ret = fs->remove(fs, filename); semaphore_V(vfs_table.sem); vfs_end_op(); return ret; }
int vfs_file(char *pathname, int idx, char *buffer) { char volumename[VFS_NAME_LENGTH]; char dirname[VFS_NAME_LENGTH]; fs_t *fs = NULL; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if (pathname == NULL) { semaphore_P(vfs_table.sem); for (ret = 0; ret < CONFIG_MAX_FILESYSTEMS && idx != 0; ret++) { if (vfs_table.filesystems[ret].filesystem != NULL) idx--; } /* Error can be caused if idx was <= 0 or idx was higher than the * number of mounted volumes */ if (idx != 0) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_ERROR; } stringcopy(buffer, vfs_table.filesystems[ret].mountpoint, VFS_NAME_LENGTH); semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_OK; } if (vfs_parse_pathname(pathname, volumename, dirname) != VFS_OK) { vfs_end_op(); return VFS_ERROR; } semaphore_P(vfs_table.sem); fs = vfs_get_filesystem(volumename); if(fs == NULL) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } ret = fs->file(fs, dirname, idx, buffer); semaphore_V(vfs_table.sem); vfs_end_op(); return ret; }
int vfs_filecount(char *pathname) { char volumename[VFS_NAME_LENGTH]; char dirname[VFS_NAME_LENGTH]; fs_t *fs = NULL; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if (pathname == NULL) { semaphore_P(vfs_table.sem); for (ret = 0; ret < CONFIG_MAX_FILESYSTEMS; ret++) { if (vfs_table.filesystems[ret].filesystem == NULL) break; } semaphore_V(vfs_table.sem); vfs_end_op(); return ret; } if (vfs_parse_pathname(pathname, volumename, dirname) != VFS_OK) { vfs_end_op(); return VFS_ERROR; } semaphore_P(vfs_table.sem); fs = vfs_get_filesystem(volumename); if(fs == NULL) { semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } ret = fs->filecount(fs, dirname); semaphore_V(vfs_table.sem); vfs_end_op(); return ret; }
openfile_t vfs_open(char *pathname) { openfile_t file; int fileid; char volumename[VFS_NAME_LENGTH]; char filename[VFS_NAME_LENGTH]; fs_t *fs = NULL; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if (vfs_parse_pathname(pathname, volumename, filename) != VFS_OK) { vfs_end_op(); return VFS_ERROR; } semaphore_P(vfs_table.sem); semaphore_P(openfile_table.sem); for(file=0; file<CONFIG_MAX_OPEN_FILES; file++) { if(openfile_table.files[file].filesystem == NULL) { break; } } if(file >= CONFIG_MAX_OPEN_FILES) { semaphore_V(openfile_table.sem); semaphore_V(vfs_table.sem); kprintf("VFS: Warning, maximum number of open files exceeded."); vfs_end_op(); return VFS_LIMIT; } fs = vfs_get_filesystem(volumename); if(fs == NULL) { semaphore_V(openfile_table.sem); semaphore_V(vfs_table.sem); vfs_end_op(); return VFS_NO_SUCH_FS; } openfile_table.files[file].filesystem = fs; semaphore_V(openfile_table.sem); semaphore_V(vfs_table.sem); fileid = fs->open(fs, filename); if(fileid < 0) { semaphore_P(openfile_table.sem); openfile_table.files[file].filesystem = NULL; semaphore_V(openfile_table.sem); vfs_end_op(); return fileid; /* negative -> error*/ } openfile_table.files[file].fileid = fileid; openfile_table.files[file].seek_position = 0; vfs_end_op(); return file; }