int vfs_write(openfile_t file, void *buffer, int datasize) { openfile_entry_t *openfile; fs_t *fs; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; openfile = vfs_verify_open(file); fs = openfile->filesystem; KERNEL_ASSERT(datasize >= 0 && buffer != NULL); ret = fs->write(fs, openfile->fileid, buffer, datasize, openfile->seek_position); if(ret > 0) { semaphore_P(openfile_table.sem); openfile->seek_position += ret; semaphore_V(openfile_table.sem); } vfs_end_op(); return ret; }
/** * Seek given file to given position. The position is not verified * to be within the file's size. * * @param file Open file * * @param seek_position New positive seek position. * * @return VFS_OK, panics on invalid arguments. * */ int vfs_seek(openfile_t file, int seek_position) { openfile_entry_t *openfile; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; if(seek_position < 0) { return VFS_INVALID_PARAMS; } semaphore_P(openfile_table.sem); openfile = vfs_verify_open(file); if (openfile == NULL) { semaphore_V(openfile_table.sem); return VFS_NOT_OPEN; } openfile->seek_position = seek_position; semaphore_V(openfile_table.sem); vfs_end_op(); return VFS_OK; }
/** * Close open file. * * @param file Openfile id * * @return VFS_OK on success, negative (VFS_*) on error. * */ int vfs_close(openfile_t file) { openfile_entry_t *openfile; fs_t *fs; int ret; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; semaphore_P(openfile_table.sem); openfile = vfs_verify_open(file); if (openfile == NULL) { semaphore_V(openfile_table.sem); return VFS_NOT_OPEN; } fs = openfile->filesystem; ret = fs->close(fs, openfile->fileid); openfile->filesystem = NULL; semaphore_V(openfile_table.sem); vfs_end_op(); return ret; }
int vfs_seek(openfile_t file, int seek_position) { openfile_entry_t *openfile; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; KERNEL_ASSERT(seek_position >= 0); semaphore_P(openfile_table.sem); openfile = vfs_verify_open(file); openfile->seek_position = seek_position; semaphore_V(openfile_table.sem); vfs_end_op(); return VFS_OK; }
/** * Tells the given file's position. * * @param file Open file * * @return the file's seek position. Negative values on error * */ int vfs_tell(openfile_t file) { openfile_entry_t *openfile; if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; semaphore_P(openfile_table.sem); openfile = vfs_verify_open(file); if (openfile == NULL) { semaphore_V(openfile_table.sem); return VFS_NOT_OPEN; } int seek_position = openfile->seek_position; semaphore_V(openfile_table.sem); vfs_end_op(); return seek_position; }
/** * Writes datasize bytes from given buffer to given open file. * The write is started from current seek position and after writing, the * position is updated. * * @param file Open file * * @param buffer Buffer to be written to file. * * @param datasize Number of bytes to write. * * @return Number of bytes written. All bytes are written unless error * prevented to do that. Negative values are specific error conditions. * */ int vfs_write(openfile_t file, void *buffer, int datasize) { openfile_entry_t *openfile; fs_t *fs; int fileid, seek_position, ret; if (datasize < 0 || buffer == NULL) { return VFS_INVALID_PARAMS; } if (vfs_start_op() != VFS_OK) return VFS_UNUSABLE; semaphore_P(openfile_table.sem); openfile = vfs_verify_open(file); if (openfile == NULL) { semaphore_V(openfile_table.sem); return VFS_NOT_OPEN; } fs = openfile->filesystem; fileid = openfile->fileid; seek_position = openfile->seek_position; semaphore_V(openfile_table.sem); ret = fs->write(fs, fileid, buffer, datasize, seek_position); if(ret > 0) { semaphore_P(openfile_table.sem); openfile->seek_position += ret; semaphore_V(openfile_table.sem); } vfs_end_op(); return ret; }