xref: /linux/tools/net/ynl/ynltool/main.h (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1b02d2290SJakub Kicinski /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2b02d2290SJakub Kicinski /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
3b02d2290SJakub Kicinski /* Copyright Meta Platforms, Inc. and affiliates */
4b02d2290SJakub Kicinski 
5b02d2290SJakub Kicinski #ifndef __YNLTOOL_H
6b02d2290SJakub Kicinski #define __YNLTOOL_H
7b02d2290SJakub Kicinski 
8b02d2290SJakub Kicinski #ifndef _GNU_SOURCE
9b02d2290SJakub Kicinski #define _GNU_SOURCE
10b02d2290SJakub Kicinski #endif
11b02d2290SJakub Kicinski #include <stdbool.h>
12b02d2290SJakub Kicinski #include <stdio.h>
13b02d2290SJakub Kicinski #include <stdlib.h>
14b02d2290SJakub Kicinski #include <errno.h>
15b02d2290SJakub Kicinski #include <string.h>
16b02d2290SJakub Kicinski 
17b02d2290SJakub Kicinski #include "json_writer.h"
18b02d2290SJakub Kicinski 
19b02d2290SJakub Kicinski #define NEXT_ARG()	({ argc--; argv++; if (argc < 0) usage(); })
20b02d2290SJakub Kicinski #define NEXT_ARGP()	({ (*argc)--; (*argv)++; if (*argc < 0) usage(); })
21b02d2290SJakub Kicinski #define BAD_ARG()	({ p_err("what is '%s'?", *argv); -1; })
22b02d2290SJakub Kicinski #define GET_ARG()	({ argc--; *argv++; })
23b02d2290SJakub Kicinski #define REQ_ARGS(cnt)							\
24b02d2290SJakub Kicinski 	({								\
25b02d2290SJakub Kicinski 		int _cnt = (cnt);					\
26b02d2290SJakub Kicinski 		bool _res;						\
27b02d2290SJakub Kicinski 									\
28b02d2290SJakub Kicinski 		if (argc < _cnt) {					\
29b02d2290SJakub Kicinski 			p_err("'%s' needs at least %d arguments, %d found", \
30b02d2290SJakub Kicinski 			      argv[-1], _cnt, argc);			\
31b02d2290SJakub Kicinski 			_res = false;					\
32b02d2290SJakub Kicinski 		} else {						\
33b02d2290SJakub Kicinski 			_res = true;					\
34b02d2290SJakub Kicinski 		}							\
35b02d2290SJakub Kicinski 		_res;							\
36b02d2290SJakub Kicinski 	})
37b02d2290SJakub Kicinski 
38b02d2290SJakub Kicinski #define HELP_SPEC_OPTIONS						\
39b02d2290SJakub Kicinski 	"OPTIONS := { {-j|--json} [{-p|--pretty}] }"
40b02d2290SJakub Kicinski 
41b02d2290SJakub Kicinski extern const char *bin_name;
42b02d2290SJakub Kicinski 
43b02d2290SJakub Kicinski extern json_writer_t *json_wtr;
44b02d2290SJakub Kicinski extern bool json_output;
45b02d2290SJakub Kicinski extern bool pretty_output;
46b02d2290SJakub Kicinski 
47b02d2290SJakub Kicinski void __attribute__((format(printf, 1, 2))) p_err(const char *fmt, ...);
48b02d2290SJakub Kicinski void __attribute__((format(printf, 1, 2))) p_info(const char *fmt, ...);
49b02d2290SJakub Kicinski 
50b02d2290SJakub Kicinski bool is_prefix(const char *pfx, const char *str);
51b02d2290SJakub Kicinski int detect_common_prefix(const char *arg, ...);
52b02d2290SJakub Kicinski void usage(void) __attribute__((noreturn));
53b02d2290SJakub Kicinski 
54b02d2290SJakub Kicinski struct cmd {
55b02d2290SJakub Kicinski 	const char *cmd;
56b02d2290SJakub Kicinski 	int (*func)(int argc, char **argv);
57b02d2290SJakub Kicinski };
58b02d2290SJakub Kicinski 
59b02d2290SJakub Kicinski int cmd_select(const struct cmd *cmds, int argc, char **argv,
60b02d2290SJakub Kicinski 	       int (*help)(int argc, char **argv));
61b02d2290SJakub Kicinski 
62124dac9bSJakub Kicinski /* subcommands */
63124dac9bSJakub Kicinski int do_page_pool(int argc, char **argv);
64*3f0a638dSJakub Kicinski int do_qstats(int argc, char **argv);
65124dac9bSJakub Kicinski 
66b02d2290SJakub Kicinski #endif /* __YNLTOOL_H */
67