[LTP] [PATCH] syscalls/msgrcv07: Add functional test for MSG_COPY flag
Yang Xu
xuyang2018.jy@cn.fujitsu.com
Fri Aug 14 10:15:46 CEST 2020
Hi Cyril
> When specifying MSG_COPY flag, we can read the msg but don't destory
> it in msg queue and mtype is interpreted as number of the message to
> copy. We check the read data whether correctly and use msgctl to
> check whether we still have 2 msg in msg queue after msgrcv(MSG_COPY).
>
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
> Hi Cyril
> This patch is based on new msgrcv07.c(test different msgtyp) and also
> based on MSG_COPY error test(introduced MSG_COPY flag in lapi/msg.h).
> .../kernel/syscalls/ipc/msgrcv/msgrcv07.c | 63 +++++++++++++++++--
> 1 file changed, 59 insertions(+), 4 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/ipc/msgrcv/msgrcv07.c b/testcases/kernel/syscalls/ipc/msgrcv/msgrcv07.c
> index f6139ba57..51dbc8951 100644
> --- a/testcases/kernel/syscalls/ipc/msgrcv/msgrcv07.c
> +++ b/testcases/kernel/syscalls/ipc/msgrcv/msgrcv07.c
> @@ -3,12 +3,13 @@
> * Copyright (c) 2014-2020 Fujitsu Ltd.
> * Author: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
> *
> - * Basic test for msgrcv(2) using MSG_EXCEPT, MSG_NOERROR and different
> - * msg_typ(zero,positive,negative).
> + * Basic test for msgrcv(2) using MSG_EXCEPT, MSG_NOERROR, MSG_COPY
> + * and different msg_typ(zero,positive,negative).
> */
>
> #define _GNU_SOURCE
> #include <sys/wait.h>
> +#include "lapi/msg.h"
> #include "tst_test.h"
> #include "tst_safe_sysv_ipc.h"
> #include "libnewipc.h"
> @@ -19,7 +20,7 @@
> #define MSG2 "messagetype2"
>
> static key_t msgkey;
> -static int queue_id = -1;
> +static int queue_id = -1, msg_copy_sup;
> static struct buf {
> long type;
> char mtext[MSGSIZE];
> @@ -141,15 +142,69 @@ static void test_negative_msgtyp(void)
> SAFE_MSGCTL(queue_id, IPC_RMID, NULL);
> }
>
> +static void test_msg_copy(void)
> +{
> + struct msqid_ds buf = {0};
> +
> + if (!msg_copy_sup)
> + tst_res(TCONF, "kernel doesn't support MSG_COPY flag, skip it");
Sorry, here missed a return;
> + prepare_queue();
> +
> + /*
> + * If MSG_COPY flag was specified, then mtype is interpreted as number
> + * of the message to copy.
> + */
> + SAFE_MSGRCV(queue_id, &rcv_buf, MSGSIZE, 0, MSG_COPY | IPC_NOWAIT);
> + if (strcmp(rcv_buf.mtext, MSG1) == 0 && rcv_buf.type == MSGTYPE1)
> + tst_res(TPASS, "msgrcv(MSG_COPY) got MSGTYPE1 msg data"
> + " correctly");
> + else
> + tst_res(TFAIL, "msgrcv(MSG_COPY) got MSGTYPE1 msg data"
> + " incorrectly");
> +
> + SAFE_MSGRCV(queue_id, &rcv_buf, MSGSIZE, 1, MSG_COPY | IPC_NOWAIT);
> + if (strcmp(rcv_buf.mtext, MSG2) == 0 && rcv_buf.type == MSGTYPE2)
> + tst_res(TPASS, "msgrcv(MSG_COPY) got MSGTYPE2 msg data"
> + " correctly");
> + else
> + tst_res(TFAIL, "msgrcv(MSG_COPY) got MSGTYPE2 msg data"
> + " incorrectly");
> +
> + SAFE_MSGCTL(queue_id, IPC_STAT, &buf);
> + if (buf.msg_qnum == 2)
> + tst_res(TPASS, "msgrcv(MSG_COPY) succeeded, msg queue "
> + "still has 2 msg");
> + else
> + tst_res(TFAIL, "msgrcv(MSG_COPY) msg queue expected 2 msg num,"
> + " but only got %d", (int)buf.msg_qnum);
> + SAFE_MSGCTL(queue_id, IPC_RMID, NULL);
> +}
>
> static void setup(void)
> {
> msgkey = GETIPCKEY();
> + prepare_queue();
> + TEST(msgrcv(queue_id, &rcv_buf, MSGSIZE, MSGTYPE1, MSG_COPY));
> + if (TST_RET != -1)
> + tst_res(TINFO, "msgrcv succeeded unexpectedly, kernel doesn't"
> + " support MSG_COPY flag");
> +
> + if (TST_ERR == EINVAL) {
> + tst_res(TINFO, "msgrcv failed as expected when not using"
> + " MSG_COPY and IPC_NOWAIT concurrently");
> + msg_copy_sup = 1;
> + } else if (TST_ERR == ENOSYS) {
> + tst_res(TINFO, "kernel doesn't enable CONFIG_CHECKPOINT_RESTORE");
> + } else {
> + tst_res(TINFO | TTERRNO, "msgrcv failed when not using MSG_COPY"
> + "and IPC_NOWAIT concurrently, expected EINVAL but got");
> + }
> + cleanup();
> }
>
> static void (*testfunc[])(void) = {test_msg_except, test_msg_noerror,
> test_zero_msgtyp, test_positive_msgtyp,
> - test_negative_msgtyp};
> + test_negative_msgtyp, test_msg_copy};
>
> static void verify_msgcrv(unsigned int n)
> {
>
More information about the ltp
mailing list