Browse Source

[cmdline] Allow "if<xxx>" commands to take options

Allow commands implemented using ifcommon_exec() to accept
command-specific options.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 10 years ago
parent
commit
55e85ad1ee

+ 15
- 6
src/arch/i386/hci/commands/pxe_cmd.c View File

31
  *
31
  *
32
  */
32
  */
33
 
33
 
34
-/** "startpxe" command descriptor */
35
-static struct command_descriptor startpxe_cmd =
36
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
37
-		       "[<interface>]" );
34
+/** "startpxe" options */
35
+struct startpxe_options {};
36
+
37
+/** "startpxe" option list */
38
+static struct option_descriptor startpxe_opts[] = {};
38
 
39
 
39
 /**
40
 /**
40
  * "startpxe" payload
41
  * "startpxe" payload
41
  *
42
  *
42
  * @v netdev		Network device
43
  * @v netdev		Network device
44
+ * @v opts		Command options
43
  * @ret rc		Return status code
45
  * @ret rc		Return status code
44
  */
46
  */
45
-static int startpxe_payload ( struct net_device *netdev ) {
47
+static int startpxe_payload ( struct net_device *netdev,
48
+			      struct startpxe_options *opts __unused ) {
46
 
49
 
47
 	if ( netdev_is_open ( netdev ) )
50
 	if ( netdev_is_open ( netdev ) )
48
 		pxe_activate ( netdev );
51
 		pxe_activate ( netdev );
50
 	return 0;
53
 	return 0;
51
 }
54
 }
52
 
55
 
56
+/** "startpxe" command descriptor */
57
+static struct ifcommon_command_descriptor startpxe_cmd =
58
+	IFCOMMON_COMMAND_DESC ( struct startpxe_options, startpxe_opts,
59
+				0, MAX_ARGUMENTS, "[<interface>]",
60
+				startpxe_payload, 0 );
61
+
53
 /**
62
 /**
54
  * The "startpxe" command
63
  * The "startpxe" command
55
  *
64
  *
58
  * @ret rc		Return status code
67
  * @ret rc		Return status code
59
  */
68
  */
60
 static int startpxe_exec ( int argc, char **argv ) {
69
 static int startpxe_exec ( int argc, char **argv ) {
61
-	return ifcommon_exec ( argc, argv, &startpxe_cmd, startpxe_payload, 0 );
70
+	return ifcommon_exec ( argc, argv, &startpxe_cmd );
62
 }
71
 }
63
 
72
 
64
 /** "stoppxe" options */
73
 /** "stoppxe" options */

+ 23
- 4
src/hci/commands/autoboot_cmd.c View File

33
  *
33
  *
34
  */
34
  */
35
 
35
 
36
+/** "autoboot" options */
37
+struct autoboot_options {};
38
+
39
+/** "autoboot" option list */
40
+static struct option_descriptor autoboot_opts[] = {};
41
+
42
+/**
43
+ * "autoboot" payload
44
+ *
45
+ * @v netdev		Network device
46
+ * @v opts		Command options
47
+ * @ret rc		Return status code
48
+ */
49
+static int autoboot_payload ( struct net_device *netdev,
50
+			      struct autoboot_options *opts __unused ) {
51
+	return netboot ( netdev );
52
+}
53
+
36
 /** "autoboot" command descriptor */
54
 /** "autoboot" command descriptor */
37
-static struct command_descriptor autoboot_cmd =
38
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
39
-		       "[<interface>...]" );
55
+static struct ifcommon_command_descriptor autoboot_cmd =
56
+	IFCOMMON_COMMAND_DESC ( struct autoboot_options, autoboot_opts,
57
+				0, MAX_ARGUMENTS, "[<interface>...]",
58
+				autoboot_payload, 0 );
40
 
59
 
41
 /**
60
 /**
42
  * "autoboot" command
61
  * "autoboot" command
46
  * @ret rc		Return status code
65
  * @ret rc		Return status code
47
  */
66
  */
48
 static int autoboot_exec ( int argc, char **argv ) {
67
 static int autoboot_exec ( int argc, char **argv ) {
49
-	return ifcommon_exec ( argc, argv, &autoboot_cmd, netboot, 0 );
68
+	return ifcommon_exec ( argc, argv, &autoboot_cmd );
50
 }
69
 }
51
 
70
 
52
 /** Booting commands */
71
 /** Booting commands */

+ 15
- 6
src/hci/commands/dhcp_cmd.c View File

41
  *
41
  *
42
  */
42
  */
43
 
43
 
