// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
 * All Rights Reserved.
 */
#ifndef __COMMAND_H__
#define __COMMAND_H__

#include <sys/time.h>

/*
 * A "oneshot" command ony runs once per command execution. It does
 * not iterate the command args function callout and so can be used
 * for functions like "help" that should only ever be run once.
 */
#define CMD_FLAG_ONESHOT	(1u << 31)
#define CMD_FLAG_FOREIGN_OK	(1u << 30) /* command not restricted to XFS */
#define CMD_FLAG_LIBRARY	(1u << 29) /* command provided by libxcmd */

typedef int (*cfunc_t)(int argc, char **argv);
typedef void (*helpfunc_t)(void);

typedef struct cmdinfo {
	const char	*name;
	const char	*altname;
	cfunc_t		cfunc;
	int		argmin;
	int		argmax;
	int		canpush;
	int		flags;
	const char	*args;
	const char	*oneline;
	helpfunc_t      help;
} cmdinfo_t;

extern cmdinfo_t	*cmdtab;
extern int		ncmds;

extern void		help_init(void);
extern void		quit_init(void);

typedef int (*iterfunc_t)(int index);
typedef int (*checkfunc_t)(const cmdinfo_t *ci);

extern void		add_command(const cmdinfo_t *ci);
extern void		add_user_command(char *optarg);
extern void		add_oneshot_user_command(char *optarg);
extern void		add_command_iterator(iterfunc_t func);
extern void		add_check_command(checkfunc_t cf);

extern const cmdinfo_t	*find_command(const char *cmd);

extern void		command_loop(void);
extern int		command_usage(const cmdinfo_t *ci);
extern int		command(const cmdinfo_t *ci, int argc, char **argv);

extern void		report_io_times(const char *verb, struct timeval *t2,
					long long offset, long long count,
					long long total, int ops, int compact);

#endif	/* __COMMAND_H__ */
