Redesign the VFS
This commit is contained in:
@ -101,19 +101,36 @@ Proc *proc_spawnkern(void (*ent)(void), char *name) {
|
||||
}
|
||||
|
||||
Proc *proc_spawnuser(char *mountpoint, char *path) {
|
||||
VfsStat stat;
|
||||
if (vfs_stat(mountpoint, path, &stat) != E_OK) {
|
||||
VfsObj *vobj = vfs_open(mountpoint, path, VFS_FLAG_READ);
|
||||
if (vobj == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VfsStat stat;
|
||||
if (vobj->stat(vobj, &stat) != E_OK) {
|
||||
vfs_close(vobj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (stat.type != VFS_TYPE_FILE) {
|
||||
vfs_close(vobj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint8_t *data = dlmalloc(stat.size);
|
||||
if (vfs_read(mountpoint, path, data, stat.size, 0) != E_OK) {
|
||||
if (data == NULL) {
|
||||
vfs_close(vobj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (vobj->read(vobj, data, stat.size, 0) != E_OK) {
|
||||
dlfree(data);
|
||||
vfs_close(vobj);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vfs_close(vobj);
|
||||
|
||||
Proc *proc = dlmalloc(sizeof(*proc));
|
||||
hal_memset(proc, 0, sizeof(*proc));
|
||||
ksprintf(proc->name, "%s:%s", mountpoint, path);
|
||||
|
Reference in New Issue
Block a user