summaryrefslogtreecommitdiff
path: root/announce.c
diff options
context:
space:
mode:
Diffstat (limited to 'announce.c')
-rw-r--r--announce.c64
1 files changed, 39 insertions, 25 deletions
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);