1 #ifndef _GPXE_SETTINGS_H
2 #define _GPXE_SETTINGS_H
3 
4 /** @file
5  *
6  * Configuration settings
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER );
11 
12 #include <stdint.h>
13 #include <gpxe/tables.h>
14 #include <gpxe/list.h>
15 #include <gpxe/refcnt.h>
16 
17 struct settings;
18 struct in_addr;
19 union uuid;
20 
21 /** A setting */
22 struct setting {
23 	/** Name
24 	 *
25 	 * This is the human-readable name for the setting.
26 	 */
27 	const char *name;
28 	/** Description */
29 	const char *description;
30 	/** Setting type
31 	 *
32 	 * This identifies the type of setting (e.g. string, IPv4
33 	 * address, etc.).
34 	 */
35 	struct setting_type *type;
36 	/** DHCP option number, if applicable */
37 	unsigned int tag;
38 };
39 
40 /** Configuration setting table */
41 #define SETTINGS __table ( struct setting, "settings" )
42 
43 /** Declare a configuration setting */
44 #define __setting __table_entry ( SETTINGS, 01 )
45 
46 /** Settings block operations */
47 struct settings_operations {
48 	/** Store value of setting
49 	 *
50 	 * @v settings		Settings block
51 	 * @v setting		Setting to store
52 	 * @v data		Setting data, or NULL to clear setting
53 	 * @v len		Length of setting data
54 	 * @ret rc		Return status code
55 	 */
56 	int ( * store ) ( struct settings *settings, struct setting *setting,
57 			  const void *data, size_t len );
58 	/** Fetch value of setting
59 	 *
60 	 * @v settings		Settings block
61 	 * @v setting		Setting to fetch
62 	 * @v data		Buffer to fill with setting data
63 	 * @v len		Length of buffer
64 	 * @ret len		Length of setting data, or negative error
65 	 *
66 	 * The actual length of the setting will be returned even if
67 	 * the buffer was too small.
68 	 */
69 	int ( * fetch ) ( struct settings *settings, struct setting *setting,
70 			  void *data, size_t len );
71 	/** Clear settings block
72 	 *
73 	 * @v settings		Settings block
74 	 */
75 	void ( * clear ) ( struct settings *settings );
76 };
77 
78 /** A settings block */
79 struct settings {
80 	/** Reference counter */
81 	struct refcnt *refcnt;
82 	/** Name */
83 	const char *name;
84 	/** Tag magic
85 	 *
86 	 * This value will be ORed in to any numerical tags
87 	 * constructed by parse_setting_name(), and can be used to
88 	 * avoid e.g. attempting to retrieve the subnet mask from
89 	 * SMBIOS, or the system UUID from DHCP.
90 	 */
91 	unsigned int tag_magic;
92 	/** Parent settings block */
93 	struct settings *parent;
94 	/** Sibling settings blocks */
95 	struct list_head siblings;
96 	/** Child settings blocks */
97 	struct list_head children;
98 	/** Settings block operations */
99 	struct settings_operations *op;
100 };
101 
102 /**
103  * A setting type
104  *
105  * This represents a type of setting (e.g. string, IPv4 address,
106  * etc.).
107  */
108 struct setting_type {
109 	/** Name
110 	 *
111 	 * This is the name exposed to the user (e.g. "string").
112 	 */
113 	const char *name;
114 	/** Parse and set value of setting
115 	 *
116 	 * @v settings		Settings block
117 	 * @v setting		Setting to store
118 	 * @v value		Formatted setting data
119 	 * @ret rc		Return status code
120 	 */
121 	int ( * storef ) ( struct settings *settings, struct setting *setting,
122 			   const char *value );
123 	/** Fetch and format value of setting
124 	 *
125 	 * @v settings		Settings block
126 	 * @v setting		Setting to fetch
127 	 * @v buf		Buffer to contain formatted value
128 	 * @v len		Length of buffer
129 	 * @ret len		Length of formatted value, or negative error
130 	 */
131 	int ( * fetchf ) ( struct settings *settings, struct setting *setting,
132 			   char *buf, size_t len );
133 };
134 
135 /** Configuration setting type table */
136 #define SETTING_TYPES __table ( struct setting_type, "setting_types" )
137 
138 /** Declare a configuration setting type */
139 #define __setting_type __table_entry ( SETTING_TYPES, 01 )
140 
141 /**
142  * A settings applicator
143  *
144  */
145 struct settings_applicator {
146 	/** Apply updated settings
147 	 *
148 	 * @ret rc		Return status code
149 	 */
150 	int ( * apply ) ( void );
151 };
152 
153 /** Settings applicator table */
154 #define SETTINGS_APPLICATORS \
155 	__table ( struct settings_applicator, "settings_applicators" )
156 
157 /** Declare a settings applicator */
158 #define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 )
159 
160 /**
161  * A generic settings block
162  *
163  */
164 struct generic_settings {
165 	/** Settings block */
166 	struct settings settings;
167 	/** List of generic settings */
168 	struct list_head list;
169 };
170 
171 extern struct settings_operations generic_settings_operations;
172 extern int generic_settings_store ( struct settings *settings,
173 				    struct setting *setting,
174 				    const void *data, size_t len );
175 extern int generic_settings_fetch ( struct settings *settings,
176 				    struct setting *setting,
177 				    void *data, size_t len );
178 extern void generic_settings_clear ( struct settings *settings );
179 
180 extern int register_settings ( struct settings *settings,
181 			       struct settings *parent );
182 extern void unregister_settings ( struct settings *settings );
183 
184 extern int store_setting ( struct settings *settings, struct setting *setting,
185 			   const void *data, size_t len );
186 extern int fetch_setting ( struct settings *settings, struct setting *setting,
187 			   void *data, size_t len );
188 extern int fetch_setting_len ( struct settings *settings,
189 			       struct setting *setting );
190 extern int fetch_string_setting ( struct settings *settings,
191 				  struct setting *setting,
192 				  char *data, size_t len );
193 extern int fetch_string_setting_copy ( struct settings *settings,
194 				       struct setting *setting,
195 				       char **data );
196 extern int fetch_ipv4_setting ( struct settings *settings,
197 				struct setting *setting, struct in_addr *inp );
198 extern int fetch_int_setting ( struct settings *settings,
199 			       struct setting *setting, long *value );
200 extern int fetch_uint_setting ( struct settings *settings,
201 				struct setting *setting,
202 				unsigned long *value );
203 extern long fetch_intz_setting ( struct settings *settings,
204 				 struct setting *setting );
205 extern unsigned long fetch_uintz_setting ( struct settings *settings,
206 					   struct setting *setting );
207 extern int fetch_uuid_setting ( struct settings *settings,
208 				struct setting *setting, union uuid *uuid );
209 extern void clear_settings ( struct settings *settings );
210 extern int setting_cmp ( struct setting *a, struct setting *b );
211 
212 extern struct settings * find_settings ( const char *name );
213 
214 extern int storef_setting ( struct settings *settings,
215 			    struct setting *setting,
216 			    const char *value );
217 extern int storef_named_setting ( const char *name, const char *value );
218 extern int fetchf_named_setting ( const char *name, char *buf, size_t len );
219 
220 extern struct setting_type setting_type_string __setting_type;
221 extern struct setting_type setting_type_ipv4 __setting_type;
222 extern struct setting_type setting_type_int8 __setting_type;
223 extern struct setting_type setting_type_int16 __setting_type;
224 extern struct setting_type setting_type_int32 __setting_type;
225 extern struct setting_type setting_type_uint8 __setting_type;
226 extern struct setting_type setting_type_uint16 __setting_type;
227 extern struct setting_type setting_type_uint32 __setting_type;
228 extern struct setting_type setting_type_hex __setting_type;
229 extern struct setting_type setting_type_uuid __setting_type;
230 
231 extern struct setting ip_setting __setting;
232 extern struct setting netmask_setting __setting;
233 extern struct setting gateway_setting __setting;
234 extern struct setting dns_setting __setting;
235 extern struct setting domain_setting __setting;
236 extern struct setting hostname_setting __setting;
237 extern struct setting filename_setting __setting;
238 extern struct setting root_path_setting __setting;
239 extern struct setting username_setting __setting;
240 extern struct setting password_setting __setting;
241 extern struct setting priority_setting __setting;
242 extern struct setting uuid_setting __setting;
243 extern struct setting next_server_setting __setting;
244 extern struct setting mac_setting __setting;
245 extern struct setting busid_setting __setting;
246 extern struct setting user_class_setting __setting;
247 
248 /**
249  * Initialise a settings block
250  *
251  * @v settings		Settings block
252  * @v op		Settings block operations
253  * @v refcnt		Containing object reference counter, or NULL
254  * @v name		Settings block name
255  * @v tag_magic		Tag magic
256  */
settings_init(struct settings * settings,struct settings_operations * op,struct refcnt * refcnt,const char * name,unsigned int tag_magic)257 static inline void settings_init ( struct settings *settings,
258 				   struct settings_operations *op,
259 				   struct refcnt *refcnt,
260 				   const char *name,
261 				   unsigned int tag_magic ) {
262 	INIT_LIST_HEAD ( &settings->siblings );
263 	INIT_LIST_HEAD ( &settings->children );
264 	settings->op = op;
265 	settings->refcnt = refcnt;
266 	settings->name = name;
267 	settings->tag_magic = tag_magic;
268 }
269 
270 /**
271  * Initialise a settings block
272  *
273  * @v generics		Generic settings block
274  * @v refcnt		Containing object reference counter, or NULL
275  * @v name		Settings block name
276  */
generic_settings_init(struct generic_settings * generics,struct refcnt * refcnt,const char * name)277 static inline void generic_settings_init ( struct generic_settings *generics,
278 					   struct refcnt *refcnt,
279 					   const char *name ) {
280 	settings_init ( &generics->settings, &generic_settings_operations,
281 			refcnt, name, 0 );
282 	INIT_LIST_HEAD ( &generics->list );
283 }
284 
285 /**
286  * Delete setting
287  *
288  * @v settings		Settings block
289  * @v setting		Setting to delete
290  * @ret rc		Return status code
291  */
delete_setting(struct settings * settings,struct setting * setting)292 static inline int delete_setting ( struct settings *settings,
293 				   struct setting *setting ) {
294 	return store_setting ( settings, setting, NULL, 0 );
295 }
296 
297 /**
298  * Fetch and format value of setting
299  *
300  * @v settings		Settings block, or NULL to search all blocks
301  * @v setting		Setting to fetch
302  * @v type		Settings type
303  * @v buf		Buffer to contain formatted value
304  * @v len		Length of buffer
305  * @ret len		Length of formatted value, or negative error
306  */
fetchf_setting(struct settings * settings,struct setting * setting,char * buf,size_t len)307 static inline int fetchf_setting ( struct settings *settings,
308 				   struct setting *setting,
309 				   char *buf, size_t len ) {
310 	return setting->type->fetchf ( settings, setting, buf, len );
311 }
312 
313 /**
314  * Delete named setting
315  *
316  * @v name		Name of setting
317  * @ret rc		Return status code
318  */
delete_named_setting(const char * name)319 static inline int delete_named_setting ( const char *name ) {
320 	return storef_named_setting ( name, NULL );
321 }
322 
323 /**
324  * Check existence of setting
325  *
326  * @v settings		Settings block, or NULL to search all blocks
327  * @v setting		Setting to fetch
328  * @ret exists		Setting exists
329  */
setting_exists(struct settings * settings,struct setting * setting)330 static inline int setting_exists ( struct settings *settings,
331 				   struct setting *setting ) {
332 	return ( fetch_setting_len ( settings, setting ) >= 0 );
333 }
334 
335 #endif /* _GPXE_SETTINGS_H */
336