structvar.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /* Copyright (c) 2001 Matej Pfajfar.
  2. * Copyright (c) 2001-2004, Roger Dingledine.
  3. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  4. * Copyright (c) 2007-2019, The Tor Project, Inc. */
  5. /* See LICENSE for licensing information */
  6. /**
  7. * @file structvar.c
  8. * @brief Functions to manipulate named and typed elements of
  9. * a structure.
  10. *
  11. * These functions represent a low-level API for accessing a member of a
  12. * structure. They use typedvar.c to work, and they are used in turn by the
  13. * configuration system to examine and set fields in configuration objects
  14. * used by individual modules.
  15. *
  16. * Almost no code should call these directly.
  17. **/
  18. #include "orconfig.h"
  19. #include "lib/confmgt/structvar.h"
  20. #include "lib/cc/compat_compiler.h"
  21. #include "lib/conf/conftypes.h"
  22. #include "lib/confmgt/type_defs.h"
  23. #include "lib/confmgt/typedvar.h"
  24. #include "lib/log/util_bug.h"
  25. #include "lib/confmgt/var_type_def_st.h"
  26. #include <stddef.h>
  27. /**
  28. * Set the 'magic number' on <b>object</b> to correspond to decl.
  29. **/
  30. void
  31. struct_set_magic(void *object, const struct_magic_decl_t *decl)
  32. {
  33. tor_assert(object);
  34. tor_assert(decl);
  35. uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
  36. *ptr = decl->magic_val;
  37. }
  38. /**
  39. * Assert that the 'magic number' on <b>object</b> to corresponds to decl.
  40. **/
  41. void
  42. struct_check_magic(const void *object, const struct_magic_decl_t *decl)
  43. {
  44. tor_assert(object);
  45. tor_assert(decl);
  46. const uint32_t *ptr = STRUCT_VAR_P(object, decl->magic_offset);
  47. tor_assertf(*ptr == decl->magic_val,
  48. "Bad magic number on purported %s object. "
  49. "Expected %"PRIu32"x but got "PRIu32"x.",
  50. decl->magic_val, *ptr);
  51. }
  52. /**
  53. * Return a mutable pointer to the member of <b>object</b> described
  54. * by <b>member</b>.
  55. **/
  56. void *
  57. struct_get_mptr(void *object, const struct_member_t *member)
  58. {
  59. tor_assert(object);
  60. return STRUCT_VAR_P(object, member->offset);
  61. }
  62. /**
  63. * Return a const pointer to the member of <b>object</b> described
  64. * by <b>member</b>.
  65. **/
  66. const void *
  67. struct_get_ptr(const void *object, const struct_member_t *member)
  68. {
  69. tor_assert(object);
  70. return STRUCT_VAR_P(object, member->offset);
  71. }
  72. /**
  73. * Helper: given a struct_member_t, look up the type definition for its
  74. * variable.
  75. */
  76. static const var_type_def_t *
  77. get_type_def(const struct_member_t *member)
  78. {
  79. if (member->type_def)
  80. return member->type_def;
  81. return lookup_type_def(member->type);
  82. }
  83. /**
  84. * (As typed_var_assign, but assign a value to the member of <b>object</b>
  85. * defined by <b>member</b>.)
  86. **/
  87. int
  88. struct_var_assign(void *object, const char *value, char **errmsg,
  89. const struct_member_t *member)
  90. {
  91. void *p = struct_get_mptr(object, member);
  92. const var_type_def_t *def = get_type_def(member);
  93. return typed_var_assign_ex(p, value, errmsg, def);
  94. }
  95. /**
  96. * (As typed_var_free, but free and clear the member of <b>object</b> defined
  97. * by <b>member</b>.)
  98. **/
  99. void
  100. struct_var_free(void *object, const struct_member_t *member)
  101. {
  102. void *p = struct_get_mptr(object, member);
  103. const var_type_def_t *def = get_type_def(member);
  104. typed_var_free_ex(p, def);
  105. }
  106. /**
  107. * (As typed_var_encode, but encode the member of <b>object</b> defined
  108. * by <b>member</b>.)
  109. **/
  110. char *
  111. struct_var_encode(const void *object, const struct_member_t *member)
  112. {
  113. const void *p = struct_get_ptr(object, member);
  114. const var_type_def_t *def = get_type_def(member);
  115. return typed_var_encode_ex(p, def);
  116. }
  117. /**
  118. * (As typed_var_copy, but copy from <b>src</b> to <b>dest</b> the member
  119. * defined by <b>member</b>.)
  120. **/
  121. int
  122. struct_var_copy(void *dest, const void *src, const struct_member_t *member)
  123. {
  124. void *p_dest = struct_get_mptr(dest, member);
  125. const void *p_src = struct_get_ptr(src, member);
  126. const var_type_def_t *def = get_type_def(member);
  127. return typed_var_copy_ex(p_dest, p_src, def);
  128. }
  129. /**
  130. * (As typed_var_eq, but compare the members of <b>a</b> and <b>b</b>
  131. * defined by <b>member</b>.)
  132. **/
  133. bool
  134. struct_var_eq(const void *a, const void *b, const struct_member_t *member)
  135. {
  136. const void *p_a = struct_get_ptr(a, member);
  137. const void *p_b = struct_get_ptr(b, member);
  138. const var_type_def_t *def = get_type_def(member);
  139. return typed_var_eq_ex(p_a, p_b, def);
  140. }
  141. /**
  142. * (As typed_var_ok, but validate the member of <b>object</b> defined by
  143. * <b>member</b>.)
  144. **/
  145. bool
  146. struct_var_ok(const void *object, const struct_member_t *member)
  147. {
  148. const void *p = struct_get_ptr(object, member);
  149. const var_type_def_t *def = get_type_def(member);
  150. return typed_var_ok_ex(p, def);
  151. }
  152. /**
  153. * (As typed_var_kvassign, but assign a value to the member of <b>object</b>
  154. * defined by <b>member</b>.)
  155. **/
  156. int
  157. struct_var_kvassign(void *object, const struct config_line_t *line,
  158. char **errmsg,
  159. const struct_member_t *member)
  160. {
  161. void *p = struct_get_mptr(object, member);
  162. const var_type_def_t *def = get_type_def(member);
  163. return typed_var_kvassign_ex(p, line, errmsg, def);
  164. }
  165. /**
  166. * (As typed_var_kvencode, but encode the value of the member of <b>object</b>
  167. * defined by <b>member</b>.)
  168. **/
  169. struct config_line_t *
  170. struct_var_kvencode(const void *object, const struct_member_t *member)
  171. {
  172. const void *p = struct_get_ptr(object, member);
  173. const var_type_def_t *def = get_type_def(member);
  174. return typed_var_kvencode_ex(member->name, p, def);
  175. }
  176. /**
  177. * Return the official name of this struct member.
  178. **/
  179. const char *
  180. struct_var_get_name(const struct_member_t *member)
  181. {
  182. return member->name;
  183. }
  184. /**
  185. * Return the type name for this struct member.
  186. *
  187. * Do not use the output of this function to inspect a type within Tor. It is
  188. * suitable for debugging, informing the controller or user of a variable's
  189. * type, etc.
  190. **/
  191. const char *
  192. struct_var_get_typename(const struct_member_t *member)
  193. {
  194. const var_type_def_t *def = get_type_def(member);
  195. return def ? def->name : NULL;
  196. }