diff options
| author | zhkag <[email protected]> | 2023-05-05 18:14:07 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-05-05 18:14:07 +0800 |
| commit | a6a9b0dfcb0d28d5a341e7b2011ee4bf9bee63df (patch) | |
| tree | 17954cfdcd53cee79c2b842f996605fe269c2723 /components/lwp/lwp_syscall.c | |
| parent | bc9fe6d3c87b97ed4da845abdcc1d6c5a4aafa06 (diff) | |
[components][posix] 完善 posix 接口消息队列 (#7395)
Diffstat (limited to 'components/lwp/lwp_syscall.c')
| -rw-r--r-- | components/lwp/lwp_syscall.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 373a36b779..f4295b4b55 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -4378,10 +4378,22 @@ mqd_t sys_mq_open(const char *name, int flags, mode_t mode, struct mq_attr *attr if (!kname) return (mqd_t)-ENOMEM; - lwp_get_from_user(&attr_k, (void *)attr, sizeof(struct mq_attr)); + if (attr == NULL) + { + attr_k.mq_maxmsg = 10; + attr_k.mq_msgsize = 8192; + attr_k.mq_flags = 0; + attr = &attr_k; + } + else + { + if (!lwp_get_from_user(&attr_k, (void *)attr, sizeof(struct mq_attr))) + return -EINVAL; + } + lwp_get_from_user(kname, (void *)name, len + 1); mqdes = mq_open(kname, flags, mode, &attr_k); - if (mqdes == RT_NULL) + if (mqdes == -1) { ret = GET_ERRNO(); } @@ -4390,7 +4402,7 @@ mqd_t sys_mq_open(const char *name, int flags, mode_t mode, struct mq_attr *attr #else mqdes = mq_open(name, flags, mode, attr); #endif - if (mqdes == RT_NULL) + if (mqdes == -1) return (mqd_t)ret; else return mqdes; @@ -4476,9 +4488,18 @@ sysret_t sys_mq_timedreceive(mqd_t mqd, char *restrict msg, size_t len, unsigned if (!kmsg) return -ENOMEM; - lwp_get_from_user(&at_k, (void *)at, sizeof(struct timespec)); lwp_get_from_user(kmsg, (void *)msg, len + 1); - ret = mq_timedreceive(mqd, kmsg, len, prio, &at_k); + if (at == RT_NULL) + { + ret = mq_timedreceive(mqd, kmsg, len, prio, RT_NULL); + } + else + { + if (!lwp_get_from_user(&at_k, (void *)at, sizeof(struct timespec))) + return -EINVAL; + ret = mq_timedreceive(mqd, kmsg, len, prio, &at_k); + } + if (ret > 0) lwp_put_to_user(msg, kmsg, len + 1); |
