summaryrefslogtreecommitdiffstats
path: root/include/command.h
blob: 15ce8d486279e2a8ecc4b5d344bb58960d50dbc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * (C) Copyright 2000
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

/*
 *  Definitions for Command Processor
 */
#ifndef __COMMAND_H
#define __COMMAND_H

#include <linux/list.h>
#include <linux/stringify.h>

#ifndef NULL
#define NULL	0
#endif

#ifndef	__ASSEMBLY__

extern struct list_head command_list;

#define for_each_command(cmd)	list_for_each_entry(cmd, &command_list, list)

struct string_list;

/*
 * Monitor Command Table
 */
struct command {
	const char	*name;		/* Command Name			*/
	const char	**aliases;
					/* Implementation function	*/
	int		(*cmd)(int, char *[]);
	int		(*complete)(struct string_list *sl, char *instr);
	const char	*usage;		/* Usage message	(short)	*/

	struct list_head list;		/* List of commands		*/
	uint32_t	group;
#ifdef	CONFIG_LONGHELP
	const char	*help;		/* Help  message	(long)	*/
#endif
}
#ifdef __x86_64__
/* This is required because the linker will put symbols on a 64 bit alignment */
__attribute__((aligned(64)))
#endif
;

extern struct command __barebox_cmd_start;
extern struct command __barebox_cmd_end;


/* common/command.c */
struct command *find_cmd(const char *cmd);
int execute_command(int argc, char **argv);
void barebox_cmd_usage(struct command *cmdtp);

#define COMMAND_SUCCESS		0
#define COMMAND_ERROR		1
#define COMMAND_ERROR_USAGE	2

/* Note: keep this list in sync with commands/command.c */
#define CMD_GRP_INFO		1
#define CMD_GRP_BOOT		2
#define CMD_GRP_ENV		3
#define CMD_GRP_FILE		4
#define CMD_GRP_PART		5
#define CMD_GRP_SCRIPT		6
#define CMD_GRP_NET		7
#define CMD_GRP_CONSOLE		8
#define CMD_GRP_MEM		9
#define CMD_GRP_HWMANIP		10
#define CMD_GRP_MISC		11

#endif	/* __ASSEMBLY__ */

#ifndef DOXYGEN_SHOULD_SKIP_THIS

#define Struct_Section  __attribute__ ((unused,section (".barebox_cmd")))

#define BAREBOX_CMD_START(_name)							\
extern const struct command __barebox_cmd_##_name;					\
const struct command __barebox_cmd_##_name						\
	__attribute__ ((unused,section (".barebox_cmd_" __stringify(_name)))) = {	\
	.name		= #_name,

#define BAREBOX_CMD_END					\
};
#ifdef CONFIG_AUTO_COMPLETE
#define BAREBOX_CMD_COMPLETE(_cpt) .complete = _cpt,
#else
#define BAREBOX_CMD_COMPLETE(_cpt)
#endif

#define BAREBOX_CMD_HELP_START(_name) \
static const __maybe_unused char cmd_##_name##_help[] =

#define BAREBOX_CMD_HELP_USAGE(_name) "Usage: " _name
#define BAREBOX_CMD_HELP_SHORT(_text) _text
#define BAREBOX_CMD_HELP_OPT(_opt, _desc) _opt "\t" _desc
#define BAREBOX_CMD_HELP_TEXT(_text) _text
#define BAREBOX_CMD_HELP_END ;

#ifdef CONFIG_LONGHELP
#define BAREBOX_CMD_HELP(text)	.help = text,
#else
#define BAREBOX_CMD_HELP(text)
#endif

#define BAREBOX_CMD_GROUP(grp)	.group = grp,

#endif /* DOXYGEN_SHOULD_SKIP_THIS */

int register_command(struct command *);

#endif	/* __COMMAND_H */