public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Cyril Hrubis <chrubis@suse.cz>
To: Wei Gao <wegao@suse.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v1 1/2] lib: Add support option for .needs_cmds
Date: Fri, 26 Sep 2025 11:31:18 +0200	[thread overview]
Message-ID: <aNZdZlTLXoiXii0N@yuki.lan> (raw)
In-Reply-To: <20250926085021.22141-2-wegao@suse.com>

Hi!
> Suggested-by: Cyril Hrubis <chrubis@suse.cz>
> Signed-off-by: Wei Gao <wegao@suse.com>
> ---
>  include/tst_cmd.h     | 15 +++++++
>  include/tst_private.h |  2 +
>  include/tst_test.h    |  2 +-
>  lib/tst_cmd.c         | 98 +++++++++++++++++++++++++++++++++++++++++++
>  lib/tst_test.c        |  9 ++--
>  5 files changed, 121 insertions(+), 5 deletions(-)
> 
> diff --git a/include/tst_cmd.h b/include/tst_cmd.h
> index 939825646..c7e7e56c1 100644
> --- a/include/tst_cmd.h
> +++ b/include/tst_cmd.h
> @@ -5,6 +5,8 @@
>  #ifndef TST_CMD_H__
>  #define TST_CMD_H__
>  
> +#include <stdbool.h>
> +
>  enum tst_cmd_flags {
>  	/*
>  	 * return the program exit code, otherwise it will call cleanup_fn() if the
> @@ -16,6 +18,19 @@ enum tst_cmd_flags {
>  	TST_CMD_TCONF_ON_MISSING = 2,
>  };
>  
> +struct tst_cmd {
> +	const char *cmd;
> +	unsigned int required:1;

Maybe it would make more sense to flip the logic and add an 'optional'
flag here instead. So that for most of the cases we just need to
initialize the cmd member.

> +	unsigned int support:1;
                     ^
		     This should be named 'present' to match the
		     function name.

> +};
> +
> +
> +/*
> + * tst_cmd_present would loop over the tst_cmd array and return the supported flag
> + * value.
> + */
> +bool tst_cmd_present(struct tst_cmd *pcmd, const char *cmd);
> +
>  /*
>   * vfork() + execvp() specified program.
>   *
> diff --git a/include/tst_private.h b/include/tst_private.h
> index 4c6479f4b..d549cf968 100644
> --- a/include/tst_private.h
> +++ b/include/tst_private.h
> @@ -47,4 +47,6 @@ char tst_kconfig_get(const char *confname);
>   */
>  int tst_check_cmd(const char *cmd, const int brk_nosupp);
>  
> +int tst_check_needs_cmds(struct tst_cmd *cmd, const int brk_nosupp);
> +
>  #endif
> diff --git a/include/tst_test.h b/include/tst_test.h
> index 9c21c1728..8fb7cd86c 100644
> --- a/include/tst_test.h
> +++ b/include/tst_test.h
> @@ -617,7 +617,7 @@ struct tst_fs {
>  
>  	const struct tst_tag *tags;
>  
> -	const char *const *needs_cmds;
> +	struct tst_cmd *needs_cmds;
>  
>  	const enum tst_cg_ver needs_cgroup_ver;
>  
> diff --git a/lib/tst_cmd.c b/lib/tst_cmd.c
> index 82d60497a..7457d17c4 100644
> --- a/lib/tst_cmd.c
> +++ b/lib/tst_cmd.c
> @@ -330,3 +330,101 @@ error:
>  
>  	return 1;
>  }
> +
> +int tst_check_needs_cmds(struct tst_cmd *cmd, const int brk_nosupp)
> +{
> +	struct version_parser *p;
> +	char *cmd_token, *op_token, *version_token, *next, *str;
> +	char path[PATH_MAX];
> +	char parser_cmd[100];
> +	int ver_parser, ver_get;
> +
> +	strcpy(parser_cmd, cmd->cmd);
> +
> +	cmd_token = strtok_r(parser_cmd, " ", &next);
> +	op_token = strtok_r(NULL, " ", &next);
> +	version_token = strtok_r(NULL, " ", &next);
> +	str = strtok_r(NULL, " ", &next);
> +
> +	if (tst_get_path(cmd_token, path, sizeof(path)))
> +		if (brk_nosupp)
> +			tst_brkm(TCONF, NULL, "Couldn't find '%s' in $PATH", cmd_token);
> +		else
> +			goto error;
> +
> +	if (!op_token)
> +		goto pass;
> +
> +	if (!version_token || str) {
> +		tst_brkm(TCONF, NULL,
> +			"Illegal format(%s), should use format like mkfs.ext4 >= 1.43.0",
> +			cmd->cmd);
> +	}
> +
> +	for (p = &version_parsers[0]; p->cmd; p++) {
> +		if (!strcmp(p->cmd, cmd_token)) {
> +			tst_resm(TINFO, "Parsing %s version", p->cmd);
> +			break;
> +		}
> +	}
> +
> +	if (!p->cmd) {
> +		tst_brkm(TBROK, NULL, "No version parser for %s implemented!",
> +			cmd_token);
> +	}
> +
> +	ver_parser = p->parser();
> +	if (ver_parser < 0)
> +		tst_brkm(TBROK, NULL, "Failed to parse %s version", p->cmd);
> +
> +	ver_get = p->table_get(version_token);
> +	if (ver_get < 0)
> +		tst_brkm(TBROK, NULL, "Failed to get %s version", p->cmd);
> +
> +	if (!strcmp(op_token, ">=")) {
> +		if (ver_parser < ver_get)
> +			goto error;
> +	} else if (!strcmp(op_token, ">")) {
> +		if (ver_parser <= ver_get)
> +			goto error;
> +	} else if (!strcmp(op_token, "<=")) {
> +		if (ver_parser > ver_get)
> +			goto error;
> +	} else if (!strcmp(op_token, "<")) {
> +		if (ver_parser >= ver_get)
> +			goto error;
> +	} else if (!strcmp(op_token, "==")) {
> +		if (ver_parser != ver_get)
> +			goto error;
> +	} else if (!strcmp(op_token, "!=")) {
> +		if (ver_parser == ver_get)
> +			goto error;
> +	} else {
> +		tst_brkm(TCONF, NULL, "Invalid op(%s)", op_token);
> +	}
> +pass:
> +	cmd->support = 1;
> +	return 0;
> +error:
> +	cmd->support = 0;
> +	if (brk_nosupp) {
> +		tst_brkm(TCONF, NULL, "%s requires %s %d, but got %d",
> +			cmd, op_token, ver_get, ver_parser);
> +	} else {
> +		tst_resm(TCONF, "%s requires %s %d, but got %d",
> +			cmd, op_token, ver_get, ver_parser);
> +	}
> +
> +	return 1;
> +}

There is no reason add this function at all, we can just call with the
right arguments and get the return value from tst_check_cmd() in the
tst_test.c instead.

> +bool tst_cmd_present(struct tst_cmd *pcmd, const char *cmd)

No need to pass the struct tst_cmd here, we can access it through the
global tst_test pointer instead. Also this function should go to the tst_test.c.

> +{
> +	while (pcmd->cmd) {
> +		if (!strcmp(pcmd->cmd, cmd))
> +			return pcmd->support;
> +
> +		pcmd++;
> +	}
> +	return false;

If we got here we asked for something that wasn't defined in tst_test
structure so here we should do:

tst_res(TBROK, "Invalid cmd request '%s'", cmd);

> +}


> diff --git a/lib/tst_test.c b/lib/tst_test.c
> index b8894f782..41519d4e1 100644
> --- a/lib/tst_test.c
> +++ b/lib/tst_test.c
> @@ -1422,11 +1422,12 @@ static void do_setup(int argc, char *argv[])
>  		tst_brk(TCONF, "%dbit ABI is not supported", tst_test->needs_abi_bits);
>  
>  	if (tst_test->needs_cmds) {
> -		const char *cmd;
> -		int i;
> +		struct tst_cmd *cmd = tst_test->needs_cmds;
>  
> -		for (i = 0; (cmd = tst_test->needs_cmds[i]); ++i)
> -			tst_check_cmd(cmd, 1);
> +		while (cmd->cmd) {
> +			tst_check_needs_cmds(cmd,cmd->required);
> +			cmd++;
> +		}
>  	}
>  
>  	if (tst_test->needs_drivers) {
> -- 
> 2.51.0
> 

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

  reply	other threads:[~2025-09-26  9:30 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-26  8:50 [LTP] [PATCH v1 0/2] new cmd support option for needs_cmds Wei Gao via ltp
2025-09-26  8:50 ` [LTP] [PATCH v1 1/2] lib: Add support option for .needs_cmds Wei Gao via ltp
2025-09-26  9:31   ` Cyril Hrubis [this message]
2025-09-26  8:50 ` [LTP] [PATCH v1 2/2] ioctl_loop01.c: Update to new .needs_cmds struct Wei Gao via ltp
2025-09-26  9:32   ` Cyril Hrubis
2025-09-28 23:26 ` [LTP] [PATCH v1 0/2] new cmd support option for needs_cmds Wei Gao via ltp
2025-09-28 23:26   ` [LTP] [PATCH v2 1/2] lib: Add support option for .needs_cmds Wei Gao via ltp
2025-09-30 13:36     ` Petr Vorel
2025-10-10  6:32       ` Wei Gao via ltp
2025-10-10  6:45     ` [LTP] [PATCH v3 0/4] new cmd support option for needs_cmds Wei Gao via ltp
2025-10-10  6:45       ` [LTP] [PATCH v3 1/4] lib: Add support option for .needs_cmds Wei Gao via ltp
2025-10-10  9:13         ` Petr Vorel
2025-10-10  9:45           ` Petr Vorel
2025-10-10  6:45       ` [LTP] [PATCH v3 2/4] ioctl_loop01.c: Update to new .needs_cmds struct Wei Gao via ltp
2025-10-10  6:45       ` [LTP] [PATCH v3 3/4] Update test cases use new needs_cmds Wei Gao via ltp
2025-10-10  6:45       ` [LTP] [PATCH v3 4/4] tst_run_shell.c: Add new function handle " Wei Gao via ltp
2025-10-17 10:09       ` [LTP] [PATCH v4 0/3] new cmd support option for needs_cmds Wei Gao via ltp
2025-10-17 10:09         ` [LTP] [PATCH v4 1/3] lib: Add support option for .needs_cmds Wei Gao via ltp
2025-10-17 14:35           ` Petr Vorel
2025-10-20  1:22             ` Wei Gao via ltp
2025-10-20 13:21               ` Petr Vorel
2025-10-21  3:42                 ` Wei Gao via ltp
2025-10-22  9:23                 ` Li Wang via ltp
2025-10-22 14:19                   ` Wei Gao via ltp
2025-10-17 15:37           ` Petr Vorel
2025-10-20  1:24             ` Wei Gao via ltp
2025-10-20 13:33           ` Petr Vorel
2025-10-21  3:17             ` Wei Gao via ltp
2025-10-17 10:09         ` [LTP] [PATCH v4 2/3] Update test cases use new needs_cmds Wei Gao via ltp
2025-10-17 10:09         ` [LTP] [PATCH v4 3/3] tst_run_shell.c: Add new function handle " Wei Gao via ltp
2025-10-17 15:30           ` Petr Vorel
2025-10-17 15:41           ` Petr Vorel
2025-10-20  1:41             ` Wei Gao via ltp
2025-11-07  0:30       ` [LTP] [PATCH v4 0/4] new cmd support option for needs_cmds Wei Gao via ltp
2025-11-07  0:30         ` [LTP] [PATCH v4 1/4] tst_cmd.c: Check brk_nosupp when tst_get_path failed Wei Gao via ltp
2025-11-07 10:33           ` Petr Vorel
2025-11-07  0:30         ` [LTP] [PATCH v4 2/4] lib: Add support option for .needs_cmds Wei Gao via ltp
2025-11-07  0:30         ` [LTP] [PATCH v4 3/4] ioctl_loop01.c: Add new support .needs_cmds Wei Gao via ltp
2025-11-07 11:04           ` Petr Vorel
2025-11-08 12:58             ` Wei Gao via ltp
2025-11-07  0:30         ` [LTP] [PATCH v4 4/4] shell_loader_cmd.sh: New test case check needs_cmds Wei Gao via ltp
2025-11-07 11:41           ` Petr Vorel
2025-11-10  2:47         ` [LTP] [PATCH v5 0/3] new cmd support option for needs_cmds Wei Gao via ltp
2025-11-10  2:47           ` [LTP] [PATCH v5 1/3] lib: Add support option for .needs_cmds Wei Gao via ltp
2025-11-11 11:06             ` Petr Vorel
2025-12-12 10:30             ` Cyril Hrubis
2025-12-12 11:16               ` Petr Vorel
2025-12-15  7:33                 ` Wei Gao via ltp
2025-12-15  9:36                   ` Petr Vorel
2025-12-15 10:59                     ` Wei Gao via ltp
2025-12-17 13:18                       ` Petr Vorel
2026-01-07  8:05                   ` Petr Vorel
2025-11-10  2:47           ` [LTP] [PATCH v5 2/3] ioctl_loop01.c: Add new support .needs_cmds Wei Gao via ltp
2025-11-11 11:14             ` Petr Vorel
2025-11-10  2:47           ` [LTP] [PATCH v5 3/3] shell_loader_cmd.sh: New test case check needs_cmds Wei Gao via ltp
2025-11-11 10:41             ` Wei Gao via ltp
2025-11-11 11:15             ` Petr Vorel
2025-12-23  2:08           ` [LTP] [PATCH v6 0/4] new cmd support option for needs_cmds Wei Gao via ltp
2025-12-23  2:08             ` [LTP] [PATCH v6 1/4] lib: Add support option for .needs_cmds Wei Gao via ltp
2026-01-05 13:48               ` Petr Vorel
2026-01-06 10:01               ` Cyril Hrubis
2025-12-23  2:08             ` [LTP] [PATCH v6 2/4] tst_test.c: Add tst_cmd_present check if a command is present Wei Gao via ltp
2026-01-05 13:52               ` Petr Vorel
2026-01-06 10:02               ` Cyril Hrubis
2026-01-07  6:16                 ` Wei Gao via ltp
2026-01-07  8:09                   ` Petr Vorel
2026-01-07  8:27                     ` Petr Vorel
2026-01-07  9:59                       ` Cyril Hrubis
2026-01-09  6:11                         ` Wei Gao via ltp
2026-01-12 11:05                         ` Petr Vorel
2026-01-07  9:56                   ` Cyril Hrubis
2025-12-23  2:08             ` [LTP] [PATCH v6 3/4] ioctl_loop01.c: Add new support .needs_cmds Wei Gao via ltp
2026-01-05 13:56               ` Petr Vorel
2025-12-23  2:08             ` [LTP] [PATCH v6 4/4] shell_loader_cmd.sh: New test case check needs_cmds Wei Gao via ltp
2026-01-05 13:57               ` Petr Vorel
2026-01-09  6:16             ` [LTP] [PATCH v7 0/4] new cmd support option for needs_cmds Wei Gao via ltp
2026-01-09  6:16               ` [LTP] [PATCH v7 1/4] lib: Add support option for .needs_cmds Wei Gao via ltp
2026-01-09 19:15                 ` Petr Vorel
2026-01-09 19:21                   ` Petr Vorel
2026-01-16 14:03                 ` Li Wang via ltp
2026-01-19 14:51                 ` Cyril Hrubis
2026-01-20  6:42                   ` Petr Vorel
2026-01-09  6:16               ` [LTP] [PATCH v7 2/4] tst_test.c: Add tst_cmd_present check if a command is present Wei Gao via ltp
2026-01-09 19:17                 ` Petr Vorel
2026-01-12 11:08                   ` Petr Vorel
2026-01-16 13:58                 ` Li Wang via ltp
2026-01-19 13:17                 ` Cyril Hrubis
2026-01-09  6:16               ` [LTP] [PATCH v7 3/4] ioctl_loop01.c: Add new support .needs_cmds Wei Gao via ltp
2026-01-16 13:25                 ` Li Wang via ltp
2026-01-17 13:16                   ` Wei Gao via ltp
2026-01-19  3:00                     ` Li Wang via ltp
2026-01-19  5:34                       ` Wei Gao via ltp
2026-01-19  6:27                         ` Li Wang via ltp
2026-01-19 14:57                 ` Cyril Hrubis
2026-01-21 13:08                 ` Cyril Hrubis
2026-01-09  6:16               ` [LTP] [PATCH v7 4/4] shell_loader_cmd.sh: New test case check needs_cmds Wei Gao via ltp
2026-01-21 13:09                 ` Cyril Hrubis
2026-01-21 13:11                   ` Petr Vorel
2025-09-28 23:26   ` [LTP] [PATCH v2 2/2] ioctl_loop01.c: Update to new .needs_cmds struct Wei Gao via ltp
2025-09-30 13:12     ` Petr Vorel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aNZdZlTLXoiXii0N@yuki.lan \
    --to=chrubis@suse.cz \
    --cc=ltp@lists.linux.it \
    --cc=wegao@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox