structvar.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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_free, but free and clear the member of <b>object</b> defined
  85. * by <b>member</b>.)
  86. **/
  87. void
  88. struct_var_free(void *object, const struct_member_t *member)
  89. {
  90. void *p = struct_get_mptr(object, member);
  91. const var_type_def_t *def = get_type_def(member);
  92. typed_var_free(p, def);
  93. }
  94. /**
  95. * (As typed_var_copy, but copy from <b>src</b> to <b>dest</b> the member
  96. * defined by <b>member</b>.)
  97. **/
  98. int
  99. struct_var_copy(void *dest, const void *src, const struct_member_t *member)
  100. {
  101. void *p_dest = struct_get_mptr(dest, member);
  102. const void *p_src = struct_get_ptr(src, member);
  103. const var_type_def_t *def = get_type_def(member);
  104. return typed_var_copy(p_dest, p_src, def);
  105. }
  106. /**
  107. * (As typed_var_eq, but compare the members of <b>a</b> and <b>b</b>
  108. * defined by <b>member</b>.)
  109. **/
  110. bool
  111. struct_var_eq(const void *a, const void *b, const struct_member_t *member)
  112. {
  113. const void *p_a = struct_get_ptr(a, member);
  114. const void *p_b = struct_get_ptr(b, member);
  115. const var_type_def_t *def = get_type_def(member);
  116. return typed_var_eq(p_a, p_b, def);
  117. }
  118. /**
  119. * (As typed_var_ok, but validate the member of <b>object</b> defined by
  120. * <b>member</b>.)
  121. **/
  122. bool
  123. struct_var_ok(const void *object, const struct_member_t *member)
  124. {
  125. const void *p = struct_get_ptr(object, member);
  126. const var_type_def_t *def = get_type_def(member);
  127. return typed_var_ok(p, def);
  128. }
  129. /**
  130. * (As typed_var_kvassign, but assign a value to the member of <b>object</b>
  131. * defined by <b>member</b>.)
  132. **/
  133. int
  134. struct_var_kvassign(void *object, const struct config_line_t *line,
  135. char **errmsg,
  136. const struct_member_t *member)
  137. {
  138. void *p = struct_get_mptr(object, member);
  139. const var_type_def_t *def = get_type_def(member);
  140. return typed_var_kvassign(p, line, errmsg, def);
  141. }
  142. /**
  143. * (As typed_var_kvencode, but encode the value of the member of <b>object</b>
  144. * defined by <b>member</b>.)
  145. **/
  146. struct config_line_t *
  147. struct_var_kvencode(const void *object, const struct_member_t *member)
  148. {
  149. const void *p = struct_get_ptr(object, member);
  150. const var_type_def_t *def = get_type_def(member);
  151. return typed_var_kvencode(member->name, p, def);
  152. }
  153. /**
  154. * Mark the field in <b>object</b> determined by <b>member</b> -- a variable
  155. * that ordinarily would be extended by assignment -- as "fragile", so that it
  156. * will get replaced by the next assignment instead.
  157. */
  158. void
  159. struct_var_mark_fragile(void *object, 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_mark_fragile(p, def);
  164. }
  165. /**
  166. * Return the official name of this struct member.
  167. **/
  168. const char *
  169. struct_var_get_name(const struct_member_t *member)
  170. {
  171. return member->name;
  172. }
  173. /**
  174. * Return the type name for this struct member.
  175. *
  176. * Do not use the output of this function to inspect a type within Tor. It is
  177. * suitable for debugging, informing the controller or user of a variable's
  178. * type, etc.
  179. **/
  180. const char *
  181. struct_var_get_typename(const struct_member_t *member)
  182. {
  183. const var_type_def_t *def = get_type_def(member);
  184. return def ? def->name : NULL;
  185. }
  186. /** Return all of the flags set for this struct member. */
  187. uint32_t
  188. struct_var_get_flags(const struct_member_t *member)
  189. {
  190. const var_type_def_t *def = get_type_def(member);
  191. return def ? def->flags : 0;
  192. }