mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
rust implementation of protover
This commit is contained in:
committed by
Nick Mathewson
parent
5418aa84ee
commit
d1820c1516
@@ -78,6 +78,7 @@ LIBTOR_A_SOURCES = \
|
||||
src/or/parsecommon.c \
|
||||
src/or/periodic.c \
|
||||
src/or/protover.c \
|
||||
src/or/protover_rust.c \
|
||||
src/or/proto_cell.c \
|
||||
src/or/proto_control0.c \
|
||||
src/or/proto_ext_or.c \
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
#include "protover.h"
|
||||
#include "routerparse.h"
|
||||
|
||||
#ifndef HAVE_RUST
|
||||
|
||||
static const smartlist_t *get_supported_protocol_list(void);
|
||||
static int protocol_list_contains(const smartlist_t *protos,
|
||||
protocol_type_t pr, uint32_t ver);
|
||||
@@ -735,3 +737,5 @@ protover_free_all(void)
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+5
-1
@@ -70,11 +70,15 @@ typedef struct proto_entry_t {
|
||||
smartlist_t *ranges;
|
||||
} proto_entry_t;
|
||||
|
||||
#if !defined(HAVE_RUST) && defined(TOR_UNIT_TESTS)
|
||||
STATIC smartlist_t *parse_protocol_list(const char *s);
|
||||
STATIC void proto_entry_free(proto_entry_t *entry);
|
||||
STATIC char *encode_protocol_list(const smartlist_t *sl);
|
||||
STATIC const char *protocol_type_to_str(protocol_type_t pr);
|
||||
STATIC int str_to_protocol_type(const char *s, protocol_type_t *pr_out);
|
||||
STATIC void proto_entry_free(proto_entry_t *entry);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* defined(PROTOVER_PRIVATE) */
|
||||
|
||||
#endif /* !defined(TOR_PROTOVER_H) */
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
/* Copyright (c) 2016-2017, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
/*
|
||||
* \file protover_rust.c
|
||||
* \brief Provide a C wrapper for functions exposed in /src/rust/protover,
|
||||
* and safe translation/handling between the Rust/C boundary.
|
||||
*/
|
||||
|
||||
#include "or.h"
|
||||
#include "protover.h"
|
||||
#include "rust_types.h"
|
||||
|
||||
#ifdef HAVE_RUST
|
||||
|
||||
int rust_protover_all_supported(const char *s, char **missing);
|
||||
rust_str_ref_t rust_protover_compute_for_old_tor(const char *version);
|
||||
rust_str_ref_t rust_protover_compute_vote(const smartlist_t *proto_votes,
|
||||
int threshold);
|
||||
rust_str_ref_t rust_protover_get_supported_protocols(void);
|
||||
int rust_protocol_list_supports_protocol(const char *list, protocol_type_t tp,
|
||||
uint32_t version);
|
||||
int rust_protover_is_supported_here(protocol_type_t pr, uint32_t ver);
|
||||
|
||||
/* Define for compatibility, used in main.c */
|
||||
void protover_free_all(void) {};
|
||||
|
||||
/*
|
||||
* Wrap rust_protover_is_supported_here, located in /src/rust/protover
|
||||
*/
|
||||
int
|
||||
protover_is_supported_here(protocol_type_t pr, uint32_t ver)
|
||||
{
|
||||
return rust_protover_is_supported_here(pr, ver);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrap rust_protover_list_supports_protocol, located in /src/rust/protover
|
||||
*/
|
||||
int
|
||||
protocol_list_supports_protocol(const char *list, protocol_type_t tp,
|
||||
uint32_t version)
|
||||
{
|
||||
return rust_protocol_list_supports_protocol(list, tp, version);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrap rust_protover_get_supported_protocols, located in /src/rust/protover
|
||||
*/
|
||||
const char *
|
||||
protover_get_supported_protocols(void)
|
||||
{
|
||||
rust_str_ref_t rust_protocols = rust_protover_get_supported_protocols();
|
||||
|
||||
char *protocols = NULL;
|
||||
if (rust_protocols != NULL) {
|
||||
move_rust_str_to_c_and_free(rust_protocols, &protocols);
|
||||
}
|
||||
return protocols;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrap rust_protover_compute_vote, located in /src/rust/protover
|
||||
*/
|
||||
char *
|
||||
protover_compute_vote(const smartlist_t *proto_strings,
|
||||
int threshold)
|
||||
{
|
||||
rust_str_ref_t rust_protocols = rust_protover_compute_vote(proto_strings,
|
||||
threshold);
|
||||
|
||||
char *protocols = NULL;
|
||||
if (rust_protocols != NULL) {
|
||||
move_rust_str_to_c_and_free(rust_protocols, &protocols);
|
||||
}
|
||||
return protocols;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrap rust_protover_all_supported, located in /src/rust/protover
|
||||
*/
|
||||
int
|
||||
protover_all_supported(const char *s, char **missing_out)
|
||||
{
|
||||
rust_str_ref_t missing_out_copy = NULL;
|
||||
int is_supported = rust_protover_all_supported(s, &missing_out_copy);
|
||||
|
||||
if (!is_supported) {
|
||||
move_rust_str_to_c_and_free(missing_out_copy, missing_out);
|
||||
}
|
||||
|
||||
return is_supported;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrap rust_compute_for_old_tor, located in /src/rust/protover
|
||||
*/
|
||||
const char *
|
||||
protover_compute_for_old_tor(const char *version)
|
||||
{
|
||||
rust_str_ref_t rust_protocols = rust_protover_compute_for_old_tor(version);
|
||||
|
||||
char *protocols = NULL;
|
||||
if (rust_protocols != NULL) {
|
||||
move_rust_str_to_c_and_free(rust_protocols, &protocols);
|
||||
}
|
||||
return protocols;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user