您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

settings.h 6.8KB

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