44
-/** "dhcp" command descriptor */
45
-static struct command_descriptor dhcp_cmd =
46
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
47
-		       "[<interface>...]" );
44
+/** "dhcp" options */
45
+struct dhcp_options {};
46
+
47
+/** "dhcp" option list */
48
+static struct option_descriptor dhcp_opts[] = {};
48
 
49
 
49
 /**
50
 /**
50
  * Execute "dhcp" command for a network device
51
  * Execute "dhcp" command for a network device
51
  *
52
  *
52
  * @v netdev		Network device
53
  * @v netdev		Network device
54
+ * @v opts		Command options
53
  * @ret rc		Return status code
55
  * @ret rc		Return status code
54
  */
56
  */
55
-static int dhcp_payload ( struct net_device *netdev ) {
57
+static int dhcp_payload ( struct net_device *netdev,
58
+			  struct dhcp_options *opts __unused ) {
56
 	int rc;
59
 	int rc;
57
 
60
 
58
 	if ( ( rc = dhcp ( netdev ) ) != 0 ) {
61
 	if ( ( rc = dhcp ( netdev ) ) != 0 ) {
68
 	return 0;
71
 	return 0;
69
 }
72
 }
70
 
73
 
74
+/** "dhcp" command descriptor */
75
+static struct ifcommon_command_descriptor dhcp_cmd =
76
+	IFCOMMON_COMMAND_DESC ( struct dhcp_options, dhcp_opts,
77
+				0, MAX_ARGUMENTS, "[<interface>...]",
78
+				dhcp_payload, 1 );
79
+
71
 /**
80
 /**
72
  * The "dhcp" command
81
  * The "dhcp" command
73
  *
82
  *
76
  * @ret rc		Return status code
85
  * @ret rc		Return status code
77
  */
86
  */
78
 static int dhcp_exec ( int argc, char **argv ) {
87
 static int dhcp_exec ( int argc, char **argv ) {
79
-	return ifcommon_exec ( argc, argv, &dhcp_cmd, dhcp_payload, 1 );
88
+	return ifcommon_exec ( argc, argv, &dhcp_cmd );
80
 }
89
 }
81
 
90
 
82
 /** "pxebs" options */
91
 /** "pxebs" options */

+ 53
- 30
src/hci/commands/ifmgmt_cmd.c View File

34
  *
34
  *
35
  */
35
  */
36
 
36
 
37
-/** "if<xxx>" command options */
38
-struct option_descriptor ifcommon_opts[0];
39
-
40
 /**
37
 /**
41
  * Execute if<xxx> command
38
  * Execute if<xxx> command
42
  *
39
  *
48
  * @ret rc		Return status code
45
  * @ret rc		Return status code
49
  */
46
  */
50
 int ifcommon_exec ( int argc, char **argv,
47
 int ifcommon_exec ( int argc, char **argv,
51
-		    struct command_descriptor *cmd,
52
-		    int ( * payload ) ( struct net_device * ),
53
-		    int stop_on_first_success ) {
54
-	struct ifcommon_options opts;
48
+		    struct ifcommon_command_descriptor *ifcmd ) {
49
+	struct command_descriptor *cmd = &ifcmd->cmd;
50
+	uint8_t opts[cmd->len];
55
 	struct net_device *netdev;
51
 	struct net_device *netdev;
56
 	int i;
52
 	int i;
57
 	int rc;
53
 	int rc;
58
 
54
 
59
 	/* Parse options */
55
 	/* Parse options */
60
-	if ( ( rc = parse_options ( argc, argv, cmd, &opts ) ) != 0 )
56
+	if ( ( rc = parse_options ( argc, argv, cmd, opts ) ) != 0 )
61
 		return rc;
57
 		return rc;
62
 
58
 
63
 	if ( optind != argc ) {
59
 	if ( optind != argc ) {
65
 		for ( i = optind ; i < argc ; i++ ) {
61
 		for ( i = optind ; i < argc ; i++ ) {
66
 			if ( ( rc = parse_netdev ( argv[i], &netdev ) ) != 0 )
62
 			if ( ( rc = parse_netdev ( argv[i], &netdev ) ) != 0 )
67
 				continue;
63
 				continue;
68
-			if ( ( ( rc = payload ( netdev ) ) == 0 ) &&
69
-			     stop_on_first_success ) {
64
+			if ( ( ( rc = ifcmd->payload ( netdev, opts ) ) == 0 )
65
+			     && ifcmd->stop_on_first_success ) {
70
 				return 0;
66
 				return 0;
71
 			}
67
 			}
72
 		}
68
 		}
74
 		/* Try all interfaces */
70
 		/* Try all interfaces */
75
 		rc = -ENODEV;
71
 		rc = -ENODEV;
76
 		for_each_netdev ( netdev ) {
72
 		for_each_netdev ( netdev ) {
77
-			if ( ( ( rc = payload ( netdev ) ) == 0 ) &&
78
-			     stop_on_first_success ) {
73
+			if ( ( ( rc = ifcmd->payload ( netdev, opts ) ) == 0 )
74
+			     && ifcmd->stop_on_first_success ) {
79
 				return 0;
75
 				return 0;
80
 			}
76
 			}
81
 		}
77
 		}
84
 	return rc;
80
 	return rc;
85
 }
81
 }
86
 
82
 
87
-/** "ifopen" command descriptor */
88
-static struct command_descriptor ifopen_cmd =
89
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
90
-		       "[<interface>...]" );
83
+/** "ifopen" options */
84
+struct ifopen_options {};
85
+
86
+/** "ifopen" option list */
87
+static struct option_descriptor ifopen_opts[] = {};
91
 
88
 
92
 /**
89
 /**
93
  * "ifopen" payload
90
  * "ifopen" payload
94
  *
91
  *
95
  * @v netdev		Network device
92
  * @v netdev		Network device
93
+ * @v opts		Command options
96
  * @ret rc		Return status code
94
  * @ret rc		Return status code
97
  */
95
  */
98
-static int ifopen_payload ( struct net_device *netdev ) {
96
+static int ifopen_payload ( struct net_device *netdev,
97
+			    struct ifopen_options *opts __unused ) {
99
 	return ifopen ( netdev );
98
 	return ifopen ( netdev );
100
 }
99
 }
101
 
100
 
101
+/** "ifopen" command descriptor */
102
+static struct ifcommon_command_descriptor ifopen_cmd =
103
+	IFCOMMON_COMMAND_DESC ( struct ifopen_options, ifopen_opts,
104
+				0, MAX_ARGUMENTS, "[<interface>...]",
105
+				ifopen_payload, 0 );
106
+
102
 /**
107
 /**
103
  * The "ifopen" command
108
  * The "ifopen" command
104
  *
109
  *
107
  * @ret rc		Return status code
112
  * @ret rc		Return status code
108
  */
113
  */
109
 static int ifopen_exec ( int argc, char **argv ) {
114
 static int ifopen_exec ( int argc, char **argv ) {
110
-	return ifcommon_exec ( argc, argv, &ifopen_cmd, ifopen_payload, 0 );
115
+	return ifcommon_exec ( argc, argv, &ifopen_cmd );
111
 }
116
 }
112
 
117
 
113
-/** "ifclose" command descriptor */
114
-static struct command_descriptor ifclose_cmd =
115
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
116
-		       "[<interface>...]" );
118
+/** "ifclose" options */
119
+struct ifclose_options {};
120
+
121
+/** "ifclose" option list */
122
+static struct option_descriptor ifclose_opts[] = {};
117
 
123
 
118
 /**
124
 /**
119
  * "ifclose" payload
125
  * "ifclose" payload
120
  *
126
  *
121
  * @v netdev		Network device
127
  * @v netdev		Network device
128
+ * @v opts		Command options
122
  * @ret rc		Return status code
129
  * @ret rc		Return status code
123
  */
130
  */
124
-static int ifclose_payload ( struct net_device *netdev ) {
131
+static int ifclose_payload ( struct net_device *netdev,
132
+			     struct ifclose_options *opts __unused ) {
125
 	ifclose ( netdev );
133
 	ifclose ( netdev );
126
 	return 0;
134
 	return 0;
127
 }
135
 }
128
 
136
 
137
+/** "ifclose" command descriptor */
138
+static struct ifcommon_command_descriptor ifclose_cmd =
139
+	IFCOMMON_COMMAND_DESC ( struct ifclose_options, ifclose_opts,
140
+				0, MAX_ARGUMENTS, "[<interface>...]",
141
+				ifclose_payload, 0 );
142
+
129
 /**
143
 /**
130
  * The "ifclose" command
144
  * The "ifclose" command
131
  *
145
  *
134
  * @ret rc		Return status code
148
  * @ret rc		Return status code
135
  */
149
  */
136
 static int ifclose_exec ( int argc, char **argv ) {
150
 static int ifclose_exec ( int argc, char **argv ) {
137
-	return ifcommon_exec ( argc, argv, &ifclose_cmd, ifclose_payload, 0 );
151
+	return ifcommon_exec ( argc, argv, &ifclose_cmd );
138
 }
152
 }
139
 
153
 
140
-/** "ifstat" command descriptor */
141
-static struct command_descriptor ifstat_cmd =
142
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
143
-		       "[<interface>...]" );
154
+/** "ifstat" options */
155
+struct ifstat_options {};
156
+
157
+/** "ifstat" option list */
158
+static struct option_descriptor ifstat_opts[] = {};
144
 
159
 
145
 /**
160
 /**
146
  * "ifstat" payload
161
  * "ifstat" payload
147
  *
162
  *
148
  * @v netdev		Network device
163
  * @v netdev		Network device
164
+ * @v opts		Command options
149
  * @ret rc		Return status code
165
  * @ret rc		Return status code
150
  */
166
  */
151
-static int ifstat_payload ( struct net_device *netdev ) {
167
+static int ifstat_payload ( struct net_device *netdev,
168
+			    struct ifstat_options *opts __unused ) {
152
 	ifstat ( netdev );
169
 	ifstat ( netdev );
153
 	return 0;
170
 	return 0;
154
 }
171
 }
155
 
172
 
173
+/** "ifstat" command descriptor */
174
+static struct ifcommon_command_descriptor ifstat_cmd =
175
+	IFCOMMON_COMMAND_DESC ( struct ifstat_options, ifstat_opts,
176
+				0, MAX_ARGUMENTS, "[<interface>...]",
177
+				ifstat_payload, 0 );
178
+
156
 /**
179
 /**
157
  * The "ifstat" command
180
  * The "ifstat" command
158
  *
181
  *
161
  * @ret rc		Return status code
184
  * @ret rc		Return status code
162
  */
185
  */
163
 static int ifstat_exec ( int argc, char **argv ) {
186
 static int ifstat_exec ( int argc, char **argv ) {
164
-	return ifcommon_exec ( argc, argv, &ifstat_cmd, ifstat_payload, 0 );
187
+	return ifcommon_exec ( argc, argv, &ifstat_cmd );
165
 }
188
 }
166
 
189
 
167
 /** Interface management commands */
190
 /** Interface management commands */

+ 30
- 12
src/hci/commands/iwmgmt_cmd.c View File

32
  *
32
  *
33
  */
33
  */
34
 
34
 
35
-/** "iwstat" command descriptor */
36
-static struct command_descriptor iwstat_cmd =
37
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
38
-		       "[<interface>...]" );
35
+/** "iwstat" options */
36
+struct iwstat_options {};
37
+
38
+/** "iwstat" option list */
39
+static struct option_descriptor iwstat_opts[] = {};
39
 
