summaryrefslogtreecommitdiff
path: root/components/lwp/lwp_syscall.c
diff options
context:
space:
mode:
authorzhkag <[email protected]>2023-05-05 18:14:07 +0800
committerGitHub <[email protected]>2023-05-05 18:14:07 +0800
commita6a9b0dfcb0d28d5a341e7b2011ee4bf9bee63df (patch)
tree17954cfdcd53cee79c2b842f996605fe269c2723 /components/lwp/lwp_syscall.c
parentbc9fe6d3c87b97ed4da845abdcc1d6c5a4aafa06 (diff)
[components][posix] 完善 posix 接口消息队列 (#7395)
Diffstat (limited to 'components/lwp/lwp_syscall.c')
-rw-r--r--components/lwp/lwp_syscall.c31
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);