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