40
 
40
 /**
41
 /**
41
  * "iwstat" payload
42
  * "iwstat" payload
42
  *
43
  *
43
  * @v netdev		Network device
44
  * @v netdev		Network device
45
+ * @v opts		Command options
44
  * @ret rc		Return status code
46
  * @ret rc		Return status code
45
  */
47
  */
46
-static int iwstat_payload ( struct net_device *netdev ) {
48
+static int iwstat_payload ( struct net_device *netdev,
49
+			    struct iwstat_options *opts __unused ) {
47
 	struct net80211_device *dev = net80211_get ( netdev );
50
 	struct net80211_device *dev = net80211_get ( netdev );
48
 
51
 
49
 	if ( dev )
52
 	if ( dev )
52
 	return 0;
55
 	return 0;
53
 }
56
 }
54
 
57
 
58
+/** "iwstat" command descriptor */
59
+static struct ifcommon_command_descriptor iwstat_cmd =
60
+	IFCOMMON_COMMAND_DESC ( struct iwstat_options, iwstat_opts,
61
+				0, MAX_ARGUMENTS, "[<interface>...]",
62
+				iwstat_payload, 0 );
63
+
55
 /**
64
 /**
56
  * The "iwstat" command
65
  * The "iwstat" command
57
  *
66
  *
60
  * @ret rc		Return status code
69
  * @ret rc		Return status code
61
  */
