if (err) { set_errno(EFAULT); goto out; } } } /* Actual ioctl call */ retval = file->vnode->vnode_ops->ioctl(file, args.request, ioargs, args.arg_len); if (retval < 0) set_errno(-retval); /* Copyout if request type was get. */ if (args.request & 1) copyout(ioargs, (__user void *)args.arg, args.arg_len); out: kfree(ioargs); fs_fildes_ref(curproc->files, args.fd, -1); return retval; } /** * Declarations of fs syscall functions. */ static const syscall_handler_t fs_sysfnmap[] = { ARRDECL_SYSCALL_HNDL(SYSCALL_IOCTL_GETSET, sys_ioctl), }; SYSCALL_HANDLERDEF(ioctl_syscall, fs_sysfnmap);
static intptr_t sys_pipe(__user void * user_args) { struct _ipc_pipe_args args; int err; if (!useracc(user_args, sizeof(args), VM_PROT_WRITE)) { set_errno(EFAULT); return -1; } copyin(user_args, &args, sizeof(args)); err = fs_pipe_curproc_creat(curproc->files, args.fildes, args.len); if (err) { set_errno(-err); return -1; } copyout(&args, user_args, sizeof(args)); return 0; } /** * Declarations of ipc syscall functions. */ static const syscall_handler_t ipc_sysfnmap[] = { ARRDECL_SYSCALL_HNDL(SYSCALL_IPC_PIPE, sys_pipe), }; SYSCALL_HANDLERDEF(ipc_syscall, ipc_sysfnmap)
if (err) { set_errno(-err); goto out; } retval = 0; out: freecpystruct(args); return retval; } /** * Declarations of fs syscall functions. */ static const syscall_handler_t fs_sysfnmap[] = { ARRDECL_SYSCALL_HNDL(SYSCALL_FS_OPEN, sys_open), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_CLOSE, sys_close), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_READ, sys_read), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_WRITE, sys_write), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_LSEEK, sys_lseek), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_GETDENTS, sys_getdents), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_FCNTL, sys_fcntl), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_LINK, sys_link), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_UNLINK, sys_unlink), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_MKDIR, sys_mkdir), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_RMDIR, sys_rmdir), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_STAT, sys_filestat), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_FSTAT, 0), /* Not implemented */ ARRDECL_SYSCALL_HNDL(SYSCALL_FS_ACCESS, sys_access), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_CHMOD, sys_chmod), ARRDECL_SYSCALL_HNDL(SYSCALL_FS_CHOWN, sys_chown),