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