70
  */
62
 static int iwstat_exec ( int argc, char **argv ) {
71
 static int iwstat_exec ( int argc, char **argv ) {
63
-	return ifcommon_exec ( argc, argv, &iwstat_cmd, iwstat_payload, 0 );
72
+	return ifcommon_exec ( argc, argv, &iwstat_cmd );
64
 }
73
 }
65
 
74
 
66
-/** "iwlist" command descriptor */
67
-static struct command_descriptor iwlist_cmd =
68
-	COMMAND_DESC ( struct ifcommon_options, ifcommon_opts, 0, MAX_ARGUMENTS,
69
-		       "[<interface>...]" );
75
+/** "iwlist" options */
76
+struct iwlist_options {};
77
+
78
+/** "iwlist" option list */
79
+static struct option_descriptor iwlist_opts[] = {};
70
 
80
 
71
 /**
81
 /**
72
  * "iwlist" payload
82
  * "iwlist" payload
73
  *
83
  *
74
  * @v netdev		Network device
84
  * @v netdev		Network device
85
+ * @v opts		Command options
75
  * @ret rc		Return status code
86
  * @ret rc		Return status code
76
  */
87
  */
77
-static int iwlist_payload ( struct net_device *netdev ) {
88
+static int iwlist_payload ( struct net_device *netdev,
89
+			    struct iwlist_options *opts __unused ) {
78
 	struct net80211_device *dev = net80211_get ( netdev );
90
 	struct net80211_device *dev = net80211_get ( netdev );
79
 
91
 
80
 	if ( dev )
92
 	if ( dev )
83
 	return 0;
95
 	return 0;
84
 }
96
 }
