Added basic infrastructure for manipulating settings.
[people/mcb30/gpxe.git] / src / include / gpxe / settings.h
1 #ifndef _GPXE_SETTINGS_H
2 #define _GPXE_SETTINGS_H
3
4 /** @file
5  *
6  * Configuration settings
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/dhcp.h>
12 #include <gpxe/tables.h>
13
14 struct config_setting;
15
16 /**
17  * A configuration context
18  *
19  * This identifies the context within which settings are inspected and
20  * changed.  For example, the context might be global, or might be
21  * restricted to the settings stored in NVS on a particular device.
22  */
23 struct config_context {
24         /** DHCP options block, or NULL
25          *
26          * If NULL, all registered DHCP options blocks will be used.
27          */
28         struct dhcp_option_block *options;
29 };
30
31 /**
32  * A configuration setting type
33  *
34  * This represents a type of configuration setting (e.g. string, IPv4
35  * address, etc.).
36  */
37 struct config_setting_type {
38         /** Name
39          *
40          * This is the name exposed to the user (e.g. "string").
41          */
42         const char *name;
43         /** Show value of setting
44          *
45          * @v context           Configuration context
46          * @v setting           Configuration setting
47          * @ret value           Setting value (as a string), or NULL
48          */
49         const char * ( * show ) ( struct config_context *context,
50                                   struct config_setting *setting );
51         /** Set value of setting
52          *
53          * @v context           Configuration context
54          * @v setting           Configuration setting
55          * @v value             Setting value (as a string)
56          * @ret rc              Return status code
57          */ 
58         int ( * set ) ( struct config_context *context,
59                         struct config_setting *setting,
60                         const char *value );
61 };
62
63 /** Declare a configuration setting type */
64 #define __config_setting_type __table ( config_setting_types, 01 )
65
66 /**
67  * A configuration setting
68  *
69  * This represents a single configuration setting (e.g. "hostname").
70  */
71 struct config_setting {
72         /** Name
73          *
74          * This is the human-readable name for the setting.  Where
75          * possible, it should match the name used in dhcpd.conf (see
76          * dhcp-options(5)).
77          */
78         const char *name;
79         /** DHCP option tag
80          *
81          * This is the DHCP tag used to identify the option in DHCP
82          * packets and stored option blocks.
83          */
84         unsigned int tag;
85         /** Configuration setting type
86          *
87          * This identifies the type of setting (e.g. string, IPv4
88          * address, etc.).
89          */
90         struct config_setting_type *type;
91 };
92
93 /** Declare a configuration setting */
94 #define __config_setting __table ( config_settings, 01 )
95
96 /* Function prototypes */
97
98 extern const char * ( show_setting ) ( struct config_context *context,
99                                        const char *name );
100 extern int ( set_setting ) ( struct config_context *context, const char *name,
101                              const char *value );
102
103 #endif /* _GPXE_SETTINGS_H */