settings.h

Go to the documentation of this file.
00001 #ifndef _GPXE_SETTINGS_H
00002 #define _GPXE_SETTINGS_H
00003 
00004 /** @file
00005  *
00006  * Configuration settings
00007  *
00008  */
00009 
00010 FILE_LICENCE ( GPL2_OR_LATER );
00011 
00012 #include <stdint.h>
00013 #include <gpxe/tables.h>
00014 #include <gpxe/list.h>
00015 #include <gpxe/refcnt.h>
00016 
00017 struct settings;
00018 struct in_addr;
00019 union uuid;
00020 
00021 /** A setting */
00022 struct setting {
00023         /** Name
00024          *
00025          * This is the human-readable name for the setting.
00026          */
00027         const char *name;
00028         /** Description */
00029         const char *description;
00030         /** Setting type
00031          *
00032          * This identifies the type of setting (e.g. string, IPv4
00033          * address, etc.).
00034          */
00035         struct setting_type *type;
00036         /** DHCP option number, if applicable */
00037         unsigned int tag;
00038 };
00039 
00040 /** Configuration setting table */
00041 #define SETTINGS __table ( struct setting, "settings" )
00042 
00043 /** Declare a configuration setting */
00044 #define __setting __table_entry ( SETTINGS, 01 )
00045 
00046 /** Settings block operations */
00047 struct settings_operations {
00048         /** Store value of setting
00049          *
00050          * @v settings          Settings block
00051          * @v setting           Setting to store
00052          * @v data              Setting data, or NULL to clear setting
00053          * @v len               Length of setting data
00054          * @ret rc              Return status code
00055          */
00056         int ( * store ) ( struct settings *settings, struct setting *setting,
00057                           const void *data, size_t len );
00058         /** Fetch value of setting
00059          *
00060          * @v settings          Settings block
00061          * @v setting           Setting to fetch
00062          * @v data              Buffer to fill with setting data
00063          * @v len               Length of buffer
00064          * @ret len             Length of setting data, or negative error
00065          *
00066          * The actual length of the setting will be returned even if
00067          * the buffer was too small.
00068          */
00069         int ( * fetch ) ( struct settings *settings, struct setting *setting,
00070                           void *data, size_t len );
00071         /** Clear settings block
00072          *
00073          * @v settings          Settings block
00074          */
00075         void ( * clear ) ( struct settings *settings );
00076 };
00077 
00078 /** A settings block */
00079 struct settings {
00080         /** Reference counter */
00081         struct refcnt *refcnt;
00082         /** Name */
00083         const char *name;
00084         /** Tag magic
00085          *
00086          * This value will be ORed in to any numerical tags
00087          * constructed by parse_setting_name(), and can be used to
00088          * avoid e.g. attempting to retrieve the subnet mask from
00089          * SMBIOS, or the system UUID from DHCP.
00090          */
00091         unsigned int tag_magic;
00092         /** Parent settings block */
00093         struct settings *parent;
00094         /** Sibling settings blocks */
00095         struct list_head siblings;
00096         /** Child settings blocks */
00097         struct list_head children;
00098         /** Settings block operations */
00099         struct settings_operations *op;
00100 };
00101 
00102 /**
00103  * A setting type
00104  *
00105  * This represents a type of setting (e.g. string, IPv4 address,
00106  * etc.).
00107  */
00108 struct setting_type {
00109         /** Name
00110          *
00111          * This is the name exposed to the user (e.g. "string").
00112          */
00113         const char *name;
00114         /** Parse and set value of setting
00115          *
00116          * @v settings          Settings block
00117          * @v setting           Setting to store
00118          * @v value             Formatted setting data
00119          * @ret rc              Return status code
00120          */
00121         int ( * storef ) ( struct settings *settings, struct setting *setting,
00122                            const char *value );
00123         /** Fetch and format value of setting
00124          *
00125          * @v settings          Settings block
00126          * @v setting           Setting to fetch
00127          * @v buf               Buffer to contain formatted value
00128          * @v len               Length of buffer
00129          * @ret len             Length of formatted value, or negative error
00130          */
00131         int ( * fetchf ) ( struct settings *settings, struct setting *setting,
00132                            char *buf, size_t len );
00133 };
00134 
00135 /** Configuration setting type table */
00136 #define SETTING_TYPES __table ( struct setting_type, "setting_types" )
00137 
00138 /** Declare a configuration setting type */
00139 #define __setting_type __table_entry ( SETTING_TYPES, 01 )
00140 
00141 /**
00142  * A settings applicator
00143  *
00144  */
00145 struct settings_applicator {
00146         /** Apply updated settings
00147          *
00148          * @ret rc              Return status code
00149          */
00150         int ( * apply ) ( void );
00151 };
00152 
00153 /** Settings applicator table */
00154 #define SETTINGS_APPLICATORS \
00155         __table ( struct settings_applicator, "settings_applicators" )
00156 
00157 /** Declare a settings applicator */
00158 #define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 )
00159 
00160 /**
00161  * A generic settings block
00162  *
00163  */
00164 struct generic_settings {
00165         /** Settings block */
00166         struct settings settings;
00167         /** List of generic settings */
00168         struct list_head list;
00169 };
00170 
00171 extern struct settings_operations generic_settings_operations;
00172 extern int generic_settings_store ( struct settings *settings,
00173                                     struct setting *setting,
00174                                     const void *data, size_t len );
00175 extern int generic_settings_fetch ( struct settings *settings,
00176                                     struct setting *setting,
00177                                     void *data, size_t len );
00178 extern void generic_settings_clear ( struct settings *settings );
00179 
00180 extern int register_settings ( struct settings *settings,
00181                                struct settings *parent );
00182 extern void unregister_settings ( struct settings *settings );
00183 
00184 extern int store_setting ( struct settings *settings, struct setting *setting,
00185                            const void *data, size_t len );
00186 extern int fetch_setting ( struct settings *settings, struct setting *setting,
00187                            void *data, size_t len );
00188 extern int fetch_setting_len ( struct settings *settings,
00189                                struct setting *setting );
00190 extern int fetch_string_setting ( struct settings *settings,
00191                                   struct setting *setting,
00192                                   char *data, size_t len );
00193 extern int fetch_string_setting_copy ( struct settings *settings,
00194                                        struct setting *setting,
00195                                        char **data );
00196 extern int fetch_ipv4_setting ( struct settings *settings,
00197                                 struct setting *setting, struct in_addr *inp );
00198 extern int fetch_int_setting ( struct settings *settings,
00199                                struct setting *setting, long *value );
00200 extern int fetch_uint_setting ( struct settings *settings,
00201                                 struct setting *setting,
00202                                 unsigned long *value );
00203 extern long fetch_intz_setting ( struct settings *settings,
00204                                  struct setting *setting );
00205 extern unsigned long fetch_uintz_setting ( struct settings *settings,
00206                                            struct setting *setting );
00207 extern int fetch_uuid_setting ( struct settings *settings,
00208                                 struct setting *setting, union uuid *uuid );
00209 extern void clear_settings ( struct settings *settings );
00210 extern int setting_cmp ( struct setting *a, struct setting *b );
00211 
00212 extern struct settings * find_settings ( const char *name );
00213 
00214 extern int storef_setting ( struct settings *settings,
00215                             struct setting *setting,
00216                             const char *value );
00217 extern int storef_named_setting ( const char *name, const char *value );
00218 extern int fetchf_named_setting ( const char *name, char *buf, size_t len );
00219 
00220 extern struct setting_type setting_type_string __setting_type;
00221 extern struct setting_type setting_type_ipv4 __setting_type;
00222 extern struct setting_type setting_type_int8 __setting_type;
00223 extern struct setting_type setting_type_int16 __setting_type;
00224 extern struct setting_type setting_type_int32 __setting_type;
00225 extern struct setting_type setting_type_uint8 __setting_type;
00226 extern struct setting_type setting_type_uint16 __setting_type;
00227 extern struct setting_type setting_type_uint32 __setting_type;
00228 extern struct setting_type setting_type_hex __setting_type;
00229 extern struct setting_type setting_type_uuid __setting_type;
00230 
00231 extern struct setting ip_setting __setting;
00232 extern struct setting netmask_setting __setting;
00233 extern struct setting gateway_setting __setting;
00234 extern struct setting dns_setting __setting;
00235 extern struct setting domain_setting __setting;
00236 extern struct setting hostname_setting __setting;
00237 extern struct setting filename_setting __setting;
00238 extern struct setting root_path_setting __setting;
00239 extern struct setting username_setting __setting;
00240 extern struct setting password_setting __setting;
00241 extern struct setting priority_setting __setting;
00242 extern struct setting uuid_setting __setting;
00243 extern struct setting next_server_setting __setting;
00244 extern struct setting mac_setting __setting;
00245 extern struct setting busid_setting __setting;
00246 extern struct setting user_class_setting __setting;
00247 
00248 /**
00249  * Initialise a settings block
00250  *
00251  * @v settings          Settings block
00252  * @v op                Settings block operations
00253  * @v refcnt            Containing object reference counter, or NULL
00254  * @v name              Settings block name
00255  * @v tag_magic         Tag magic
00256  */
00257 static inline void settings_init ( struct settings *settings,
00258                                    struct settings_operations *op,
00259                                    struct refcnt *refcnt,
00260                                    const char *name,
00261                                    unsigned int tag_magic ) {
00262         INIT_LIST_HEAD ( &settings->siblings );
00263         INIT_LIST_HEAD ( &settings->children );
00264         settings->op = op;
00265         settings->refcnt = refcnt;
00266         settings->name = name;
00267         settings->tag_magic = tag_magic;
00268 }
00269 
00270 /**
00271  * Initialise a settings block
00272  *
00273  * @v generics          Generic settings block
00274  * @v refcnt            Containing object reference counter, or NULL
00275  * @v name              Settings block name
00276  */
00277 static inline void generic_settings_init ( struct generic_settings *generics,
00278                                            struct refcnt *refcnt,
00279                                            const char *name ) {
00280         settings_init ( &generics->settings, &generic_settings_operations,
00281                         refcnt, name, 0 );
00282         INIT_LIST_HEAD ( &generics->list );
00283 }
00284 
00285 /**
00286  * Delete setting
00287  *
00288  * @v settings          Settings block
00289  * @v setting           Setting to delete
00290  * @ret rc              Return status code
00291  */
00292 static inline int delete_setting ( struct settings *settings,
00293                                    struct setting *setting ) {
00294         return store_setting ( settings, setting, NULL, 0 );
00295 }
00296 
00297 /**
00298  * Fetch and format value of setting
00299  *
00300  * @v settings          Settings block, or NULL to search all blocks
00301  * @v setting           Setting to fetch
00302  * @v type              Settings type
00303  * @v buf               Buffer to contain formatted value
00304  * @v len               Length of buffer
00305  * @ret len             Length of formatted value, or negative error
00306  */
00307 static inline int fetchf_setting ( struct settings *settings,
00308                                    struct setting *setting,
00309                                    char *buf, size_t len ) {
00310         return setting->type->fetchf ( settings, setting, buf, len );
00311 }
00312 
00313 /**
00314  * Delete named setting
00315  *
00316  * @v name              Name of setting
00317  * @ret rc              Return status code
00318  */
00319 static inline int delete_named_setting ( const char *name ) {
00320         return storef_named_setting ( name, NULL );
00321 }
00322 
00323 /**
00324  * Check existence of setting
00325  *
00326  * @v settings          Settings block, or NULL to search all blocks
00327  * @v setting           Setting to fetch
00328  * @ret exists          Setting exists
00329  */
00330 static inline int setting_exists ( struct settings *settings,
00331                                    struct setting *setting ) {
00332         return ( fetch_setting_len ( settings, setting ) >= 0 );
00333 }
00334 
00335 #endif /* _GPXE_SETTINGS_H */

Generated on Tue Apr 6 20:01:08 2010 for gPXE by  doxygen 1.5.7.1