tor_free(md->body);
nodefamily_free(md->family);
+ if (md->family_ids) {
+ SMARTLIST_FOREACH(md->family_ids, char *, cp, tor_free(cp));
+ smartlist_free(md->family_ids);
+ }
short_policy_free(md->exit_policy);
short_policy_free(md->ipv6_exit_policy);
struct ed25519_public_key_t;
struct nodefamily_t;
struct short_policy_t;
+struct smartlist_t;
#include "ext/ht.h"
uint16_t ipv6_orport;
/** As routerinfo_t.family, with readable members parsed. */
struct nodefamily_t *family;
+ /** A list of strings representing router family IDs.
+ * May be null; Copied from family-ids.
+ * (Happy families only.) */
+ struct smartlist_t *family_ids;
+
/** IPv4 exit policy summary */
struct short_policy_t *exit_policy;
/** IPv6 exit policy summary */
#include "feature/nodelist/signed_descriptor_st.h"
struct curve25519_public_key_t;
+struct smartlist_t;
/** Information about another onion router in the network. */
struct routerinfo_t {
long uptime; /**< How many seconds the router claims to have been up */
smartlist_t *declared_family; /**< Nicknames of router which this router
* claims are its family. */
+ /** A list of strings representing router family IDs.
+ * May be null. Extracted from family-certs.
+ * (Happy families only.) */
+ struct smartlist_t *family_ids;
char *contact_info; /**< Declared contact info for this router. */
unsigned int is_hibernating:1; /**< Whether the router claims to be
* hibernating */
SMARTLIST_FOREACH(router->declared_family, char *, s, tor_free(s));
smartlist_free(router->declared_family);
}
+ if (router->family_ids) {
+ SMARTLIST_FOREACH(router->family_ids, char *, cp, tor_free(cp));
+ smartlist_free(router->family_ids);
+ }
addr_policy_list_free(router->exit_policy);
short_policy_free(router->ipv6_exit_policy);