1#ifndef _GPXE_SETTINGS_H
2#define _GPXE_SETTINGS_H
3
4/** @file
5 *
6 * Configuration settings
7 *
8 */
9
10FILE_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
17struct settings;
18struct in_addr;
19union uuid;
20
21/** A setting */
22struct 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 */
47struct 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 */
79struct 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 */
108struct 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 */
145struct 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 */
164struct generic_settings {
165	/** Settings block */
166	struct settings settings;
167	/** List of generic settings */
168	struct list_head list;
169};
170
171extern struct settings_operations generic_settings_operations;
172extern int generic_settings_store ( struct settings *settings,
173				    struct setting *setting,
174				    const void *data, size_t len );
175extern int generic_settings_fetch ( struct settings *settings,
176				    struct setting *setting,
177				    void *data, size_t len );
178extern void generic_settings_clear ( struct settings *settings );
179
180extern int register_settings ( struct settings *settings,
181			       struct settings *parent );
182extern void unregister_settings ( struct settings *settings );
183
184extern int store_setting ( struct settings *settings, struct setting *setting,
185			   const void *data, size_t len );
186extern int fetch_setting ( struct settings *settings, struct setting *setting,
187			   void *data, size_t len );
188extern int fetch_setting_len ( struct settings *settings,
189			       struct setting *setting );
190extern int fetch_string_setting ( struct settings *settings,
191				  struct setting *setting,
192				  char *data, size_t len );
193extern int fetch_string_setting_copy ( struct settings *settings,
194				       struct setting *setting,
195				       char **data );
196extern int fetch_ipv4_setting ( struct settings *settings,
197				struct setting *setting, struct in_addr *inp );
198extern int fetch_int_setting ( struct settings *settings,
199			       struct setting *setting, long *value );
200extern int fetch_uint_setting ( struct settings *settings,
201				struct setting *setting,
202				unsigned long *value );
203extern long fetch_intz_setting ( struct settings *settings,
204				 struct setting *setting );
205extern unsigned long fetch_uintz_setting ( struct settings *settings,
206					   struct setting *setting );
207extern int fetch_uuid_setting ( struct settings *settings,
208				struct setting *setting, union uuid *uuid );
209extern void clear_settings ( struct settings *settings );
210extern int setting_cmp ( struct setting *a, struct setting *b );
211
212extern struct settings * find_settings ( const char *name );
213
214extern int storef_setting ( struct settings *settings,
215			    struct setting *setting,
216			    const char *value );
217extern int storef_named_setting ( const char *name, const char *value );
218extern int fetchf_named_setting ( const char *name, char *buf, size_t len );
219
220extern struct setting_type setting_type_string __setting_type;
221extern struct setting_type setting_type_ipv4 __setting_type;
222extern struct setting_type setting_type_int8 __setting_type;
223extern struct setting_type setting_type_int16 __setting_type;
224extern struct setting_type setting_type_int32 __setting_type;
225extern struct setting_type setting_type_uint8 __setting_type;
226extern struct setting_type setting_type_uint16 __setting_type;
227extern struct setting_type setting_type_uint32 __setting_type;
228extern struct setting_type setting_type_hex __setting_type;
229extern struct setting_type setting_type_uuid __setting_type;
230
231extern struct setting ip_setting __setting;
232extern struct setting netmask_setting __setting;
233extern struct setting gateway_setting __setting;
234extern struct setting dns_setting __setting;
235extern struct setting domain_setting __setting;
236extern struct setting hostname_setting __setting;
237extern struct setting filename_setting __setting;
238extern struct setting root_path_setting __setting;
239extern struct setting username_setting __setting;
240extern struct setting password_setting __setting;
241extern struct setting priority_setting __setting;
242extern struct setting uuid_setting __setting;
243extern struct setting next_server_setting __setting;
244extern struct setting mac_setting __setting;
245extern struct setting busid_setting __setting;
246extern 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 */
257static 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 */
277static 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 */
292static 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 */
307static 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 */
319static 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 */
330static 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