| #ifndef _GPXE_SETTINGS_H |
| #define _GPXE_SETTINGS_H |
| |
| /** @file |
| * |
| * Configuration settings |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER ); |
| |
| #include <stdint.h> |
| #include <gpxe/tables.h> |
| #include <gpxe/list.h> |
| #include <gpxe/refcnt.h> |
| #include <gpxe/dhcpopts.h> |
| |
| struct settings; |
| struct in_addr; |
| union uuid; |
| |
| /** A setting */ |
| struct setting { |
| /** Name |
| * |
| * This is the human-readable name for the setting. |
| */ |
| const char *name; |
| /** Description */ |
| const char *description; |
| /** Setting type |
| * |
| * This identifies the type of setting (e.g. string, IPv4 |
| * address, etc.). |
| */ |
| struct setting_type *type; |
| /** DHCP option number, if applicable */ |
| unsigned int tag; |
| }; |
| |
| /** Configuration setting table */ |
| #define SETTINGS __table ( struct setting, "settings" ) |
| |
| /** Declare a configuration setting */ |
| #define __setting __table_entry ( SETTINGS, 01 ) |
| |
| /** Settings block operations */ |
| struct settings_operations { |
| /** Store value of setting |
| * |
| * @v settings Settings block |
| * @v setting Setting to store |
| * @v data Setting data, or NULL to clear setting |
| * @v len Length of setting data |
| * @ret rc Return status code |
| */ |
| int ( * store ) ( struct settings *settings, struct setting *setting, |
| const void *data, size_t len ); |
| /** Fetch value of setting |
| * |
| * @v settings Settings block |
| * @v setting Setting to fetch |
| * @v data Buffer to fill with setting data |
| * @v len Length of buffer |
| * @ret len Length of setting data, or negative error |
| * |
| * The actual length of the setting will be returned even if |
| * the buffer was too small. |
| */ |
| int ( * fetch ) ( struct settings *settings, struct setting *setting, |
| void *data, size_t len ); |
| }; |
| |
| /** A settings block */ |
| struct settings { |
| /** Reference counter */ |
| struct refcnt *refcnt; |
| /** Name */ |
| const char *name; |
| /** Tag magic |
| * |
| * This value will be ORed in to any numerical tags |
| * constructed by parse_setting_name(), and can be used to |
| * avoid e.g. attempting to retrieve the subnet mask from |
| * SMBIOS, or the system UUID from DHCP. |
| */ |
| unsigned int tag_magic; |
| /** Parent settings block */ |
| struct settings *parent; |
| /** Sibling settings blocks */ |
| struct list_head siblings; |
| /** Child settings blocks */ |
| struct list_head children; |
| /** Settings block operations */ |
| struct settings_operations *op; |
| }; |
| |
| /** |
| * A setting type |
| * |
| * This represents a type of setting (e.g. string, IPv4 address, |
| * etc.). |
| */ |
| struct setting_type { |
| /** Name |
| * |
| * This is the name exposed to the user (e.g. "string"). |
| */ |
| const char *name; |
| /** Parse and set value of setting |
| * |
| * @v settings Settings block |
| * @v setting Setting to store |
| * @v value Formatted setting data |
| * @ret rc Return status code |
| */ |
| int ( * storef ) ( struct settings *settings, struct setting *setting, |
| const char *value ); |
| /** Fetch and format value of setting |
| * |
| * @v settings Settings block |
| * @v setting Setting to fetch |
| * @v buf Buffer to contain formatted value |
| * @v len Length of buffer |
| * @ret len Length of formatted value, or negative error |
| */ |
| int ( * fetchf ) ( struct settings *settings, struct setting *setting, |
| char *buf, size_t len ); |
| }; |
| |
| /** Configuration setting type table */ |
| #define SETTING_TYPES __table ( struct setting_type, "setting_types" ) |
| |
| /** Declare a configuration setting type */ |
| #define __setting_type __table_entry ( SETTING_TYPES, 01 ) |
| |
| /** |
| * A settings applicator |
| * |
| */ |
| struct settings_applicator { |
| /** Apply updated settings |
| * |
| * @ret rc Return status code |
| */ |
| int ( * apply ) ( void ); |
| }; |
| |
| /** Settings applicator table */ |
| #define SETTINGS_APPLICATORS \ |
| __table ( struct settings_applicator, "settings_applicators" ) |
| |
| /** Declare a settings applicator */ |
| #define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 ) |
| |
| /** |
| * A simple settings block |
| * |
| */ |
| struct simple_settings { |
| /** Settings block */ |
| struct settings settings; |
| /** DHCP options */ |
| struct dhcp_options dhcpopts; |
| }; |
| |
| extern struct settings_operations simple_settings_operations; |
| extern int simple_settings_store ( struct settings *settings, |
| struct setting *setting, |
| const void *data, size_t len ); |
| extern int simple_settings_fetch ( struct settings *settings, |
| struct setting *setting, |
| void *data, size_t len ); |
| |
| extern int register_settings ( struct settings *settings, |
| struct settings *parent ); |
| extern void unregister_settings ( struct settings *settings ); |
| |
| extern int store_setting ( struct settings *settings, struct setting *setting, |
| const void *data, size_t len ); |
| extern int fetch_setting ( struct settings *settings, struct setting *setting, |
| void *data, size_t len ); |
| extern int fetch_setting_len ( struct settings *settings, |
| struct setting *setting ); |
| extern int fetch_string_setting ( struct settings *settings, |
| struct setting *setting, |
| char *data, size_t len ); |
| extern int fetch_string_setting_copy ( struct settings *settings, |
| struct setting *setting, |
| char **data ); |
| extern int fetch_ipv4_setting ( struct settings *settings, |
| struct setting *setting, struct in_addr *inp ); |
| extern int fetch_int_setting ( struct settings *settings, |
| struct setting *setting, long *value ); |
| extern int fetch_uint_setting ( struct settings *settings, |
| struct setting *setting, |
| unsigned long *value ); |
| extern long fetch_intz_setting ( struct settings *settings, |
| struct setting *setting ); |
| extern unsigned long fetch_uintz_setting ( struct settings *settings, |
| struct setting *setting ); |
| extern int fetch_uuid_setting ( struct settings *settings, |
| struct setting *setting, union uuid *uuid ); |
| extern int setting_cmp ( struct setting *a, struct setting *b ); |
| |
| extern struct settings * find_settings ( const char *name ); |
| |
| extern int storef_setting ( struct settings *settings, |
| struct setting *setting, |
| const char *value ); |
| extern int storef_named_setting ( const char *name, const char *value ); |
| extern int fetchf_named_setting ( const char *name, char *buf, size_t len ); |
| |
| extern struct setting_type setting_type_string __setting_type; |
| extern struct setting_type setting_type_ipv4 __setting_type; |
| extern struct setting_type setting_type_int8 __setting_type; |
| extern struct setting_type setting_type_int16 __setting_type; |
| extern struct setting_type setting_type_int32 __setting_type; |
| extern struct setting_type setting_type_uint8 __setting_type; |
| extern struct setting_type setting_type_uint16 __setting_type; |
| extern struct setting_type setting_type_uint32 __setting_type; |
| extern struct setting_type setting_type_hex __setting_type; |
| extern struct setting_type setting_type_uuid __setting_type; |
| |
| extern struct setting ip_setting __setting; |
| extern struct setting netmask_setting __setting; |
| extern struct setting gateway_setting __setting; |
| extern struct setting dns_setting __setting; |
| extern struct setting domain_setting __setting; |
| extern struct setting hostname_setting __setting; |
| extern struct setting filename_setting __setting; |
| extern struct setting root_path_setting __setting; |
| extern struct setting username_setting __setting; |
| extern struct setting password_setting __setting; |
| extern struct setting priority_setting __setting; |
| extern struct setting uuid_setting __setting; |
| extern struct setting next_server_setting __setting; |
| extern struct setting mac_setting __setting; |
| extern struct setting user_class_setting __setting; |
| |
| /** |
| * Initialise a settings block |
| * |
| * @v settings Settings block |
| * @v op Settings block operations |
| * @v refcnt Containing object reference counter, or NULL |
| * @v name Settings block name |
| * @v tag_magic Tag magic |
| */ |
| static inline void settings_init ( struct settings *settings, |
| struct settings_operations *op, |
| struct refcnt *refcnt, |
| const char *name, |
| unsigned int tag_magic ) { |
| INIT_LIST_HEAD ( &settings->siblings ); |
| INIT_LIST_HEAD ( &settings->children ); |
| settings->op = op; |
| settings->refcnt = refcnt; |
| settings->name = name; |
| settings->tag_magic = tag_magic; |
| } |
| |
| /** |
| * Initialise a settings block |
| * |
| * @v simple Simple settings block |
| * @v refcnt Containing object reference counter, or NULL |
| * @v name Settings block name |
| */ |
| static inline void simple_settings_init ( struct simple_settings *simple, |
| struct refcnt *refcnt, |
| const char *name ) { |
| settings_init ( &simple->settings, &simple_settings_operations, |
| refcnt, name, 0 ); |
| } |
| |
| /** |
| * Delete setting |
| * |
| * @v settings Settings block |
| * @v setting Setting to delete |
| * @ret rc Return status code |
| */ |
| static inline int delete_setting ( struct settings *settings, |
| struct setting *setting ) { |
| return store_setting ( settings, setting, NULL, 0 ); |
| } |
| |
| /** |
| * Fetch and format value of setting |
| * |
| * @v settings Settings block, or NULL to search all blocks |
| * @v setting Setting to fetch |
| * @v type Settings type |
| * @v buf Buffer to contain formatted value |
| * @v len Length of buffer |
| * @ret len Length of formatted value, or negative error |
| */ |
| static inline int fetchf_setting ( struct settings *settings, |
| struct setting *setting, |
| char *buf, size_t len ) { |
| return setting->type->fetchf ( settings, setting, buf, len ); |
| } |
| |
| /** |
| * Delete named setting |
| * |
| * @v name Name of setting |
| * @ret rc Return status code |
| */ |
| static inline int delete_named_setting ( const char *name ) { |
| return storef_named_setting ( name, NULL ); |
| } |
| |
| /** |
| * Check existence of setting |
| * |
| * @v settings Settings block, or NULL to search all blocks |
| * @v setting Setting to fetch |
| * @ret exists Setting exists |
| */ |
| static inline int setting_exists ( struct settings *settings, |
| struct setting *setting ) { |
| return ( fetch_setting_len ( settings, setting ) >= 0 ); |
| } |
| |
| #endif /* _GPXE_SETTINGS_H */ |