[Settings] Expose SMBIOS via settings API
[people/mdeck/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/tables.h>
12 #include <gpxe/list.h>
13 #include <gpxe/refcnt.h>
14 #include <gpxe/dhcpopts.h>
15
16 struct settings;
17 struct in_addr;
18 union uuid;
19
20 /** A setting */
21 struct setting {
22         /** Name
23          *
24          * This is the human-readable name for the setting.
25          */
26         const char *name;
27         /** Description */
28         const char *description;
29         /** Setting type
30          *
31          * This identifies the type of setting (e.g. string, IPv4
32          * address, etc.).
33          */
34         struct setting_type *type;
35         /** DHCP option number, if applicable */
36         unsigned int tag;
37 };
38
39 /** Declare a configuration setting */
40 #define __setting __table ( struct setting, settings, 01 )
41
42 /** Settings block operations */
43 struct settings_operations {
44         /** Store value of setting
45          *
46          * @v settings          Settings block
47          * @v setting           Setting to store
48          * @v data              Setting data, or NULL to clear setting
49          * @v len               Length of setting data
50          * @ret rc              Return status code
51          */
52         int ( * store ) ( struct settings *settings, struct setting *setting,
53                           const void *data, size_t len );
54         /** Fetch value of setting
55          *
56          * @v settings          Settings block
57          * @v setting           Setting to fetch
58          * @v data              Buffer to fill with setting data
59          * @v len               Length of buffer
60          * @ret len             Length of setting data, or negative error
61          *
62          * The actual length of the setting will be returned even if
63          * the buffer was too small.
64          */
65         int ( * fetch ) ( struct settings *settings, struct setting *setting,
66                           void *data, size_t len );
67 };
68
69 /** A settings block */
70 struct settings {
71         /** Reference counter */
72         struct refcnt *refcnt;
73         /** Name */
74         const char *name;
75         /** Parent settings block */
76         struct settings *parent;
77         /** Sibling settings blocks */
78         struct list_head siblings;
79         /** Child settings blocks */
80         struct list_head children;
81         /** Settings block operations */
82         struct settings_operations *op;
83 };
84
85 /**
86  * A setting type
87  *
88  * This represents a type of setting (e.g. string, IPv4 address,
89  * etc.).
90  */
91 struct setting_type {
92         /** Name
93          *
94          * This is the name exposed to the user (e.g. "string").
95          */
96         const char *name;
97         /** Parse and set value of setting
98          *
99          * @v settings          Settings block
100          * @v setting           Setting to store
101          * @v value             Formatted setting data
102          * @ret rc              Return status code
103          */
104         int ( * storef ) ( struct settings *settings, struct setting *setting,
105                            const char *value );
106         /** Fetch and format value of setting
107          *
108          * @v settings          Settings block
109          * @v setting           Setting to fetch
110          * @v buf               Buffer to contain formatted value
111          * @v len               Length of buffer
112          * @ret len             Length of formatted value, or negative error
113          */
114         int ( * fetchf ) ( struct settings *settings, struct setting *setting,
115                            char *buf, size_t len );
116 };
117
118 /** Declare a configuration setting type */
119 #define __setting_type \
120         __table ( struct setting_type, setting_types, 01 )
121
122 /**
123  * A settings applicator
124  *
125  */
126 struct settings_applicator {
127         /** Apply updated settings
128          *
129          * @ret rc              Return status code
130          */
131         int ( * apply ) ( void );
132 };
133
134 /** Declare a settings applicator */
135 #define __settings_applicator \
136         __table ( struct settings_applicator, settings_applicators, 01 )
137
138 /**
139  * A simple settings block
140  *
141  */
142 struct simple_settings {
143         /** Settings block */
144         struct settings settings;
145         /** DHCP options */
146         struct dhcp_options dhcpopts;
147 };
148
149 extern struct settings_operations simple_settings_operations;
150 extern int simple_settings_store ( struct settings *settings,
151                                    struct setting *setting,
152                                    const void *data, size_t len );
153 extern int simple_settings_fetch ( struct settings *settings,
154                                    struct setting *setting,
155                                    void *data, size_t len );
156
157 extern int register_settings ( struct settings *settings,
158                                struct settings *parent );
159 extern void unregister_settings ( struct settings *settings );
160
161 extern int store_setting ( struct settings *settings, struct setting *setting,
162                            const void *data, size_t len );
163 extern int fetch_setting ( struct settings *settings, struct setting *setting,
164                            void *data, size_t len );
165 extern int fetch_setting_len ( struct settings *settings,
166                                struct setting *setting );
167 extern int fetch_string_setting ( struct settings *settings,
168                                   struct setting *setting,
169                                   char *data, size_t len );
170 extern int fetch_ipv4_setting ( struct settings *settings,
171                                 struct setting *setting, struct in_addr *inp );
172 extern int fetch_int_setting ( struct settings *settings,
173                                struct setting *setting, long *value );
174 extern int fetch_uint_setting ( struct settings *settings,
175                                 struct setting *setting,
176                                 unsigned long *value );
177 extern long fetch_intz_setting ( struct settings *settings,
178                                  struct setting *setting );
179 extern unsigned long fetch_uintz_setting ( struct settings *settings,
180                                            struct setting *setting );
181 extern int fetch_uuid_setting ( struct settings *settings,
182                                 struct setting *setting, union uuid *uuid );
183 extern int setting_cmp ( struct setting *a, struct setting *b );
184
185 extern struct settings * find_child_settings ( struct settings *parent,
186                                                const char *name );
187 extern struct settings * find_settings ( const char *name );
188
189 extern int storef_setting ( struct settings *settings,
190                             struct setting *setting,
191                             const char *value );
192 extern int storef_named_setting ( const char *name, const char *value );
193 extern int fetchf_named_setting ( const char *name, char *buf, size_t len );
194
195 extern struct setting_type setting_type_string __setting_type;
196 extern struct setting_type setting_type_ipv4 __setting_type;
197 extern struct setting_type setting_type_int8 __setting_type;
198 extern struct setting_type setting_type_int16 __setting_type;
199 extern struct setting_type setting_type_int32 __setting_type;
200 extern struct setting_type setting_type_uint8 __setting_type;
201 extern struct setting_type setting_type_uint16 __setting_type;
202 extern struct setting_type setting_type_uint32 __setting_type;
203 extern struct setting_type setting_type_hex __setting_type;
204 extern struct setting_type setting_type_uuid __setting_type;
205
206 extern struct setting ip_setting __setting;
207 extern struct setting netmask_setting __setting;
208 extern struct setting gateway_setting __setting;
209 extern struct setting dns_setting __setting;
210 extern struct setting hostname_setting __setting;
211 extern struct setting filename_setting __setting;
212 extern struct setting root_path_setting __setting;
213 extern struct setting username_setting __setting;
214 extern struct setting password_setting __setting;
215 extern struct setting priority_setting __setting;
216 extern struct setting bios_drive_setting __setting;
217 extern struct setting uuid_setting __setting;
218
219 /**
220  * Initialise a settings block
221  *
222  * @v settings          Settings block
223  * @v op                Settings block operations
224  * @v refcnt            Containing object reference counter, or NULL
225  * @v name              Settings block name
226  */
227 static inline void settings_init ( struct settings *settings,
228                                    struct settings_operations *op,
229                                    struct refcnt *refcnt,
230                                    const char *name ) {
231         INIT_LIST_HEAD ( &settings->siblings );
232         INIT_LIST_HEAD ( &settings->children );
233         settings->op = op;
234         settings->refcnt = refcnt;
235         settings->name = name;
236 }
237
238 /**
239  * Initialise a settings block
240  *
241  * @v simple            Simple settings block
242  * @v refcnt            Containing object reference counter, or NULL
243  * @v name              Settings block name
244  */
245 static inline void simple_settings_init ( struct simple_settings *simple,
246                                           struct refcnt *refcnt,
247                                           const char *name ) {
248         settings_init ( &simple->settings, &simple_settings_operations,
249                         refcnt, name );
250 }
251
252 /**
253  * Delete setting
254  *
255  * @v settings          Settings block
256  * @v setting           Setting to delete
257  * @ret rc              Return status code
258  */
259 static inline int delete_setting ( struct settings *settings,
260                                    struct setting *setting ) {
261         return store_setting ( settings, setting, NULL, 0 );
262 }
263
264 /**
265  * Fetch and format value of setting
266  *
267  * @v settings          Settings block, or NULL to search all blocks
268  * @v setting           Setting to fetch
269  * @v type              Settings type
270  * @v buf               Buffer to contain formatted value
271  * @v len               Length of buffer
272  * @ret len             Length of formatted value, or negative error
273  */
274 static inline int fetchf_setting ( struct settings *settings,
275                                    struct setting *setting,
276                                    char *buf, size_t len ) {
277         return setting->type->fetchf ( settings, setting, buf, len );
278 }
279
280 /**
281  * Delete named setting
282  *
283  * @v name              Name of setting
284  * @ret rc              Return status code
285  */
286 static inline int delete_named_setting ( const char *name ) {
287         return storef_named_setting ( name, NULL );
288 }
289
290 #endif /* _GPXE_SETTINGS_H */