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>
18 /** Settings block operations */
19 struct settings_operations {
20 /** Store value of setting
22 * @v settings Settings block
23 * @v tag Setting tag number
24 * @v data Setting data, or NULL to clear setting
25 * @v len Length of setting data
26 * @ret rc Return status code
28 int ( * store ) ( struct settings *settings, unsigned int tag,
29 const void *data, size_t len );
30 /** Fetch value of setting
32 * @v settings Settings block
33 * @v tag Setting tag number
34 * @v data Buffer to fill with setting data
35 * @v len Length of buffer
36 * @ret len Length of setting data, or negative error
38 * The actual length of the setting will be returned even if
39 * the buffer was too small.
41 int ( * fetch ) ( struct settings *settings, unsigned int tag,
42 void *data, size_t len );
45 /** A settings block */
47 /** Reference counter */
48 struct refcnt *refcnt;
51 /** Parent settings block */
52 struct settings *parent;
53 /** Sibling settings blocks */
54 struct list_head siblings;
55 /** Child settings blocks */
56 struct list_head children;
57 /** Settings block operations */
58 struct settings_operations *op;
64 * This represents a type of setting (e.g. string, IPv4 address,
70 * This is the name exposed to the user (e.g. "string").
73 /** Parse and set value of setting
75 * @v settings Settings block
76 * @v tag Setting tag number
77 * @v value Formatted setting data
78 * @ret rc Return status code
80 int ( * storef ) ( struct settings *settings, unsigned int tag,
82 /** Fetch and format value of setting
84 * @v settings Settings block, or NULL to search all blocks
85 * @v tag Setting tag number
86 * @v buf Buffer to contain formatted value
87 * @v len Length of buffer
88 * @ret len Length of formatted value, or negative error
90 int ( * fetchf ) ( struct settings *settings, unsigned int tag,
91 char *buf, size_t len );
94 /** Declare a configuration setting type */
95 #define __setting_type \
96 __table ( struct setting_type, setting_types, 01 )
101 * This represents a single setting (e.g. "hostname"), encapsulating
102 * the information about the setting's tag number and type.
104 struct named_setting {
107 * This is the human-readable name for the setting.
111 const char *description;
112 /** Setting tag number */
116 * This identifies the type of setting (e.g. string, IPv4
119 struct setting_type *type;
122 /** Declare a configuration setting */
123 #define __named_setting __table ( struct named_setting, named_settings, 01 )
125 extern int simple_settings_store ( struct settings *settings, unsigned int tag,
126 const void *data, size_t len );
127 extern int simple_settings_fetch ( struct settings *settings, unsigned int tag,
128 void *data, size_t len );
129 extern struct settings_operations simple_settings_operations;
131 extern int register_settings ( struct settings *settings,
132 struct settings *parent );
133 extern void unregister_settings ( struct settings *settings );
134 extern int fetch_setting ( struct settings *settings, unsigned int tag,
135 void *data, size_t len );
136 extern int fetch_setting_len ( struct settings *settings, unsigned int tag );
137 extern int fetch_string_setting ( struct settings *settings, unsigned int tag,
138 char *data, size_t len );
139 extern int fetch_ipv4_setting ( struct settings *settings, unsigned int tag,
140 struct in_addr *inp );
141 extern int fetch_int_setting ( struct settings *settings, unsigned int tag,
143 extern int fetch_uint_setting ( struct settings *settings, unsigned int tag,
144 unsigned long *value );
145 extern struct settings * find_settings ( const char *name );
146 extern int store_typed_setting ( struct settings *settings,
147 unsigned int tag, struct setting_type *type,
149 extern int store_named_setting ( const char *name, const char *value );
150 extern int fetch_named_setting ( const char *name, char *buf, size_t len );
152 extern struct setting_type setting_type_ __setting_type;
153 extern struct setting_type setting_type_string __setting_type;
154 extern struct setting_type setting_type_ipv4 __setting_type;
155 extern struct setting_type setting_type_int8 __setting_type;
156 extern struct setting_type setting_type_int16 __setting_type;
157 extern struct setting_type setting_type_int32 __setting_type;
158 extern struct setting_type setting_type_uint8 __setting_type;
159 extern struct setting_type setting_type_uint16 __setting_type;
160 extern struct setting_type setting_type_uint32 __setting_type;
161 extern struct setting_type setting_type_hex __setting_type;
164 * Initialise a settings block
166 * @v settings Settings block
167 * @v op Settings block operations
168 * @v refcnt Containing object reference counter, or NULL
169 * @v name Settings block name
171 static inline void settings_init ( struct settings *settings,
172 struct settings_operations *op,
173 struct refcnt *refcnt,
175 INIT_LIST_HEAD ( &settings->siblings );
176 INIT_LIST_HEAD ( &settings->children );
178 settings->refcnt = refcnt;
179 settings->name = name;
183 * Store value of setting
185 * @v settings Settings block
186 * @v tag Setting tag number
187 * @v data Setting data, or NULL to clear setting
188 * @v len Length of setting data
189 * @ret rc Return status code
191 static inline int store_setting ( struct settings *settings, unsigned int tag,
192 const void *data, size_t len ) {
193 return settings->op->store ( settings, tag, data, len );
199 * @v settings Settings block
200 * @v tag Setting tag number
201 * @ret rc Return status code
203 static inline int delete_setting ( struct settings *settings,
205 return store_setting ( settings, tag, NULL, 0 );
209 * Fetch and format value of setting
211 * @v settings Settings block, or NULL to search all blocks
212 * @v tag Setting tag number
213 * @v type Settings type
214 * @v buf Buffer to contain formatted value
215 * @v len Length of buffer
216 * @ret len Length of formatted value, or negative error
218 static inline int fetch_typed_setting ( struct settings *settings,
220 struct setting_type *type,
221 char *buf, size_t len ) {
222 return type->fetchf ( settings, tag, buf, len );
226 * Delete named setting
228 * @v name Name of setting
229 * @ret rc Return status code
231 static inline int delete_named_setting ( const char *name ) {
232 return store_named_setting ( name, NULL );
235 #endif /* _GPXE_SETTINGS_H */