00001 #ifndef _GPXE_SETTINGS_H
00002 #define _GPXE_SETTINGS_H
00003
00004
00005
00006
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
00022 struct setting {
00023
00024
00025
00026
00027 const char *name;
00028
00029 const char *description;
00030
00031
00032
00033
00034
00035 struct setting_type *type;
00036
00037 unsigned int tag;
00038 };
00039
00040
00041 #define SETTINGS __table ( struct setting, "settings" )
00042
00043
00044 #define __setting __table_entry ( SETTINGS, 01 )
00045
00046
00047 struct settings_operations {
00048
00049
00050
00051
00052
00053
00054
00055
00056 int ( * store ) ( struct settings *settings, struct setting *setting,
00057 const void *data, size_t len );
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 int ( * fetch ) ( struct settings *settings, struct setting *setting,
00070 void *data, size_t len );
00071
00072
00073
00074
00075 void ( * clear ) ( struct settings *settings );
00076 };
00077
00078
00079 struct settings {
00080
00081 struct refcnt *refcnt;
00082
00083 const char *name;
00084
00085
00086
00087
00088
00089
00090
00091 unsigned int tag_magic;
00092
00093 struct settings *parent;
00094
00095 struct list_head siblings;
00096
00097 struct list_head children;
00098
00099 struct settings_operations *op;
00100 };
00101
00102
00103
00104
00105
00106
00107
00108 struct setting_type {
00109
00110
00111
00112
00113 const char *name;
00114
00115
00116
00117
00118
00119
00120
00121 int ( * storef ) ( struct settings *settings, struct setting *setting,
00122 const char *value );
00123
00124
00125
00126
00127
00128
00129
00130
00131 int ( * fetchf ) ( struct settings *settings, struct setting *setting,
00132 char *buf, size_t len );
00133 };
00134
00135
00136 #define SETTING_TYPES __table ( struct setting_type, "setting_types" )
00137
00138
00139 #define __setting_type __table_entry ( SETTING_TYPES, 01 )
00140
00141
00142
00143
00144
00145 struct settings_applicator {
00146
00147
00148
00149
00150 int ( * apply ) ( void );
00151 };
00152
00153
00154 #define SETTINGS_APPLICATORS \
00155 __table ( struct settings_applicator, "settings_applicators" )
00156
00157
00158 #define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 )
00159
00160
00161
00162
00163
00164 struct generic_settings {
00165
00166 struct settings settings;
00167
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
00250
00251
00252
00253
00254
00255
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
00272
00273
00274
00275
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
00287
00288
00289
00290
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
00299
00300
00301
00302
00303
00304
00305
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
00315
00316
00317
00318
00319 static inline int delete_named_setting ( const char *name ) {
00320 return storef_named_setting ( name, NULL );
00321 }
00322
00323
00324
00325
00326
00327
00328
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