1b9c059be0c00dcd4b5ddd1b73013c4e6c6b11c9
[people/dverkamp/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         /** Description */
44         const char *description;
45         /** Show value of setting
46          *
47          * @v context           Configuration context
48          * @v setting           Configuration setting
49          * @v buf               Buffer to contain value
50          * @v len               Length of buffer
51          * @ret len             Length of formatted value, or negative error
52          */
53         int ( * show ) ( struct config_context *context,
54                          struct config_setting *setting,
55                          char *buf, size_t len );
56         /** Set value of setting
57          *
58          * @v context           Configuration context
59          * @v setting           Configuration setting
60          * @v value             Setting value (as a string)
61          * @ret rc              Return status code
62          */ 
63         int ( * set ) ( struct config_context *context,
64                         struct config_setting *setting,
65                         const char *value );
66 };
67
68 /** Declare a configuration setting type */
69 #define __config_setting_type \
70         __table ( struct config_setting_type, config_setting_types, 01 )
71
72 /**
73  * A configuration setting
74  *
75  * This represents a single configuration setting (e.g. "hostname").
76  */
77 struct config_setting {
78         /** Name
79          *
80          * This is the human-readable name for the setting.  Where
81          * possible, it should match the name used in dhcpd.conf (see
82          * dhcp-options(5)).
83          */
84         const char *name;
85         /** Description */
86         const char *description;
87         /** DHCP option tag
88          *
89          * This is the DHCP tag used to identify the option in DHCP
90          * packets and stored option blocks.
91          */
92         unsigned int tag;
93         /** Configuration setting type
94          *
95          * This identifies the type of setting (e.g. string, IPv4
96          * address, etc.).
97          */
98         struct config_setting_type *type;
99 };
100
101 /** Declare a configuration setting */
102 #define __config_setting __table ( struct config_setting, config_settings, 01 )
103
104 /**
105  * Show value of setting
106  *
107  * @v context           Configuration context
108  * @v setting           Configuration setting
109  * @v buf               Buffer to contain value
110  * @v len               Length of buffer
111  * @ret len             Length of formatted value, or negative error
112  */
113 static inline int show_setting ( struct config_context *context,
114                                  struct config_setting *setting,
115                                  char *buf, size_t len ) {
116         return setting->type->show ( context, setting, buf, len );
117 }
118
119 extern int set_setting ( struct config_context *context,
120                          struct config_setting *setting,
121                          const char *value );
122
123 /**
124  * Clear setting
125  *
126  * @v context           Configuration context
127  * @v setting           Configuration setting
128  * @ret rc              Return status code
129  */
130 static inline int clear_setting ( struct config_context *context,
131                                   struct config_setting *setting ) {
132         delete_dhcp_option ( context->options, setting->tag );
133         return 0;
134 }
135
136 /* Function prototypes */
137 extern int show_named_setting ( struct config_context *context,
138                                 const char *name, char *buf, size_t len );
139 extern int set_named_setting ( struct config_context *context,
140                                const char *name, const char *value );
141
142 /**
143  * Clear named setting
144  *
145  * @v context           Configuration context
146  * @v name              Configuration setting name
147  * @ret rc              Return status code
148  */
149 static inline int clear_named_setting ( struct config_context *context,
150                                         const char *name ) {
151         return set_named_setting ( context, name, NULL );
152 }
153
154 #endif /* _GPXE_SETTINGS_H */