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