Browse Source

Added "priority" and "root-path" options

tags/v0.9.3
Michael Brown 18 years ago
parent
commit
69b9048e1a
1 changed files with 94 additions and 2 deletions
  1. 94
    2
      src/core/settings.c

+ 94
- 2
src/core/settings.c View File

19
 #include <stdint.h>
19
 #include <stdint.h>
20
 #include <stdlib.h>
20
 #include <stdlib.h>
21
 #include <string.h>
21
 #include <string.h>
22
+#include <byteswap.h>
22
 #include <errno.h>
23
 #include <errno.h>
23
 #include <assert.h>
24
 #include <assert.h>
24
 #include <vsprintf.h>
25
 #include <vsprintf.h>
172
 	return 0;
173
 	return 0;
173
 }
174
 }
174
 
175
 
175
-/** Set value of string setting
176
+/**
177
+ * Set value of string setting
176
  *
178
  *
177
  * @v context		Configuration context
179
  * @v context		Configuration context
178
  * @v setting		Configuration setting
180
  * @v setting		Configuration setting
221
 	return 0;
223
 	return 0;
222
 }
224
 }
223
 
225
 
224
-/** Set value of IPV4 setting
226
+/**
227
+ * Set value of IPV4 setting
225
  *
228
  *
226
  * @v context		Configuration context
229
  * @v context		Configuration context
227
  * @v setting		Configuration setting
230
  * @v setting		Configuration setting
251
 	.set = set_ipv4,
254
 	.set = set_ipv4,
252
 };
255
 };
253
 
256
 
257
+/**
258
+ * Show value of integer setting
259
+ *
260
+ * @v context		Configuration context
261
+ * @v setting		Configuration setting
262
+ * @v buf		Buffer to contain value
263
+ * @v len		Length of buffer
264
+ * @ret rc		Return status code
265
+ */
266
+static int show_int ( struct config_context *context,
267
+		      struct config_setting *setting,
268
+		      char *buf, size_t len ) {
269
+	struct dhcp_option *option;
270
+	long num;
271
+
272
+	option = find_dhcp_option ( context->options, setting->tag );
273
+	if ( ! option )
274
+		return -ENODATA;
275
+	num = dhcp_num_option ( option );
276
+	snprintf ( buf, len, "%ld", num );
277
+	return 0;
278
+}
279
+
280
+/**
281
+ * Set value of integer setting
282
+ *
283
+ * @v context		Configuration context
284
+ * @v setting		Configuration setting
285
+ * @v value		Setting value (as a string)
286
+ * @v size		Size of integer (in bytes)
287
+ * @ret rc		Return status code
288
+ */ 
289
+static int set_int ( struct config_context *context,
290
+		     struct config_setting *setting,
291
+		     const char *value, unsigned int size ) {
292
+	struct dhcp_option *option;
293
+	union {
294
+		uint32_t num;
295
+		uint8_t bytes[4];
296
+	} u;
297
+	char *endp;
298
+
299
+	/* Parse number */
300
+	if ( ! *value )
301
+		return -EINVAL;
302
+	u.num = htonl ( strtoul ( value, &endp, 0 ) );
303
+	if ( *endp )
304
+		return -EINVAL;
305
+
306
+	/* Set option */
307
+	option = set_dhcp_option ( context->options, setting->tag,
308
+				   &u.bytes[ sizeof ( u ) - size ], size );
309
+	if ( ! option )
310
+		return -ENOMEM;
311
+	return 0;
312
+}
313
+
314
+/**
315
+ * Set value of 8-bit integer setting
316
+ *
317
+ * @v context		Configuration context
318
+ * @v setting		Configuration setting
319
+ * @v value		Setting value (as a string)
320
+ * @v size		Size of integer (in bytes)
321
+ * @ret rc		Return status code
322
+ */ 
323
+static int set_int8 ( struct config_context *context,
324
+			   struct config_setting *setting,
325
+			   const char *value ) {
326
+	return set_int ( context, setting, value, 8 );
327
+}
328
+
329
+/** An 8-bit integer configuration setting */
330
+struct config_setting_type config_setting_type_int8 __config_setting_type = {
331
+	.name = "int8",
332
+	.show = show_int,
333
+	.set = set_int8,
334
+};
335
+
254
 /** Some basic setting definitions */
336
 /** Some basic setting definitions */
255
 struct config_setting ip_config_setting __config_setting = {
337
 struct config_setting ip_config_setting __config_setting = {
256
 	.name = "ip",
338
 	.name = "ip",
272
 	.tag = DHCP_EB_PASSWORD,
354
 	.tag = DHCP_EB_PASSWORD,
273
 	.type = &config_setting_type_string,
355
 	.type = &config_setting_type_string,
274
 };
356
 };
357
+struct config_setting root_path_config_setting __config_setting = {
358
+	.name = "root-path",
359
+	.tag = DHCP_ROOT_PATH,
360
+	.type = &config_setting_type_string,
361
+};
362
+struct config_setting priority_config_setting __config_setting = {
363
+	.name = "priority",
364
+	.tag = DHCP_EB_PRIORITY,
365
+	.type = &config_setting_type_int8,
366
+};

Loading…
Cancel
Save