選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

settings.h 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #ifndef _GPXE_SETTINGS_H
  2. #define _GPXE_SETTINGS_H
  3. /** @file
  4. *
  5. * Configuration settings
  6. *
  7. */
  8. #include <stdint.h>
  9. #include <gpxe/tables.h>
  10. #include <gpxe/list.h>
  11. #include <gpxe/refcnt.h>
  12. #include <gpxe/dhcpopts.h>
  13. struct settings;
  14. struct in_addr;
  15. /** Settings block operations */
  16. struct settings_operations {
  17. /** Store value of setting
  18. *
  19. * @v settings Settings block
  20. * @v tag Setting tag number
  21. * @v data Setting data, or NULL to clear setting
  22. * @v len Length of setting data
  23. * @ret rc Return status code
  24. */
  25. int ( * store ) ( struct settings *settings, unsigned int tag,
  26. const void *data, size_t len );
  27. /** Fetch value of setting
  28. *
  29. * @v settings Settings block
  30. * @v tag Setting tag number
  31. * @v data Buffer to fill with setting data
  32. * @v len Length of buffer
  33. * @ret len Length of setting data, or negative error
  34. *
  35. * The actual length of the setting will be returned even if
  36. * the buffer was too small.
  37. */
  38. int ( * fetch ) ( struct settings *settings, unsigned int tag,
  39. void *data, size_t len );
  40. };
  41. /** A settings block */
  42. struct settings {
  43. /** Reference counter */
  44. struct refcnt *refcnt;
  45. /** Name */
  46. const char *name;
  47. /** Parent settings block */
  48. struct settings *parent;
  49. /** Sibling settings blocks */
  50. struct list_head siblings;
  51. /** Child settings blocks */
  52. struct list_head children;
  53. /** Settings block operations */
  54. struct settings_operations *op;
  55. };
  56. /**
  57. * A setting type
  58. *
  59. * This represents a type of setting (e.g. string, IPv4 address,
  60. * etc.).
  61. */
  62. struct setting_type {
  63. /** Name
  64. *
  65. * This is the name exposed to the user (e.g. "string").
  66. */
  67. const char *name;
  68. /** Parse and set value of setting
  69. *
  70. * @v settings Settings block
  71. * @v tag Setting tag number
  72. * @v value Formatted setting data
  73. * @ret rc Return status code
  74. */
  75. int ( * storef ) ( struct settings *settings, unsigned int tag,
  76. const char *value );
  77. /** Fetch and format value of setting
  78. *
  79. * @v settings Settings block, or NULL to search all blocks
  80. * @v tag Setting tag number
  81. * @v buf Buffer to contain formatted value
  82. * @v len Length of buffer
  83. * @ret len Length of formatted value, or negative error
  84. */
  85. int ( * fetchf ) ( struct settings *settings, unsigned int tag,
  86. char *buf, size_t len );
  87. };
  88. /** Declare a configuration setting type */
  89. #define __setting_type \
  90. __table ( struct setting_type, setting_types, 01 )
  91. /**
  92. * A named setting
  93. *
  94. * This represents a single setting (e.g. "hostname"), encapsulating
  95. * the information about the setting's tag number and type.
  96. */
  97. struct named_setting {
  98. /** Name
  99. *
  100. * This is the human-readable name for the setting.
  101. */
  102. const char *name;
  103. /** Description */
  104. const char *description;
  105. /** Setting tag number */
  106. unsigned int tag;
  107. /** Setting type
  108. *
  109. * This identifies the type of setting (e.g. string, IPv4
  110. * address, etc.).
  111. */
  112. struct setting_type *type;
  113. };
  114. /** Declare a configuration setting */
  115. #define __named_setting __table ( struct named_setting, named_settings, 01 )
  116. /**
  117. * A settings applicator
  118. *
  119. */
  120. struct settings_applicator {
  121. /** Apply updated settings
  122. *
  123. * @ret rc Return status code
  124. */
  125. int ( * apply ) ( void );
  126. };
  127. /** Declare a settings applicator */
  128. #define __settings_applicator \
  129. __table ( struct settings_applicator, settings_applicators, 01 )
  130. /**
  131. * A simple settings block
  132. *
  133. */
  134. struct simple_settings {
  135. /** Settings block */
  136. struct settings settings;
  137. /** DHCP options */
  138. struct dhcp_options dhcpopts;
  139. };
  140. extern struct settings_operations simple_settings_operations;
  141. extern int simple_settings_store ( struct settings *settings, unsigned int tag,
  142. const void *data, size_t len );
  143. extern int simple_settings_fetch ( struct settings *settings, unsigned int tag,
  144. void *data, size_t len );
  145. extern int register_settings ( struct settings *settings,
  146. struct settings *parent );
  147. extern void unregister_settings ( struct settings *settings );
  148. extern int store_setting ( struct settings *settings, unsigned int tag,
  149. const void *data, size_t len );
  150. extern int fetch_setting ( struct settings *settings, unsigned int tag,
  151. void *data, size_t len );
  152. extern int copy_setting ( struct settings *dest, unsigned int dest_tag,
  153. struct settings *source, unsigned int source_tag );
  154. extern int copy_settings ( struct settings *dest, struct settings *source );
  155. extern int fetch_setting_len ( struct settings *settings, unsigned int tag );
  156. extern int fetch_string_setting ( struct settings *settings, unsigned int tag,
  157. char *data, size_t len );
  158. extern int fetch_ipv4_setting ( struct settings *settings, unsigned int tag,
  159. struct in_addr *inp );
  160. extern int fetch_int_setting ( struct settings *settings, unsigned int tag,
  161. long *value );
  162. extern int fetch_uint_setting ( struct settings *settings, unsigned int tag,
  163. unsigned long *value );
  164. extern long fetch_intz_setting ( struct settings *settings, unsigned int tag );
  165. extern unsigned long fetch_uintz_setting ( struct settings *settings,
  166. unsigned int tag );
  167. extern struct settings * find_child_settings ( struct settings *parent,
  168. const char *name );
  169. extern struct settings * find_settings ( const char *name );
  170. extern int store_typed_setting ( struct settings *settings,
  171. unsigned int tag, struct setting_type *type,
  172. const char *value );
  173. extern int store_named_setting ( const char *name, const char *value );
  174. extern int fetch_named_setting ( const char *name, char *buf, size_t len );
  175. extern struct setting_type setting_type_ __setting_type;
  176. extern struct setting_type setting_type_string __setting_type;
  177. extern struct setting_type setting_type_ipv4 __setting_type;
  178. extern struct setting_type setting_type_int8 __setting_type;
  179. extern struct setting_type setting_type_int16 __setting_type;
  180. extern struct setting_type setting_type_int32 __setting_type;
  181. extern struct setting_type setting_type_uint8 __setting_type;
  182. extern struct setting_type setting_type_uint16 __setting_type;
  183. extern struct setting_type setting_type_uint32 __setting_type;
  184. extern struct setting_type setting_type_hex __setting_type;
  185. /**
  186. * Initialise a settings block
  187. *
  188. * @v settings Settings block
  189. * @v op Settings block operations
  190. * @v refcnt Containing object reference counter, or NULL
  191. * @v name Settings block name
  192. */
  193. static inline void settings_init ( struct settings *settings,
  194. struct settings_operations *op,
  195. struct refcnt *refcnt,
  196. const char *name ) {
  197. INIT_LIST_HEAD ( &settings->siblings );
  198. INIT_LIST_HEAD ( &settings->children );
  199. settings->op = op;
  200. settings->refcnt = refcnt;
  201. settings->name = name;
  202. }
  203. /**
  204. * Initialise a settings block
  205. *
  206. * @v simple Simple settings block
  207. * @v refcnt Containing object reference counter, or NULL
  208. * @v name Settings block name
  209. */
  210. static inline void simple_settings_init ( struct simple_settings *simple,
  211. struct refcnt *refcnt,
  212. const char *name ) {
  213. settings_init ( &simple->settings, &simple_settings_operations,
  214. refcnt, name );
  215. }
  216. /**
  217. * Delete setting
  218. *
  219. * @v settings Settings block
  220. * @v tag Setting tag number
  221. * @ret rc Return status code
  222. */
  223. static inline int delete_setting ( struct settings *settings,
  224. unsigned int tag ) {
  225. return store_setting ( settings, tag, NULL, 0 );
  226. }
  227. /**
  228. * Fetch and format value of setting
  229. *
  230. * @v settings Settings block, or NULL to search all blocks
  231. * @v tag Setting tag number
  232. * @v type Settings type
  233. * @v buf Buffer to contain formatted value
  234. * @v len Length of buffer
  235. * @ret len Length of formatted value, or negative error
  236. */
  237. static inline int fetch_typed_setting ( struct settings *settings,
  238. unsigned int tag,
  239. struct setting_type *type,
  240. char *buf, size_t len ) {
  241. return type->fetchf ( settings, tag, buf, len );
  242. }
  243. /**
  244. * Delete named setting
  245. *
  246. * @v name Name of setting
  247. * @ret rc Return status code
  248. */
  249. static inline int delete_named_setting ( const char *name ) {
  250. return store_named_setting ( name, NULL );
  251. }
  252. #endif /* _GPXE_SETTINGS_H */