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