You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

settings.h 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #ifndef _GPXE_SETTINGS_H
  2. #define _GPXE_SETTINGS_H
  3. /** @file
  4. *
  5. * Configuration settings
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER );
  9. #include <stdint.h>
  10. #include <gpxe/tables.h>
  11. #include <gpxe/list.h>
  12. #include <gpxe/refcnt.h>
  13. struct settings;
  14. struct in_addr;
  15. union uuid;
  16. /** A setting */
  17. struct setting {
  18. /** Name
  19. *
  20. * This is the human-readable name for the setting.
  21. */
  22. const char *name;
  23. /** Description */
  24. const char *description;
  25. /** Setting type
  26. *
  27. * This identifies the type of setting (e.g. string, IPv4
  28. * address, etc.).
  29. */
  30. struct setting_type *type;
  31. /** DHCP option number, if applicable */
  32. unsigned int tag;
  33. };
  34. /** Configuration setting table */
  35. #define SETTINGS __table ( struct setting, "settings" )
  36. /** Declare a configuration setting */
  37. #define __setting __table_entry ( SETTINGS, 01 )
  38. /** Settings block operations */
  39. struct settings_operations {
  40. /** Store value of setting
  41. *
  42. * @v settings Settings block
  43. * @v setting Setting to store
  44. * @v data Setting data, or NULL to clear setting
  45. * @v len Length of setting data
  46. * @ret rc Return status code
  47. */
  48. int ( * store ) ( struct settings *settings, struct setting *setting,
  49. const void *data, size_t len );
  50. /** Fetch value of setting
  51. *
  52. * @v settings Settings block
  53. * @v setting Setting to fetch
  54. * @v data Buffer to fill with setting data
  55. * @v len Length of buffer
  56. * @ret len Length of setting data, or negative error
  57. *
  58. * The actual length of the setting will be returned even if
  59. * the buffer was too small.
  60. */
  61. int ( * fetch ) ( struct settings *settings, struct setting *setting,
  62. void *data, size_t len );
  63. /** Clear settings block
  64. *
  65. * @v settings Settings block
  66. */
  67. void ( * clear ) ( struct settings *settings );
  68. };
  69. /** A settings block */
  70. struct settings {
  71. /** Reference counter */
  72. struct refcnt *refcnt;
  73. /** Name */
  74. const char *name;
  75. /** Tag magic
  76. *
  77. * This value will be ORed in to any numerical tags
  78. * constructed by parse_setting_name(), and can be used to
  79. * avoid e.g. attempting to retrieve the subnet mask from
  80. * SMBIOS, or the system UUID from DHCP.
  81. */
  82. unsigned int tag_magic;
  83. /** Parent settings block */
  84. struct settings *parent;
  85. /** Sibling settings blocks */
  86. struct list_head siblings;
  87. /** Child settings blocks */
  88. struct list_head children;
  89. /** Settings block operations */
  90. struct settings_operations *op;
  91. };
  92. /**
  93. * A setting type
  94. *
  95. * This represents a type of setting (e.g. string, IPv4 address,
  96. * etc.).
  97. */
  98. struct setting_type {
  99. /** Name
  100. *
  101. * This is the name exposed to the user (e.g. "string").
  102. */
  103. const char *name;
  104. /** Parse and set value of setting
  105. *
  106. * @v settings Settings block
  107. * @v setting Setting to store
  108. * @v value Formatted setting data
  109. * @ret rc Return status code
  110. */
  111. int ( * storef ) ( struct settings *settings, struct setting *setting,
  112. const char *value );
  113. /** Fetch and format value of setting
  114. *
  115. * @v settings Settings block
  116. * @v setting Setting to fetch
  117. * @v buf Buffer to contain formatted value
  118. * @v len Length of buffer
  119. * @ret len Length of formatted value, or negative error
  120. */
  121. int ( * fetchf ) ( struct settings *settings, struct setting *setting,
  122. char *buf, size_t len );
  123. };
  124. /** Configuration setting type table */
  125. #define SETTING_TYPES __table ( struct setting_type, "setting_types" )
  126. /** Declare a configuration setting type */
  127. #define __setting_type __table_entry ( SETTING_TYPES, 01 )
  128. /**
  129. * A settings applicator
  130. *
  131. */
  132. struct settings_applicator {
  133. /** Apply updated settings
  134. *
  135. * @ret rc Return status code
  136. */
  137. int ( * apply ) ( void );
  138. };
  139. /** Settings applicator table */
  140. #define SETTINGS_APPLICATORS \
  141. __table ( struct settings_applicator, "settings_applicators" )
  142. /** Declare a settings applicator */
  143. #define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 )
  144. /**
  145. * A generic settings block
  146. *
  147. */
  148. struct generic_settings {
  149. /** Settings block */
  150. struct settings settings;
  151. /** List of generic settings */
  152. struct list_head list;
  153. };
  154. extern struct settings_operations generic_settings_operations;
  155. extern int generic_settings_store ( struct settings *settings,
  156. struct setting *setting,
  157. const void *data, size_t len );
  158. extern int generic_settings_fetch ( struct settings *settings,
  159. struct setting *setting,
  160. void *data, size_t len );
  161. extern void generic_settings_clear ( struct settings *settings );
  162. extern int register_settings ( struct settings *settings,
  163. struct settings *parent );
  164. extern void unregister_settings ( struct settings *settings );
  165. extern int store_setting ( struct settings *settings, struct setting *setting,
  166. const void *data, size_t len );
  167. extern int fetch_setting ( struct settings *settings, struct setting *setting,
  168. void *data, size_t len );
  169. extern int fetch_setting_len ( struct settings *settings,
  170. struct setting *setting );
  171. extern int fetch_string_setting ( struct settings *settings,
  172. struct setting *setting,
  173. char *data, size_t len );
  174. extern int fetch_string_setting_copy ( struct settings *settings,
  175. struct setting *setting,
  176. char **data );
  177. extern int fetch_ipv4_setting ( struct settings *settings,
  178. struct setting *setting, struct in_addr *inp );
  179. extern int fetch_int_setting ( struct settings *settings,
  180. struct setting *setting, long *value );
  181. extern int fetch_uint_setting ( struct settings *settings,
  182. struct setting *setting,
  183. unsigned long *value );
  184. extern long fetch_intz_setting ( struct settings *settings,
  185. struct setting *setting );
  186. extern unsigned long fetch_uintz_setting ( struct settings *settings,
  187. struct setting *setting );
  188. extern int fetch_uuid_setting ( struct settings *settings,
  189. struct setting *setting, union uuid *uuid );
  190. extern void clear_settings ( struct settings *settings );
  191. extern int setting_cmp ( struct setting *a, struct setting *b );
  192. extern struct settings * find_settings ( const char *name );
  193. extern int storef_setting ( struct settings *settings,
  194. struct setting *setting,
  195. const char *value );
  196. extern int storef_named_setting ( const char *name, const char *value );
  197. extern int fetchf_named_setting ( const char *name, char *buf, size_t len );
  198. extern struct setting_type setting_type_string __setting_type;
  199. extern struct setting_type setting_type_ipv4 __setting_type;
  200. extern struct setting_type setting_type_int8 __setting_type;
  201. extern struct setting_type setting_type_int16 __setting_type;
  202. extern struct setting_type setting_type_int32 __setting_type;
  203. extern struct setting_type setting_type_uint8 __setting_type;
  204. extern struct setting_type setting_type_uint16 __setting_type;
  205. extern struct setting_type setting_type_uint32 __setting_type;
  206. extern struct setting_type setting_type_hex __setting_type;
  207. extern struct setting_type setting_type_uuid __setting_type;
  208. extern struct setting ip_setting __setting;
  209. extern struct setting netmask_setting __setting;
  210. extern struct setting gateway_setting __setting;
  211. extern struct setting dns_setting __setting;
  212. extern struct setting domain_setting __setting;
  213. extern struct setting hostname_setting __setting;
  214. extern struct setting filename_setting __setting;
  215. extern struct setting root_path_setting __setting;
  216. extern struct setting username_setting __setting;
  217. extern struct setting password_setting __setting;
  218. extern struct setting priority_setting __setting;
  219. extern struct setting uuid_setting __setting;
  220. extern struct setting next_server_setting __setting;
  221. extern struct setting mac_setting __setting;
  222. extern struct setting user_class_setting __setting;
  223. /**
  224. * Initialise a settings block
  225. *
  226. * @v settings Settings block
  227. * @v op Settings block operations
  228. * @v refcnt Containing object reference counter, or NULL
  229. * @v name Settings block name
  230. * @v tag_magic Tag magic
  231. */
  232. static inline void settings_init ( struct settings *settings,
  233. struct settings_operations *op,
  234. struct refcnt *refcnt,
  235. const char *name,
  236. unsigned int tag_magic ) {
  237. INIT_LIST_HEAD ( &settings->siblings );
  238. INIT_LIST_HEAD ( &settings->children );
  239. settings->op = op;
  240. settings->refcnt = refcnt;
  241. settings->name = name;
  242. settings->tag_magic = tag_magic;
  243. }
  244. /**
  245. * Initialise a settings block
  246. *
  247. * @v generics Generic settings block
  248. * @v refcnt Containing object reference counter, or NULL
  249. * @v name Settings block name
  250. */
  251. static inline void generic_settings_init ( struct generic_settings *generics,
  252. struct refcnt *refcnt,
  253. const char *name ) {
  254. settings_init ( &generics->settings, &generic_settings_operations,
  255. refcnt, name, 0 );
  256. INIT_LIST_HEAD ( &generics->list );
  257. }
  258. /**
  259. * Delete setting
  260. *
  261. * @v settings Settings block
  262. * @v setting Setting to delete
  263. * @ret rc Return status code
  264. */
  265. static inline int delete_setting ( struct settings *settings,
  266. struct setting *setting ) {
  267. return store_setting ( settings, setting, NULL, 0 );
  268. }
  269. /**
  270. * Fetch and format value of setting
  271. *
  272. * @v settings Settings block, or NULL to search all blocks
  273. * @v setting Setting to fetch
  274. * @v type Settings type
  275. * @v buf Buffer to contain formatted value
  276. * @v len Length of buffer
  277. * @ret len Length of formatted value, or negative error
  278. */
  279. static inline int fetchf_setting ( struct settings *settings,
  280. struct setting *setting,
  281. char *buf, size_t len ) {
  282. return setting->type->fetchf ( settings, setting, buf, len );
  283. }
  284. /**
  285. * Delete named setting
  286. *
  287. * @v name Name of setting
  288. * @ret rc Return status code
  289. */
  290. static inline int delete_named_setting ( const char *name ) {
  291. return storef_named_setting ( name, NULL );
  292. }
  293. /**
  294. * Check existence of setting
  295. *
  296. * @v settings Settings block, or NULL to search all blocks
  297. * @v setting Setting to fetch
  298. * @ret exists Setting exists
  299. */
  300. static inline int setting_exists ( struct settings *settings,
  301. struct setting *setting ) {
  302. return ( fetch_setting_len ( settings, setting ) >= 0 );
  303. }
  304. #endif /* _GPXE_SETTINGS_H */