1 #ifndef _GPXE_SETTINGS_H
2 #define _GPXE_SETTINGS_H
6 * Configuration settings
11 #include <gpxe/tables.h>
12 #include <gpxe/list.h>
13 #include <gpxe/refcnt.h>
14 #include <gpxe/dhcpopts.h>
24 * This is the human-readable name for the setting.
28 const char *description;
31 * This identifies the type of setting (e.g. string, IPv4
34 struct setting_type *type;
35 /** DHCP option number, if applicable */
39 /** Declare a configuration setting */
40 #define __setting __table ( struct setting, settings, 01 )
42 /** Settings block operations */
43 struct settings_operations {
44 /** Store value of setting
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
52 int ( * store ) ( struct settings *settings, struct setting *setting,
53 const void *data, size_t len );
54 /** Fetch value of setting
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
62 * The actual length of the setting will be returned even if
63 * the buffer was too small.
65 int ( * fetch ) ( struct settings *settings, struct setting *setting,
66 void *data, size_t len );
69 /** A settings block */
71 /** Reference counter */
72 struct refcnt *refcnt;
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;
88 * This represents a type of setting (e.g. string, IPv4 address,
94 * This is the name exposed to the user (e.g. "string").
97 /** Parse and set value of setting
99 * @v settings Settings block
100 * @v setting Setting to store
101 * @v value Formatted setting data
102 * @ret rc Return status code
104 int ( * storef ) ( struct settings *settings, struct setting *setting,
106 /** Fetch and format value of setting
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
114 int ( * fetchf ) ( struct settings *settings, struct setting *setting,
115 char *buf, size_t len );
118 /** Declare a configuration setting type */
119 #define __setting_type \
120 __table ( struct setting_type, setting_types, 01 )
123 * A settings applicator
126 struct settings_applicator {
127 /** Apply updated settings
129 * @ret rc Return status code
131 int ( * apply ) ( void );
134 /** Declare a settings applicator */
135 #define __settings_applicator \
136 __table ( struct settings_applicator, settings_applicators, 01 )
139 * A simple settings block
142 struct simple_settings {
143 /** Settings block */
144 struct settings settings;
146 struct dhcp_options dhcpopts;
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 );
157 extern int register_settings ( struct settings *settings,
158 struct settings *parent );
159 extern void unregister_settings ( struct settings *settings );
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 );
185 extern struct settings * find_child_settings ( struct settings *parent,
187 extern struct settings * find_settings ( const char *name );
189 extern int storef_setting ( struct settings *settings,
190 struct setting *setting,
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 );
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;
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 extern struct setting next_server_setting __setting;
219 extern struct setting mac_setting __setting;
222 * Initialise a settings block
224 * @v settings Settings block
225 * @v op Settings block operations
226 * @v refcnt Containing object reference counter, or NULL
227 * @v name Settings block name
229 static inline void settings_init ( struct settings *settings,
230 struct settings_operations *op,
231 struct refcnt *refcnt,
233 INIT_LIST_HEAD ( &settings->siblings );
234 INIT_LIST_HEAD ( &settings->children );
236 settings->refcnt = refcnt;
237 settings->name = name;
241 * Initialise a settings block
243 * @v simple Simple settings block
244 * @v refcnt Containing object reference counter, or NULL
245 * @v name Settings block name
247 static inline void simple_settings_init ( struct simple_settings *simple,
248 struct refcnt *refcnt,
250 settings_init ( &simple->settings, &simple_settings_operations,
257 * @v settings Settings block
258 * @v setting Setting to delete
259 * @ret rc Return status code
261 static inline int delete_setting ( struct settings *settings,
262 struct setting *setting ) {
263 return store_setting ( settings, setting, NULL, 0 );
267 * Fetch and format value of setting
269 * @v settings Settings block, or NULL to search all blocks
270 * @v setting Setting to fetch
271 * @v type Settings type
272 * @v buf Buffer to contain formatted value
273 * @v len Length of buffer
274 * @ret len Length of formatted value, or negative error
276 static inline int fetchf_setting ( struct settings *settings,
277 struct setting *setting,
278 char *buf, size_t len ) {
279 return setting->type->fetchf ( settings, setting, buf, len );
283 * Delete named setting
285 * @v name Name of setting
286 * @ret rc Return status code
288 static inline int delete_named_setting ( const char *name ) {
289 return storef_named_setting ( name, NULL );
292 #endif /* _GPXE_SETTINGS_H */