protover_rust.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* Copyright (c) 2016-2017, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. /*
  4. * \file protover_rust.c
  5. * \brief Provide a C wrapper for functions exposed in /src/rust/protover,
  6. * and safe translation/handling between the Rust/C boundary.
  7. */
  8. #include "or.h"
  9. #include "protover.h"
  10. #include "rust_types.h"
  11. #ifdef HAVE_RUST
  12. int rust_protover_all_supported(const char *s, char **missing);
  13. rust_str_ref_t rust_protover_compute_for_old_tor(const char *version);
  14. rust_str_ref_t rust_protover_compute_vote(const smartlist_t *proto_votes,
  15. int threshold);
  16. rust_str_ref_t rust_protover_get_supported_protocols(void);
  17. int rust_protocol_list_supports_protocol(const char *list, protocol_type_t tp,
  18. uint32_t version);
  19. int rust_protover_is_supported_here(protocol_type_t pr, uint32_t ver);
  20. /* Define for compatibility, used in main.c */
  21. void protover_free_all(void) {};
  22. /*
  23. * Wrap rust_protover_is_supported_here, located in /src/rust/protover
  24. */
  25. int
  26. protover_is_supported_here(protocol_type_t pr, uint32_t ver)
  27. {
  28. return rust_protover_is_supported_here(pr, ver);
  29. }
  30. /*
  31. * Wrap rust_protover_list_supports_protocol, located in /src/rust/protover
  32. */
  33. int
  34. protocol_list_supports_protocol(const char *list, protocol_type_t tp,
  35. uint32_t version)
  36. {
  37. return rust_protocol_list_supports_protocol(list, tp, version);
  38. }
  39. /*
  40. * Wrap rust_protover_get_supported_protocols, located in /src/rust/protover
  41. */
  42. const char *
  43. protover_get_supported_protocols(void)
  44. {
  45. rust_str_ref_t rust_protocols = rust_protover_get_supported_protocols();
  46. char *protocols = NULL;
  47. if (rust_protocols != NULL) {
  48. move_rust_str_to_c_and_free(rust_protocols, &protocols);
  49. }
  50. return protocols;
  51. }
  52. /*
  53. * Wrap rust_protover_compute_vote, located in /src/rust/protover
  54. */
  55. char *
  56. protover_compute_vote(const smartlist_t *proto_strings,
  57. int threshold)
  58. {
  59. rust_str_ref_t rust_protocols = rust_protover_compute_vote(proto_strings,
  60. threshold);
  61. char *protocols = NULL;
  62. if (rust_protocols != NULL) {
  63. move_rust_str_to_c_and_free(rust_protocols, &protocols);
  64. }
  65. return protocols;
  66. }
  67. /*
  68. * Wrap rust_protover_all_supported, located in /src/rust/protover
  69. */
  70. int
  71. protover_all_supported(const char *s, char **missing_out)
  72. {
  73. rust_str_ref_t missing_out_copy = NULL;
  74. int is_supported = rust_protover_all_supported(s, &missing_out_copy);
  75. if (!is_supported) {
  76. move_rust_str_to_c_and_free(missing_out_copy, missing_out);
  77. }
  78. return is_supported;
  79. }
  80. /*
  81. * Wrap rust_compute_for_old_tor, located in /src/rust/protover
  82. */
  83. const char *
  84. protover_compute_for_old_tor(const char *version)
  85. {
  86. rust_str_ref_t rust_protocols = rust_protover_compute_for_old_tor(version);
  87. char *protocols = NULL;
  88. if (rust_protocols != NULL) {
  89. move_rust_str_to_c_and_free(rust_protocols, &protocols);
  90. }
  91. return protocols;
  92. }
  93. #endif