From 459c4ae387ce3bf02a4ab27c2fc382974f3e1fae Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sat, 6 Jun 2020 12:48:27 +0200 Subject: Fixup announce multicast messages to create real per-server messages --- announce.c | 64 ++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 25 deletions(-) (limited to 'announce.c') diff --git a/announce.c b/announce.c index 8194f1c..9af2236 100644 --- a/announce.c +++ b/announce.c @@ -9,11 +9,14 @@ #include "uring.h" #include "config.h" #include "announce.h" +#include "server.h" struct announce { uint64_t value; struct uring_task task; + struct uring_task mcast_task; + struct sockaddr_in mcast_addr; }; static void @@ -31,32 +34,39 @@ mcast_sent(struct cfg *cfg, struct uring_task *task, int res) } static void -mcast_send(struct cfg *cfg, struct announce *aev) +mcast_send(struct cfg *cfg, struct announce *aev, struct server *server) { - struct sockaddr_in addr; - struct msghdr msg; - char buf[] = "[MOTD]fumbor - test[/MOTD][AD]1234[/AD]"; - struct iovec iov = { - .iov_base = buf, - .iov_len = sizeof(buf) - }; + int len; + + if (!server || !server->pretty_name || server->announce_port < 1) + return; + + len = snprintf(server->mcast_buf, sizeof(server->mcast_buf), + "[MOTD]%s[/MOTD][AD]%" PRIu16 "[/AD]", + server->pretty_name, server->announce_port); + + if (len < 1 || len >= sizeof(server->mcast_buf)) { + error("%s: snprintf returned %i\n", __func__, len); + return; + } - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr("224.0.2.60"); - addr.sin_port = htons(4445); - - memset(&msg, 0, sizeof(msg)); - msg.msg_name = &addr; - msg.msg_namelen = sizeof(addr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; - - fprintf(stderr, "Manual: %zi\n", sendmsg(aev->mcast_task.fd, &msg, 0)); - uring_sendmsg(cfg, &aev->mcast_task, &msg, mcast_sent); + server->mcast_msg.msg_name = &aev->mcast_addr; + server->mcast_msg.msg_namelen = sizeof(aev->mcast_addr); + server->mcast_iov.iov_len = len; + + //uring_task_get(cfg, &server->task); <--- need to put in mcast_sent + uring_sendmsg(cfg, &aev->mcast_task, &server->mcast_msg, mcast_sent); +} + +static void +mcast_send_all(struct cfg *cfg, struct announce *aev) +{ + struct server *server; + + list_for_each_entry(server, &cfg->servers, list) { + fprintf(stderr, "Announcing server: %s\n", server->name); + mcast_send(cfg, aev, server); + } } static void @@ -76,7 +86,7 @@ announce_cb(struct cfg *cfg, struct uring_task *task, int res) perrordie("timerfd_read"); fprintf(stderr, "%s: called with value %" PRIu64 "\n", __func__, aev->value); - mcast_send(cfg, aev); + mcast_send_all(cfg, aev); uring_read(cfg, &aev->task, &aev->value, sizeof(aev->value), 0, announce_cb); } @@ -171,6 +181,10 @@ announce_init(struct cfg *cfg) uring_task_init(&aev->mcast_task, "aev_mcast", &aev->task, mcast_free); uring_task_set_fd(&aev->mcast_task, sfd); + memset(&aev->mcast_addr, 0, sizeof(aev->mcast_addr)); + aev->mcast_addr.sin_family = AF_INET; + aev->mcast_addr.sin_addr.s_addr = inet_addr("224.0.2.60"); + aev->mcast_addr.sin_port = htons(4445); cfg->aev = aev; uring_read(cfg, &aev->task, &aev->value, sizeof(aev->value), 0, announce_cb); -- cgit v1.2.3