114 lines
3.6 KiB
C
114 lines
3.6 KiB
C
#include "file.h"
|
|
#include "fs.h"
|
|
|
|
// TODO Replace with something better
|
|
extern uint8_t ActiveFsId;
|
|
|
|
// Sets adjusted_path to the path without filesystem info,
|
|
// returns the filesystem calculated
|
|
uint8_t GetFsFromPath(char *path, char **adjusted_path) {
|
|
// On active filsystem
|
|
if (*path == '/') {
|
|
*adjusted_path = path;
|
|
return GetActiveFilesystemId();
|
|
}
|
|
// Read the filesystem ID
|
|
uint8_t id = 0;
|
|
char *tmp_path = path;
|
|
// Find first /
|
|
for (;*tmp_path != '/';tmp_path++);
|
|
*adjusted_path = tmp_path;
|
|
// Read octal num
|
|
tmp_path--;
|
|
for (uint8_t bit_off = 0; tmp_path >= path; tmp_path--, bit_off+=3) {
|
|
// Outside of octal range, error
|
|
if (*tmp_path < '0' || *tmp_path > '8') return 0;
|
|
id += (*tmp_path - '0') << bit_off;
|
|
|
|
}
|
|
// Return filesystem
|
|
return id;
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error. Fills provided struct FILE
|
|
int file_open(FILE *file, char *path, char mode) {
|
|
char *adj_path;
|
|
uint8_t fsid = GetFsFromPath(path, &adj_path);
|
|
filesystem *fs = GetFilesystem(fsid);
|
|
int err = fs->ops.file_open(fs->fs_data, file, adj_path, mode);
|
|
file->filesystem_id = fsid;
|
|
return err;
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error.
|
|
int file_seek(FILE *file, uint32_t offset) {
|
|
filesystem *fs = GetFilesystem(file->filesystem_id);
|
|
return fs->ops.file_seek(fs->fs_data, file, offset);
|
|
}
|
|
|
|
// Returns 0 on error, bytes read on success.
|
|
int file_read(FILE *file, uint8_t *dest, uint32_t len) {
|
|
filesystem *fs = GetFilesystem(file->filesystem_id);
|
|
return fs->ops.file_read(fs->fs_data, file, dest, len);
|
|
}
|
|
|
|
// Returns 0 on error, bytes written on success.
|
|
int file_write(FILE *file, uint8_t *src, uint32_t len) {
|
|
filesystem *fs = GetFilesystem(file->filesystem_id);
|
|
return fs->ops.file_write(fs->fs_data, file, src, len);
|
|
}
|
|
|
|
void file_close(FILE *file) {
|
|
filesystem *fs = GetFilesystem(file->filesystem_id);
|
|
return fs->ops.file_close(fs->fs_data, file);
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error. Fills provided struct DIR
|
|
int dir_open(DIR *dir, char *path) {
|
|
char *adj_path;
|
|
uint8_t fsid = GetFsFromPath(path, &adj_path);
|
|
filesystem *fs = GetFilesystem(fsid);
|
|
int err = fs->ops.dir_open(fs->fs_data, dir, adj_path);
|
|
dir->filesystem_id = fsid;
|
|
return err;
|
|
}
|
|
|
|
// Return 0 on success, non-zero error code on error. Fills provided struct dirent.
|
|
int dir_nextentry(DIR *dir, dirent *ent) {
|
|
filesystem *fs = GetFilesystem(dir->filesystem_id);
|
|
return fs->ops.dir_nextentry(fs->fs_data, dir, ent);
|
|
}
|
|
|
|
void dir_close(DIR *dir) {
|
|
filesystem *fs = GetFilesystem(dir->filesystem_id);
|
|
return fs->ops.dir_close(fs->fs_data, dir);
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error. Fills provided struct dirent.
|
|
int path_getinfo(char *path, dirent *ent) {
|
|
char *adj_path;
|
|
filesystem *fs = GetFilesystem(GetFsFromPath(path, &adj_path));
|
|
return fs->ops.path_getinfo(fs->fs_data, adj_path, ent);
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error.
|
|
int path_mkdir(char *path) {
|
|
char *adj_path;
|
|
filesystem *fs = GetFilesystem(GetFsFromPath(path, &adj_path));
|
|
return fs->ops.path_mkdir(fs->fs_data, adj_path);
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error.
|
|
int path_rmdir(char *path) {
|
|
char *adj_path;
|
|
filesystem *fs = GetFilesystem(GetFsFromPath(path, &adj_path));
|
|
return fs->ops.path_rmdir(fs->fs_data, adj_path);
|
|
}
|
|
|
|
// Returns 0 on success, non-zero error code on error.
|
|
int path_rmfile(char *path) {
|
|
char *adj_path;
|
|
filesystem *fs = GetFilesystem(GetFsFromPath(path, &adj_path));
|
|
return fs->ops.path_rmfile(fs->fs_data, adj_path);
|
|
}
|