summaryrefslogtreecommitdiff
path: root/tacplus-daemon/tacplus_srv_conn.h
diff options
context:
space:
mode:
Diffstat (limited to 'tacplus-daemon/tacplus_srv_conn.h')
-rw-r--r--tacplus-daemon/tacplus_srv_conn.h149
1 files changed, 149 insertions, 0 deletions
diff --git a/tacplus-daemon/tacplus_srv_conn.h b/tacplus-daemon/tacplus_srv_conn.h
new file mode 100644
index 0000000..4b14ab8
--- /dev/null
+++ b/tacplus-daemon/tacplus_srv_conn.h
@@ -0,0 +1,149 @@
+/*
+ TACACS+ D-Bus Daemon code
+
+ Copyright (c) 2018-2019 AT&T Intellectual Property.
+ Copyright (c) 2015-2016 Brocade Communications Systems, Inc.
+
+ SPDX-License-Identifier: GPL-2.0-only
+*/
+
+#ifndef TACPLUS_SRV_CONN_H
+#define TACPLUS_SRV_CONN_H
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <time.h>
+#include <libtac.h>
+
+#include "utils.h"
+
+#define TACPLUSD_IDLE_TIMEOUT 300
+#define TACPLUSD_REQUEST_RETRIES 3
+
+struct tacplus_options_server;
+
+struct tac_session_extra {
+ unsigned server_id;
+ struct tacplus_options_server *server;
+#ifdef HAVE_LIBTAC_EVENT
+ session_event_t state;
+#endif
+};
+
+struct tacplus_options
+{
+ unsigned n_servers, curr_server, next_server;
+ bool broadcast;
+ uint8_t dscp;
+ unsigned setupTimeout;
+ struct tacplus_options_server {
+ unsigned id;
+ struct addrinfo *addrs;
+ struct addrinfo *src_addrs;
+ const char *src_intf;
+ int timeout;
+ unsigned hold_down;
+ const char *secret;
+#ifdef HAVE_LIBTAC_EVENT
+ struct tac_session *session;
+#else
+ int fd;
+#endif
+ struct tacplus_server_state {
+ struct timespec lastTrouble;
+ } state;
+ } server[0];
+};
+
+#define HIGHEST_PRIO_SERVER_ID 0
+#define INVALID_SERVER_ID (TACPLUS_MAX_SERVERS + 1)
+
+#define TACPLUS_SERVER_LOOP(O,S) \
+ struct tacplus_options_server *S; \
+ for (unsigned _i = 0; _i < (O)->n_servers; _i++) \
+ if ((S = tacplus_server((O), _i)))
+
+struct tacplus_options *tacplus_options_alloc(unsigned n);
+
+static inline
+struct tacplus_options_server *tacplus_server(struct tacplus_options *opts, unsigned i)
+{
+ return i >= opts->n_servers ? NULL : (struct tacplus_options_server *)&opts->server[i];
+}
+
+#ifndef HAVE_LIBTAC_EVENT
+static inline
+struct tacplus_options_server *tacplus_current_server(struct tacplus_options *opts)
+{
+ return tacplus_server(opts, opts->curr_server);
+}
+
+/*
+ * Populate a tac_session_extra structure with the details of the currently
+ * active server.
+ *
+ * This reduces the amount of ifdef'd code required to support both event-driven
+ * and non-event-driven libtac implementations.
+ */
+static inline
+struct tac_session_extra *tacplus_current_session_extra(struct tacplus_options *opts,
+ struct tac_session_extra *extra)
+{
+ if (extra) {
+ extra->server_id = opts->curr_server;
+ extra->server = tacplus_current_server(opts);
+ }
+
+ return extra;
+}
+#else
+static inline
+struct tac_session *tacplus_session(struct tacplus_options *opts)
+{
+ if (opts->n_servers > 0)
+ return opts->server[opts->curr_server].session;
+ else
+ return NULL;
+}
+#endif
+
+bool tacplus_connect(void);
+unsigned tacplus_connect_all(void);
+
+struct tacplus_options *tacplus_parse_options(const char *);
+
+struct tacplus_options *tacplus_parse_reload_options(const char *file,
+ struct tacplus_options **cur_opts);
+
+struct tacplus_options *tacplus_reload_options(struct tacplus_options **cur_opts,
+ struct tacplus_options *new_opts);
+
+#ifdef HAVE_LIBTAC_EVENT
+void tacplus_session_close(struct tac_session *);
+#else
+void tacplus_close();
+#endif
+
+void cleanup_tacplus_options(struct tacplus_options **);
+
+bool
+tacplus_server_remaining_hold_down(const struct tacplus_options_server *server,
+ struct timespec *remaining);
+
+time_t
+tacplus_server_remaining_hold_down_secs(const struct tacplus_options_server *server);
+
+bool
+tacplus_server_is_held_down(const struct tacplus_options_server *server);
+
+void
+tacplus_server_activate_hold_down(struct tacplus_options_server *server);
+
+void
+tacplus_server_reset_hold_down(struct tacplus_options_server *server);
+
+void
+tacplus_copy_server_state(struct tacplus_options *from_opts,
+ struct tacplus_options *to_opts);
+
+#endif /* TACPLUS_SRV_CONN_H */