From 0fecccd7c356836c8e01587f8246e39d5b5676d1 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Mon, 24 Aug 2020 22:52:52 -0500 Subject: [PATCH] Missed a spot with patty_ax25_pton() fix --- examples/connect.c | 2 +- examples/{server.c => daemon.c} | 0 examples/listen.c | 2 +- src/daemon.c | 163 ++++++++++++++++++++++++++++++++ 4 files changed, 165 insertions(+), 2 deletions(-) rename examples/{server.c => daemon.c} (100%) create mode 100644 src/daemon.c diff --git a/examples/connect.c b/examples/connect.c index f06f46a..c3a9eaa 100644 --- a/examples/connect.c +++ b/examples/connect.c @@ -44,7 +44,7 @@ int main(int argc, char **argv) { usage(argc, argv, "Too many arguments provided"); } - patty_ax25_pton(argv[2], 0, &peer); + patty_ax25_pton(argv[2], &peer); if ((client = patty_client_new(argv[1])) == NULL) { fprintf(stderr, "%s: %s: %s: %s\n", diff --git a/examples/server.c b/examples/daemon.c similarity index 100% rename from examples/server.c rename to examples/daemon.c diff --git a/examples/listen.c b/examples/listen.c index cf38128..aa7c8bc 100644 --- a/examples/listen.c +++ b/examples/listen.c @@ -47,7 +47,7 @@ int main(int argc, char **argv) { usage(argc, argv, "Too many arguments provided"); } - patty_ax25_pton(argv[2], 0, &addr); + patty_ax25_pton(argv[2], &addr); if ((client = patty_client_new(argv[1])) == NULL) { fprintf(stderr, "%s: %s: %s: %s\n", diff --git a/src/daemon.c b/src/daemon.c new file mode 100644 index 0000000..0e9b508 --- /dev/null +++ b/src/daemon.c @@ -0,0 +1,163 @@ +#include + +struct _patty_daemon { + char *sock_path, + *pidfile; + + patty_ax25_server *server; +}; + +patty_daemon *patty_daemon_new() { + patty_daemon *daemon; + + if ((daemon = malloc(sizeof(*daemon))) == NULL) { + goto error_malloc; + } + + if (patty_daemon_set_sock_path(daemon, PATTY_AX25_DAEMON_SOCK_PATH) < 0) { + goto error_set_sock_path; + } + + if (patty_daemon_set_pidfile(daemon, PATTY_AX25_DAEMON_PIDFILE) < 0) { + goto error_set_pidfile; + } + + return daemon; + +error_set_pidfile: + free(daemon->sock_path); + +error_set_sock_path: + free(daemon); + +error_malloc: + return NULL; +} + +void patty_daemon_destroy(patty_daemon *daemon) { + patty_ax25_server_destroy(daemon->server); +} + +int patty_daemon_init(patty_daemon *daemon) { + if ((daemon->server = patty_ax25_server_new(daemon->sock_path)) == NULL) { + goto error_server_new; + } + + return 0; + +error_server_new: + return -1; +} + +int patty_daemon_run(patty_daemon *daemon) { + if (patty_ax25_server_start(daemon->server) < 0) { + goto error_server_start; + } + + while (1) { + if (patty_ax25_server_event_handle(daemon->server) < 0) { + goto error_server_event_handle; + } + } + + patty_ax25_server_stop(daemon->server); + + return 0; + +error_server_event_handle: + return -1; +} + +int patty_daemon_set_sock_path(patty_daemon *daemon, const char *path) { + if (daemon->sock_path) { + free(daemon->sock_path); + } + + if ((daemon->sock_path = strdup(path)) == NULL) { + goto error_strdup; + } + + return 0; + +error_strdup: + return -1; +} + +int patty_daemon_set_pidfile(patty_daemon *daemon, const char *path) { + if (daemon->pidfile) { + free(daemon->pidfile); + } + + if ((daemon->pidfile = strdup(path)) == NULL) { + goto error_strdup; + } + + return 0; + +error_strdup: + return -1; +} + +int patty_ax25_daemon_if_add(patty_ax25_daemon *daemon, + int opts, + patty_ax25_if_info *info) { + patty_ax25_if *iface; + + if ((iface = patty_ax25_if_new(opts, info)) == NULL) { + goto error_if_new; + } + + return patty_ax25_server_add_if(daemon->server, iface); + +error_if_new: + return -1; +} + +int patty_ax25_daemon_route_add(patty_ax25_daemon *daemon, + const char *ifname, + const char *dest, + const char **repeaters, + int hops) { + patty_ax25_route *route; + patty_ax25_if *iface; + + int i; + + if ((iface = patty_ax25_server_if_get(daemon->server, ifname)) == NULL) { + goto error_server_if_get; + } + + if ((route = malloc(sizeof(*route))) == NULL) { + goto error_malloc_route; + } + + memset(&route, '\0', sizeof(route)); + + route->iface = iface; + + if (dest) { + if (patty_ax25_pton(dest, &route->dest) < 0) { + goto error_pton; + } + } + + for (i=0; irepeaters[i]) < 0) { + goto error_pton; + } + } + + return patty_ax25_server_route_add(daemon->server, route); + +error_pton: + free(route); + +error_malloc_route: +error_server_if_get: + return -1; +} + +int patty_daemon_route_add_default(patty_ax25_daemon *daemon, + const char *ifname) { + return patty_daemon_route_add(daemon, ifname, NULL, NULL, 0); +}