From 3e101d71ff9bd3e53c54b9f1c50bcfaa3671dfc8 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Thu, 28 Apr 2022 23:24:53 +0800 Subject: [PATCH] sys_write --- kernel/syscall/syscall.c | 37 ++++++++++++++++++++++++++++++++++++ kernel/syscall/syscall_num.h | 1 + 2 files changed, 38 insertions(+) diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 4ea2cb5a..94db5375 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -268,6 +268,43 @@ uint64_t sys_read(struct pt_regs *regs) return ret; } + +/** + * @brief 向文件写入数据 + * + * @param fd_num regs->r8 文件描述符号 + * @param buf regs->r9 输入缓冲区 + * @param count regs->r10 要写入的字节数 + * + * @return uint64_t + */ +uint64_t sys_write(struct pt_regs *regs) +{ + int fd_num = (int)regs->r8; + void *buf = (void *)regs->r9; + int64_t count = (int64_t)regs->r10; + + // kdebug("sys read: fd=%d", fd_num); + + // 校验文件描述符范围 + if (fd_num < 0 || fd_num > PROC_MAX_FD_NUM) + return -EBADF; + + // 文件描述符不存在 + if (current_pcb->fds[fd_num] == NULL) + return -EBADF; + + if (count < 0) + return -EINVAL; + + struct vfs_file_t *file_ptr = current_pcb->fds[fd_num]; + uint64_t ret; + if (file_ptr->file_ops && file_ptr->file_ops->write) + ret = file_ptr->file_ops->write(file_ptr, (char *)buf, count, &(file_ptr->position)); + + return ret; +} + ul sys_ahci_end_req(struct pt_regs *regs) { ahci_end_request(); diff --git a/kernel/syscall/syscall_num.h b/kernel/syscall/syscall_num.h index cb79334d..f93ed8f5 100644 --- a/kernel/syscall/syscall_num.h +++ b/kernel/syscall/syscall_num.h @@ -14,5 +14,6 @@ #define SYS_OPEN 2 #define SYS_CLOSE 3 #define SYS_READ 4 +#define SYS_WRITE 5 #define SYS_AHCI_END_REQ 255 // AHCI DMA请求结束end_request的系统调用 \ No newline at end of file