ioctl() IOCTL_STAT command
This commit is contained in:
@ -133,6 +133,35 @@ int32_t SYSCALL5(sys_ioctl, ioh1, cmd1, arg1, arg2, arg3) {
|
||||
|
||||
ret = vobj->read(vobj, buffer, len, off);
|
||||
} break;
|
||||
case IOCTL_STAT: {
|
||||
if (ioh >= PROC_VFSHANDLES_MAX) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *proc = PROCS.current;
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
|
||||
if (vobj == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
VfsStat stat1;
|
||||
ret = vobj->stat(vobj, &stat1);
|
||||
|
||||
IoctlStat *iostat = (IoctlStat *)arg1;
|
||||
if (iostat == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
iostat->size = stat1.size;
|
||||
iostat->type = stat1.type;
|
||||
} break;
|
||||
default: {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
|
@ -20,8 +20,8 @@ static const char *vfs_strings[] = {
|
||||
};
|
||||
|
||||
enum {
|
||||
VFS_TYPE_DIR,
|
||||
VFS_TYPE_FILE,
|
||||
VFS_TYPE_DIR = 0,
|
||||
VFS_TYPE_FILE = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
Reference in New Issue
Block a user