From 32112416992e9619622b5e9b7a6a7fe4eda992c2 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 19 Apr 2018 10:55:02 -0400 Subject: [PATCH] Separate trp_route and trp_rtable, move timespec_to_str to tr_util.c No functional changes --- CMakeLists.txt | 2 +- Makefile.am | 5 +- common/tr_util.c | 27 ++++- include/tr_util.h | 4 + include/trp_route.h | 85 +++++++++++++++ include/trp_rtable.h | 46 +------- tr/tr_tid.c | 1 + tr/tr_trp.c | 1 + trp/test/ptbl_test.c | 1 + trp/test/rtbl_test.c | 1 + trp/trp_route.c | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++ trp/trp_rtable.c | 259 +-------------------------------------------- trp/trps.c | 21 +--- 13 files changed, 415 insertions(+), 326 deletions(-) create mode 100644 include/trp_route.h create mode 100644 trp/trp_route.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d660b5..cbf7714 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,7 +96,7 @@ set(SOURCE_FILES trp/trp_upd.c trp/trpc.c trp/trps.c include/tr_name_internal.h mon/mon_req.c mon/mon_req_encode.c mon/mon_req_decode.c - mon/mon_resp.c mon/mon_common.c mon/mon_resp_encode.c mon/mon_resp_decode.c tr/tr_mon.c mon/mons.c include/tr_socket.h common/tr_gss.c include/tr_gss.h common/tr_config_internal.c mon/mons_handlers.c include/mons_handlers.h tr/tr_tid_mons.c) + mon/mon_resp.c mon/mon_common.c mon/mon_resp_encode.c mon/mon_resp_decode.c tr/tr_mon.c mon/mons.c include/tr_socket.h common/tr_gss.c include/tr_gss.h common/tr_config_internal.c mon/mons_handlers.c include/mons_handlers.h tr/tr_tid_mons.c tr/tr_tid_mons.c trp/trp_route.c include/trp_route.h) # Does not actually build! add_executable(trust_router ${SOURCE_FILES}) diff --git a/Makefile.am b/Makefile.am index a65f9c9..8aedded 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,6 +32,7 @@ tid/tidc.c trp_srcs = trp/trp_conn.c \ trp/trps.c \ trp/trpc.c \ +trp/trp_route.c \ trp/trp_ptable.c \ trp/trp_rtable.c \ trp/trp_req.c \ @@ -133,6 +134,8 @@ trp_test_rtbl_test_SOURCES = trp/test/rtbl_test.c \ common/tr_name.c \ common/tr_gss_names.c \ common/tr_debug.c \ +common/tr_util.c \ +trp/trp_route.c \ trp/trp_rtable.c trp_test_rtbl_test_LDADD = $(GLIB_LIBS) @@ -247,7 +250,7 @@ noinst_HEADERS = include/gsscon.h include/tr_config.h \ include/tr_comm.h include/tr_apc.h \ include/tr_tid.h include/tr_trp.h include/tr_mon.h \ include/tr_filter.h include/tr_gss_names.h \ - include/tid_internal.h include/trp_internal.h \ + include/tid_internal.h include/trp_internal.h include/trp_route.h \ include/tr_cfgwatch.h include/tr_event.h \ include/tr_mq.h include/trp_ptable.h \ include/trp_rtable.h include/tr_util.h \ diff --git a/common/tr_util.c b/common/tr_util.c index 2ce3c82..ef85776 100644 --- a/common/tr_util.c +++ b/common/tr_util.c @@ -36,8 +36,8 @@ #include #include #include -#include #include +#include void tr_bin_to_hex(const unsigned char * bin, size_t bin_len, char * hex_out, size_t hex_len) @@ -71,3 +71,28 @@ int tr_cmp_timespec(struct timespec *ts1, struct timespec *ts2) return 0; } + +/** + * Convert a struct timespec to a string representation + * @param ts + * @return + */ +char *timespec_to_str(struct timespec *ts) +{ + struct tm tm; + char *s=NULL; + + if (localtime_r(&(ts->tv_sec), &tm)==NULL) + return NULL; + + s=malloc(40); /* long enough to contain strftime result */ + if (s==NULL) + return NULL; + + if (strftime(s, 40, "%F %T", &tm)==0) { + free(s); + return NULL; + } + return s; +} + diff --git a/include/tr_util.h b/include/tr_util.h index 3a3f7bc..bed0482 100644 --- a/include/tr_util.h +++ b/include/tr_util.h @@ -37,6 +37,10 @@ #include +/* NB, tr_bin_to_hex() is also prototyped in trust_router/tr_dh.h */ +TR_EXPORT void tr_bin_to_hex(const unsigned char * bin, size_t binlen, + char * hex_out, size_t hex_len); TR_EXPORT int tr_cmp_timespec(struct timespec *ts1, struct timespec *ts2); +char *timespec_to_str(struct timespec *ts); #endif /* TR_UTIL_H */ diff --git a/include/trp_route.h b/include/trp_route.h new file mode 100644 index 0000000..f4451c4 --- /dev/null +++ b/include/trp_route.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016-2018, JANET(UK) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of JANET(UK) nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +#ifndef TRUST_ROUTER_TRP_ROUTE_H +#define TRUST_ROUTER_TRP_ROUTE_H +typedef struct trp_route { + TR_NAME *comm; + TR_NAME *realm; + TR_NAME *peer; + unsigned int metric; + TR_NAME *trust_router; /* hostname */ + unsigned int trp_port; + unsigned int tid_port; + TR_NAME *next_hop; + int selected; + unsigned int interval; /* interval from route update */ + struct timespec *expiry; + int local; /* is this a local route? */ + int triggered; +} TRP_ROUTE; + +TRP_ROUTE *trp_route_new(TALLOC_CTX *mem_ctx); +void trp_route_free(TRP_ROUTE *entry); +void trp_route_set_comm(TRP_ROUTE *entry, TR_NAME *comm); +TR_NAME *trp_route_get_comm(TRP_ROUTE *entry); +TR_NAME *trp_route_dup_comm(TRP_ROUTE *entry); +void trp_route_set_realm(TRP_ROUTE *entry, TR_NAME *realm); +TR_NAME *trp_route_get_realm(TRP_ROUTE *entry); +TR_NAME *trp_route_dup_realm(TRP_ROUTE *entry); +void trp_route_set_trust_router(TRP_ROUTE *entry, TR_NAME *tr); +TR_NAME *trp_route_get_trust_router(TRP_ROUTE *entry); +TR_NAME *trp_route_dup_trust_router(TRP_ROUTE *entry); +void trp_route_set_peer(TRP_ROUTE *entry, TR_NAME *peer); +TR_NAME *trp_route_get_peer(TRP_ROUTE *entry); +TR_NAME *trp_route_dup_peer(TRP_ROUTE *entry); +void trp_route_set_metric(TRP_ROUTE *entry, unsigned int metric); +unsigned int trp_route_get_metric(TRP_ROUTE *entry); +void trp_route_set_next_hop(TRP_ROUTE *entry, TR_NAME *next_hop); +TR_NAME *trp_route_get_next_hop(TRP_ROUTE *entry); +TR_NAME *trp_route_dup_next_hop(TRP_ROUTE *entry); +void trp_route_set_selected(TRP_ROUTE *entry, int sel); +int trp_route_is_selected(TRP_ROUTE *entry); +void trp_route_set_interval(TRP_ROUTE *entry, int interval); +int trp_route_get_interval(TRP_ROUTE *entry); +void trp_route_set_expiry(TRP_ROUTE *entry, struct timespec *exp); +struct timespec *trp_route_get_expiry(TRP_ROUTE *entry); +void trp_route_set_local(TRP_ROUTE *entry, int local); +int trp_route_is_local(TRP_ROUTE *entry); +void trp_route_set_triggered(TRP_ROUTE *entry, int trig); +int trp_route_is_triggered(TRP_ROUTE *entry); +char *trp_route_to_str(TALLOC_CTX *mem_ctx, TRP_ROUTE *entry, const char *sep); + +#endif //TRUST_ROUTER_TRP_ROUTE_H diff --git a/include/trp_rtable.h b/include/trp_rtable.h index 583b5a7..6b3b915 100644 --- a/include/trp_rtable.h +++ b/include/trp_rtable.h @@ -39,23 +39,9 @@ #include #include +#include #include -typedef struct trp_route { - TR_NAME *comm; - TR_NAME *realm; - TR_NAME *peer; - unsigned int metric; - TR_NAME *trust_router; /* hostname */ - unsigned int trp_port; - unsigned int tid_port; - TR_NAME *next_hop; - int selected; - unsigned int interval; /* interval from route update */ - struct timespec *expiry; - int local; /* is this a local route? */ - int triggered; -} TRP_ROUTE; typedef GHashTable TRP_RTABLE; @@ -78,35 +64,5 @@ TRP_ROUTE *trp_rtable_get_selected_entry(TRP_RTABLE *rtbl, TR_NAME *comm, TR_NAM void trp_rtable_clear_triggered(TRP_RTABLE *rtbl); char *trp_rtable_to_str(TALLOC_CTX *mem_ctx, TRP_RTABLE *rtbl, const char *sep, const char *lineterm); -TRP_ROUTE *trp_route_new(TALLOC_CTX *mem_ctx); -void trp_route_free(TRP_ROUTE *entry); -void trp_route_set_comm(TRP_ROUTE *entry, TR_NAME *comm); -TR_NAME *trp_route_get_comm(TRP_ROUTE *entry); -TR_NAME *trp_route_dup_comm(TRP_ROUTE *entry); -void trp_route_set_realm(TRP_ROUTE *entry, TR_NAME *realm); -TR_NAME *trp_route_get_realm(TRP_ROUTE *entry); -TR_NAME *trp_route_dup_realm(TRP_ROUTE *entry); -void trp_route_set_trust_router(TRP_ROUTE *entry, TR_NAME *tr); -TR_NAME *trp_route_get_trust_router(TRP_ROUTE *entry); -TR_NAME *trp_route_dup_trust_router(TRP_ROUTE *entry); -void trp_route_set_peer(TRP_ROUTE *entry, TR_NAME *peer); -TR_NAME *trp_route_get_peer(TRP_ROUTE *entry); -TR_NAME *trp_route_dup_peer(TRP_ROUTE *entry); -void trp_route_set_metric(TRP_ROUTE *entry, unsigned int metric); -unsigned int trp_route_get_metric(TRP_ROUTE *entry); -void trp_route_set_next_hop(TRP_ROUTE *entry, TR_NAME *next_hop); -TR_NAME *trp_route_get_next_hop(TRP_ROUTE *entry); -TR_NAME *trp_route_dup_next_hop(TRP_ROUTE *entry); -void trp_route_set_selected(TRP_ROUTE *entry, int sel); -int trp_route_is_selected(TRP_ROUTE *entry); -void trp_route_set_interval(TRP_ROUTE *entry, int interval); -int trp_route_get_interval(TRP_ROUTE *entry); -void trp_route_set_expiry(TRP_ROUTE *entry, struct timespec *exp); -struct timespec *trp_route_get_expiry(TRP_ROUTE *entry); -void trp_route_set_local(TRP_ROUTE *entry, int local); -int trp_route_is_local(TRP_ROUTE *entry); -void trp_route_set_triggered(TRP_ROUTE *entry, int trig); -int trp_route_is_triggered(TRP_ROUTE *entry); -char *trp_route_to_str(TALLOC_CTX *mem_ctx, TRP_ROUTE *entry, const char *sep); #endif /* _TRP_RTABLE_H_ */ diff --git a/tr/tr_tid.c b/tr/tr_tid.c index fdf40d6..6c649c0 100644 --- a/tr/tr_tid.c +++ b/tr/tr_tid.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include diff --git a/tr/tr_trp.c b/tr/tr_trp.c index 8873720..bd98c81 100644 --- a/tr/tr_trp.c +++ b/tr/tr_trp.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include diff --git a/trp/test/ptbl_test.c b/trp/test/ptbl_test.c index 568a445..95b0756 100644 --- a/trp/test/ptbl_test.c +++ b/trp/test/ptbl_test.c @@ -37,6 +37,7 @@ #include #include +#include #include #include diff --git a/trp/test/rtbl_test.c b/trp/test/rtbl_test.c index 0ec1ec0..8faccca 100644 --- a/trp/test/rtbl_test.c +++ b/trp/test/rtbl_test.c @@ -38,6 +38,7 @@ #include #include +#include #include #include diff --git a/trp/trp_route.c b/trp/trp_route.c new file mode 100644 index 0000000..d333a8f --- /dev/null +++ b/trp/trp_route.c @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2016-2018, JANET(UK) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of JANET(UK) nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Note: be careful mixing talloc with glib. */ + +static int trp_route_destructor(void *obj) +{ + TRP_ROUTE *entry=talloc_get_type_abort(obj, TRP_ROUTE); + if (entry->comm!=NULL) + tr_free_name(entry->comm); + if (entry->realm!=NULL) + tr_free_name(entry->realm); + if (entry->trust_router!=NULL) + tr_free_name(entry->trust_router); + if (entry->peer!=NULL) + tr_free_name(entry->peer); + if (entry->next_hop!=NULL) + tr_free_name(entry->next_hop); + return 0; +} + +TRP_ROUTE *trp_route_new(TALLOC_CTX *mem_ctx) +{ + TRP_ROUTE *entry=talloc(mem_ctx, TRP_ROUTE); + if (entry!=NULL) { + entry->comm=NULL; + entry->realm=NULL; + entry->trust_router=NULL; + entry->trp_port=TRP_PORT; + entry->tid_port=TID_PORT; + entry->peer=NULL; + entry->next_hop=NULL; + entry->selected=0; + entry->interval=0; + entry->expiry=talloc(entry, struct timespec); + if (entry->expiry==NULL) { + talloc_free(entry); + return NULL; + } + *(entry->expiry)=(struct timespec){0,0}; + entry->local=0; + entry->triggered=0; + talloc_set_destructor((void *)entry, trp_route_destructor); + } + return entry; +} + +void trp_route_free(TRP_ROUTE *entry) +{ + if (entry!=NULL) + talloc_free(entry); +} + +void trp_route_set_comm(TRP_ROUTE *entry, TR_NAME *comm) +{ + if (entry->comm!=NULL) + tr_free_name(entry->comm); + entry->comm=comm; +} + +TR_NAME *trp_route_get_comm(TRP_ROUTE *entry) +{ + return entry->comm; +} + +TR_NAME *trp_route_dup_comm(TRP_ROUTE *entry) +{ + return tr_dup_name(trp_route_get_comm(entry)); +} + +void trp_route_set_realm(TRP_ROUTE *entry, TR_NAME *realm) +{ + if (entry->realm!=NULL) + tr_free_name(entry->realm); + entry->realm=realm; +} + +TR_NAME *trp_route_get_realm(TRP_ROUTE *entry) +{ + return entry->realm; +} + +TR_NAME *trp_route_dup_realm(TRP_ROUTE *entry) +{ + return tr_dup_name(trp_route_get_realm(entry)); +} + +void trp_route_set_trust_router(TRP_ROUTE *entry, TR_NAME *tr) +{ + if (entry->trust_router!=NULL) + tr_free_name(entry->trust_router); + entry->trust_router=tr; +} + +TR_NAME *trp_route_get_trust_router(TRP_ROUTE *entry) +{ + return entry->trust_router; +} + +TR_NAME *trp_route_dup_trust_router(TRP_ROUTE *entry) +{ + return tr_dup_name(trp_route_get_trust_router(entry)); +} + +void trp_route_set_peer(TRP_ROUTE *entry, TR_NAME *peer) +{ + if (entry->peer!=NULL) + tr_free_name(entry->peer); + entry->peer=peer; +} + +TR_NAME *trp_route_get_peer(TRP_ROUTE *entry) +{ + return entry->peer; +} + +TR_NAME *trp_route_dup_peer(TRP_ROUTE *entry) +{ + return tr_dup_name(trp_route_get_peer(entry)); +} + +void trp_route_set_metric(TRP_ROUTE *entry, unsigned int metric) +{ + entry->metric=metric; +} + +unsigned int trp_route_get_metric(TRP_ROUTE *entry) +{ + return entry->metric; +} + +/* TODO: set the hostname and port for the next hop. Currently assume default TID port. --jlr */ +void trp_route_set_next_hop(TRP_ROUTE *entry, TR_NAME *next_hop) +{ + if (entry->next_hop!=NULL) + tr_free_name(entry->next_hop); + entry->next_hop=next_hop; +} + +TR_NAME *trp_route_get_next_hop(TRP_ROUTE *entry) +{ + return entry->next_hop; +} + +TR_NAME *trp_route_dup_next_hop(TRP_ROUTE *entry) +{ + return tr_dup_name(trp_route_get_next_hop(entry)); +} + +void trp_route_set_selected(TRP_ROUTE *entry, int sel) +{ + entry->selected=sel; +} + +int trp_route_is_selected(TRP_ROUTE *entry) +{ + return entry->selected; +} + +void trp_route_set_interval(TRP_ROUTE *entry, int interval) +{ + entry->interval=interval; +} + +int trp_route_get_interval(TRP_ROUTE *entry) +{ + return entry->interval; +} + +/* copies incoming value, does not assume responsibility for freeing */ +void trp_route_set_expiry(TRP_ROUTE *entry, struct timespec *exp) +{ + entry->expiry->tv_sec=exp->tv_sec; + entry->expiry->tv_nsec=exp->tv_nsec; +} + +struct timespec *trp_route_get_expiry(TRP_ROUTE *entry) +{ + return entry->expiry; +} + +void trp_route_set_local(TRP_ROUTE *entry, int local) +{ + entry->local=local; +} + +int trp_route_is_local(TRP_ROUTE *entry) +{ + return entry->local; +} + +void trp_route_set_triggered(TRP_ROUTE *entry, int trig) +{ + tr_debug("trp_route_set_triggered: setting route to %.*s/%.*s through %.*s to %s", + entry->comm->len, entry->comm->buf, + entry->realm->len, entry->realm->buf, + entry->peer->len, entry->peer->buf, + trig ? "triggered" : "not triggered"); + entry->triggered=trig; +} + +int trp_route_is_triggered(TRP_ROUTE *entry) +{ + return entry->triggered; +} + +/* Pretty print a route table entry to a newly allocated string. If sep is NULL, + * returns comma+space separated string. */ +char *trp_route_to_str(TALLOC_CTX *mem_ctx, TRP_ROUTE *entry, const char *sep) +{ + char *comm=tr_name_strdup(entry->comm); + char *realm=tr_name_strdup(entry->realm); + char *peer=tr_name_strdup(entry->peer); + char *trust_router=tr_name_strdup(entry->trust_router); + char *next_hop=tr_name_strdup(entry->next_hop); + char *expiry=timespec_to_str(entry->expiry); + char *result=NULL; + + if (sep==NULL) + sep=", "; + + result=talloc_asprintf(mem_ctx, + "%s%s%s%s%s%s%u%s%s%s%s%s%u%s%u%s%s%s%u", + comm, sep, + realm, sep, + peer, sep, + entry->metric, sep, + trust_router, sep, + next_hop, sep, + entry->selected, sep, + entry->local, sep, + expiry, sep, + entry->triggered); + free(comm); + free(realm); + free(peer); + free(trust_router); + free(next_hop); + free(expiry); + return result; +} diff --git a/trp/trp_rtable.c b/trp/trp_rtable.c index e2ea5bb..7f79351 100644 --- a/trp/trp_rtable.c +++ b/trp/trp_rtable.c @@ -39,215 +39,13 @@ #include #include +#include #include #include #include #include #include -/* Note: be careful mixing talloc with glib. */ - -static int trp_route_destructor(void *obj) -{ - TRP_ROUTE *entry=talloc_get_type_abort(obj, TRP_ROUTE); - if (entry->comm!=NULL) - tr_free_name(entry->comm); - if (entry->realm!=NULL) - tr_free_name(entry->realm); - if (entry->trust_router!=NULL) - tr_free_name(entry->trust_router); - if (entry->peer!=NULL) - tr_free_name(entry->peer); - if (entry->next_hop!=NULL) - tr_free_name(entry->next_hop); - return 0; -} - -TRP_ROUTE *trp_route_new(TALLOC_CTX *mem_ctx) -{ - TRP_ROUTE *entry=talloc(mem_ctx, TRP_ROUTE); - if (entry!=NULL) { - entry->comm=NULL; - entry->realm=NULL; - entry->trust_router=NULL; - entry->trp_port=TRP_PORT; - entry->tid_port=TID_PORT; - entry->peer=NULL; - entry->next_hop=NULL; - entry->selected=0; - entry->interval=0; - entry->expiry=talloc(entry, struct timespec); - if (entry->expiry==NULL) { - talloc_free(entry); - return NULL; - } - *(entry->expiry)=(struct timespec){0,0}; - entry->local=0; - entry->triggered=0; - talloc_set_destructor((void *)entry, trp_route_destructor); - } - return entry; -} - -void trp_route_free(TRP_ROUTE *entry) -{ - if (entry!=NULL) - talloc_free(entry); -} - -void trp_route_set_comm(TRP_ROUTE *entry, TR_NAME *comm) -{ - if (entry->comm!=NULL) - tr_free_name(entry->comm); - entry->comm=comm; -} - -TR_NAME *trp_route_get_comm(TRP_ROUTE *entry) -{ - return entry->comm; -} - -TR_NAME *trp_route_dup_comm(TRP_ROUTE *entry) -{ - return tr_dup_name(trp_route_get_comm(entry)); -} - -void trp_route_set_realm(TRP_ROUTE *entry, TR_NAME *realm) -{ - if (entry->realm!=NULL) - tr_free_name(entry->realm); - entry->realm=realm; -} - -TR_NAME *trp_route_get_realm(TRP_ROUTE *entry) -{ - return entry->realm; -} - -TR_NAME *trp_route_dup_realm(TRP_ROUTE *entry) -{ - return tr_dup_name(trp_route_get_realm(entry)); -} - -void trp_route_set_trust_router(TRP_ROUTE *entry, TR_NAME *tr) -{ - if (entry->trust_router!=NULL) - tr_free_name(entry->trust_router); - entry->trust_router=tr; -} - -TR_NAME *trp_route_get_trust_router(TRP_ROUTE *entry) -{ - return entry->trust_router; -} - -TR_NAME *trp_route_dup_trust_router(TRP_ROUTE *entry) -{ - return tr_dup_name(trp_route_get_trust_router(entry)); -} - -void trp_route_set_peer(TRP_ROUTE *entry, TR_NAME *peer) -{ - if (entry->peer!=NULL) - tr_free_name(entry->peer); - entry->peer=peer; -} - -TR_NAME *trp_route_get_peer(TRP_ROUTE *entry) -{ - return entry->peer; -} - -TR_NAME *trp_route_dup_peer(TRP_ROUTE *entry) -{ - return tr_dup_name(trp_route_get_peer(entry)); -} - -void trp_route_set_metric(TRP_ROUTE *entry, unsigned int metric) -{ - entry->metric=metric; -} - -unsigned int trp_route_get_metric(TRP_ROUTE *entry) -{ - return entry->metric; -} - -/* TODO: set the hostname and port for the next hop. Currently assume default TID port. --jlr */ -void trp_route_set_next_hop(TRP_ROUTE *entry, TR_NAME *next_hop) -{ - if (entry->next_hop!=NULL) - tr_free_name(entry->next_hop); - entry->next_hop=next_hop; -} - -TR_NAME *trp_route_get_next_hop(TRP_ROUTE *entry) -{ - return entry->next_hop; -} - -TR_NAME *trp_route_dup_next_hop(TRP_ROUTE *entry) -{ - return tr_dup_name(trp_route_get_next_hop(entry)); -} - -void trp_route_set_selected(TRP_ROUTE *entry, int sel) -{ - entry->selected=sel; -} - -int trp_route_is_selected(TRP_ROUTE *entry) -{ - return entry->selected; -} - -void trp_route_set_interval(TRP_ROUTE *entry, int interval) -{ - entry->interval=interval; -} - -int trp_route_get_interval(TRP_ROUTE *entry) -{ - return entry->interval; -} - -/* copies incoming value, does not assume responsibility for freeing */ -void trp_route_set_expiry(TRP_ROUTE *entry, struct timespec *exp) -{ - entry->expiry->tv_sec=exp->tv_sec; - entry->expiry->tv_nsec=exp->tv_nsec; -} - -struct timespec *trp_route_get_expiry(TRP_ROUTE *entry) -{ - return entry->expiry; -} - -void trp_route_set_local(TRP_ROUTE *entry, int local) -{ - entry->local=local; -} - -int trp_route_is_local(TRP_ROUTE *entry) -{ - return entry->local; -} - -void trp_route_set_triggered(TRP_ROUTE *entry, int trig) -{ - tr_debug("trp_route_set_triggered: setting route to %.*s/%.*s through %.*s to %s", - entry->comm->len, entry->comm->buf, - entry->realm->len, entry->realm->buf, - entry->peer->len, entry->peer->buf, - trig ? "triggered" : "not triggered"); - entry->triggered=trig; -} - -int trp_route_is_triggered(TRP_ROUTE *entry) -{ - return entry->triggered; -} - /* result must be freed with g_free */ static gchar *tr_name_to_g_str(const TR_NAME *n) @@ -632,25 +430,6 @@ TRP_ROUTE *trp_rtable_get_entry(TRP_RTABLE *rtbl, TR_NAME *comm, TR_NAME *realm, return g_hash_table_lookup(realm_tbl, peer); /* does not copy or increment ref count */ } -static char *timespec_to_str(struct timespec *ts) -{ - struct tm tm; - char *s=NULL; - - if (localtime_r(&(ts->tv_sec), &tm)==NULL) - return NULL; - - s=malloc(40); /* long enough to contain strftime result */ - if (s==NULL) - return NULL; - - if (strftime(s, 40, "%F %T", &tm)==0) { - free(s); - return NULL; - } - return s; -} - TRP_ROUTE *trp_rtable_get_selected_entry(TRP_RTABLE *rtbl, TR_NAME *comm, TR_NAME *realm) { size_t n=0; @@ -675,42 +454,6 @@ TRP_ROUTE *trp_rtable_get_selected_entry(TRP_RTABLE *rtbl, TR_NAME *comm, TR_NAM return selected; } -/* Pretty print a route table entry to a newly allocated string. If sep is NULL, - * returns comma+space separated string. */ -char *trp_route_to_str(TALLOC_CTX *mem_ctx, TRP_ROUTE *entry, const char *sep) -{ - char *comm=tr_name_strdup(entry->comm); - char *realm=tr_name_strdup(entry->realm); - char *peer=tr_name_strdup(entry->peer); - char *trust_router=tr_name_strdup(entry->trust_router); - char *next_hop=tr_name_strdup(entry->next_hop); - char *expiry=timespec_to_str(entry->expiry); - char *result=NULL; - - if (sep==NULL) - sep=", "; - - result=talloc_asprintf(mem_ctx, - "%s%s%s%s%s%s%u%s%s%s%s%s%u%s%u%s%s%s%u", - comm, sep, - realm, sep, - peer, sep, - entry->metric, sep, - trust_router, sep, - next_hop, sep, - entry->selected, sep, - entry->local, sep, - expiry, sep, - entry->triggered); - free(comm); - free(realm); - free(peer); - free(trust_router); - free(next_hop); - free(expiry); - return result; -} - void trp_rtable_clear_triggered(TRP_RTABLE *rtbl) { size_t n_entries=0; diff --git a/trp/trps.c b/trp/trps.c index 193faaa..c97ac8f 100644 --- a/trp/trps.c +++ b/trp/trps.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -1172,26 +1173,6 @@ TRP_RC trps_sweep_routes(TRPS_INSTANCE *trps) } -static char *timespec_to_str(struct timespec *ts) -{ - struct tm tm; - char *s=NULL; - - if (localtime_r(&(ts->tv_sec), &tm)==NULL) - return NULL; - - s=malloc(40); /* long enough to contain strftime result */ - if (s==NULL) - return NULL; - - if (strftime(s, 40, "%F %T", &tm)==0) { - free(s); - return NULL; - } - return s; -} - - /* Sweep for expired communities/realms/memberships. */ TRP_RC trps_sweep_ctable(TRPS_INSTANCE *trps) { -- 2.1.4