summaryrefslogtreecommitdiffstats
path: root/include/grub/command.h
blob: 2a6f7f8469736cf11f73b022c6d9a7efc6c774de (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
132
133
134
/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2009  Free Software Foundation, Inc.
 *
 *  GRUB 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 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB 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.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_COMMAND_HEADER
#define GRUB_COMMAND_HEADER	1

#include <grub/symbol.h>
#include <grub/err.h>
#include <grub/list.h>
#include <grub/misc.h>

typedef enum grub_command_flags
  {
    /* This is an extended command.  */
    GRUB_COMMAND_FLAG_EXTCMD = 0x10,
    /* This is an dynamic command.  */
    GRUB_COMMAND_FLAG_DYNCMD = 0x20,
    /* This command accepts block arguments.  */
    GRUB_COMMAND_FLAG_BLOCKS = 0x40,
    /* This command accepts unknown arguments as direct parameters.  */
    GRUB_COMMAND_ACCEPT_DASH = 0x80,
    /* This command accepts only options preceding direct arguments.  */
    GRUB_COMMAND_OPTIONS_AT_START = 0x100,
    /* Can be executed in an entries extractor.  */
    GRUB_COMMAND_FLAG_EXTRACTOR = 0x200
  } grub_command_flags_t;

struct grub_command;

typedef grub_err_t (*grub_command_func_t) (struct grub_command *cmd,
					   int argc, char **argv);

#define GRUB_COMMAND_PRIO_MASK	0xff
#define GRUB_COMMAND_FLAG_ACTIVE	0x100

/* The command description.  */
struct grub_command
{
  /* The next element.  */
  struct grub_command *next;
  struct grub_command **prev;

  /* The name.  */
  const char *name;

    /* The priority.  */
  int prio;

  /* The callback function.  */
  grub_command_func_t func;

  /* The flags.  */
  grub_command_flags_t flags;

  /* The summary of the command usage.  */
  const char *summary;

  /* The description of the command.  */
  const char *description;

  /* Arbitrary data.  */
  void *data;
};
typedef struct grub_command *grub_command_t;

extern grub_command_t EXPORT_VAR(grub_command_list);

grub_command_t
EXPORT_FUNC(grub_register_command_prio) (const char *name,
					 grub_command_func_t func,
					 const char *summary,
					 const char *description,
					 int prio);
grub_command_t
EXPORT_FUNC(grub_register_command_lockdown) (const char *name,
                                             grub_command_func_t func,
                                             const char *summary,
                                             const char *description);
void EXPORT_FUNC(grub_unregister_command) (grub_command_t cmd);

static inline grub_command_t
grub_register_command (const char *name,
		       grub_command_func_t func,
		       const char *summary,
		       const char *description)
{
  return grub_register_command_prio (name, func, summary, description, 0);
}

static inline grub_command_t
grub_register_command_p1 (const char *name,
			  grub_command_func_t func,
			  const char *summary,
			  const char *description)
{
  return grub_register_command_prio (name, func, summary, description, 1);
}

static inline grub_command_t
grub_command_find (const char *name)
{
  return grub_named_list_find (GRUB_AS_NAMED_LIST (grub_command_list), name);
}

static inline grub_err_t
grub_command_execute (const char *name, int argc, char **argv)
{
  grub_command_t cmd;

  cmd = grub_command_find (name);
  return (cmd) ? cmd->func (cmd, argc, argv) : GRUB_ERR_FILE_NOT_FOUND;
}

#define FOR_COMMANDS(var) FOR_LIST_ELEMENTS((var), grub_command_list)
#define FOR_COMMANDS_SAFE(var, next) FOR_LIST_ELEMENTS_SAFE((var), (next), grub_command_list)

void grub_register_core_commands (void);

#endif /* ! GRUB_COMMAND_HEADER */