85
 
97
 
98
+/** "iwlist" command descriptor */
99
+static struct ifcommon_command_descriptor iwlist_cmd =
100
+	IFCOMMON_COMMAND_DESC ( struct iwlist_options, iwlist_opts,
101
+				0, MAX_ARGUMENTS, "[<interface>...]",
102
+				iwlist_payload, 0 );
103
+
86
 /**
104
 /**
87
  * The "iwlist" command
105
  * The "iwlist" command
88
  *
106
  *
91
  * @ret rc		Return status code
109
  * @ret rc		Return status code
92
  */
110
  */
93
 static int iwlist_exec ( int argc, char **argv ) {
111
 static int iwlist_exec ( int argc, char **argv ) {
94
-	return ifcommon_exec ( argc, argv, &iwlist_cmd, iwlist_payload, 0 );
112
+	return ifcommon_exec ( argc, argv, &iwlist_cmd );
95
 }
113
 }
96
 
114
 
97
 /** Wireless interface management commands */
115
 /** Wireless interface management commands */

+ 38
- 5
src/include/hci/ifmgmt_cmd.h View File

26
 
26
 
27
 struct net_device;
27
 struct net_device;
28
 
28
 
29
-struct ifcommon_options {};
29
+/** An "if<xxx>" command descriptor */
30
+struct ifcommon_command_descriptor {
31
+	/** Command descriptor */
32
+	struct command_descriptor cmd;
33
+	/** Payload
34
+	 *
35
+	 * @v netdev		Network device
36
+	 * @v opts		Command options
37
+	 * @ret rc		Return status code
38
+	 */
39
+	int ( * payload ) ( struct net_device *netdev, void *opts );
40
+	/** Stop on first success */
41
+	int stop_on_first_success;
42
+};
30
 
43
 
31
-extern struct option_descriptor ifcommon_opts[0];
44
+/**
45
+ * Construct "if<xxx>" command descriptor
46
+ *
47
+ * @v _struct		Options structure type
48
+ * @v _options		Option descriptor array
49
+ * @v _check_args	Remaining argument checker
50
+ * @v _usage		Command usage
51
+ * @ret _command	Command descriptor
52
+ */
53
+#define IFCOMMON_COMMAND_DESC( _struct, _options, _min_args,		\
54
+			       _max_args, _usage, _payload,		\
55
+			       _stop_on_first_success )			\
56
+	{								\
57
+		.cmd = COMMAND_DESC ( _struct, _options, _min_args,	\
58
+				      _max_args, _usage ),		\
59
+		.payload = ( ( int ( * ) ( struct net_device *netdev,	\
60
+					   void *opts ) )		\
61
+			     ( ( ( ( int ( * ) ( struct net_device *,	\
62
+						 _struct * ) ) NULL )	\
63
+				 == ( typeof ( _payload ) * ) NULL )	\
64
+			       ? _payload : _payload ) ),		\
65
+		.stop_on_first_success = _stop_on_first_success,	\
66
+	}
32
 
67
 
33
 extern int ifcommon_exec (  int argc, char **argv,
68
 extern int ifcommon_exec (  int argc, char **argv,
34
-			    struct command_descriptor *cmd,
35
-			    int ( * payload ) ( struct net_device * ),
36
-			    int stop_on_first_success );
69
+			    struct ifcommon_command_descriptor *cmd );
37
 
70
 
38
 #endif /* _IFMGMT_CMD_H */
71
 #endif /* _IFMGMT_CMD_H */

Loading…
Cancel
Save