summaryrefslogtreecommitdiff
path: root/announce.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-21 23:42:05 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-21 23:42:05 +0200
commit2b2d6ad0541544074fd54c86af6de2e2947e62ce (patch)
tree84dee7bca11631193a86ee62e50916a3adc32ef4 /announce.c
parent0ba4f18ea6981b4d2b4eded11b2da4b2a2192d5b (diff)
Move mcast task to a per-server task to get refcounting right
Diffstat (limited to 'announce.c')
-rw-r--r--announce.c82
1 files changed, 9 insertions, 73 deletions
diff --git a/announce.c b/announce.c
index 9195cd2..f85ba1e 100644
--- a/announce.c
+++ b/announce.c
@@ -4,6 +4,7 @@
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
+#include <unistd.h>
#include "main.h"
#include "uring.h"
@@ -13,76 +14,14 @@
struct announce {
uint64_t value;
struct uring_task task;
- struct uring_task mcast_task;
+ int mcast_fd;
};
static void
-mcast_free(struct uring_task *task)
-{
- struct announce *aev = container_of(task, struct announce, mcast_task);
-
- assert_return(task);
- debug(DBG_ANN, "task %p, aev %p", task, aev);
-}
-
-static void
-mcast_sent(struct cfg *cfg, struct uring_task *task, int res)
-{
- struct server *server = container_of(task->tbuf, struct server, mcast_buf);
-
- assert_return(cfg && task && task->tbuf);
-
- if (res < 0)
- error("failure %i", res);
- else
- debug(DBG_ANN, "result %i", res);
-
- uring_task_put(cfg, &server->task);
-}
-
-static void
-mcast_send(struct cfg *cfg, struct announce *aev, struct server *server)
-{
- int len;
-
- assert_return(cfg && aev && server);
-
- /* FIXME: should these be assert:ed as well? */
- if (!server->pretty_name || server->announce_port < 1)
- return;
-
- len = snprintf(server->mcast_buf.buf, sizeof(server->mcast_buf.buf),
- "[MOTD]%s[/MOTD][AD]%" PRIu16 "[/AD]",
- server->pretty_name, server->announce_port);
-
- if (len < 1 || len >= sizeof(server->mcast_buf.buf)) {
- error("snprintf returned %i", len);
- return;
- }
-
- server->mcast_buf.len = len;
- uring_task_set_buf(&aev->mcast_task, &server->mcast_buf);
- uring_task_get(cfg, &server->task);
- uring_tbuf_sendmsg(cfg, &aev->mcast_task, mcast_sent);
-}
-
-static void
-mcast_send_all(struct cfg *cfg, struct announce *aev)
-{
- struct server *server;
-
- assert_return(cfg && aev);
-
- list_for_each_entry(server, &cfg->servers, list) {
- verbose("Announcing server: %s", server->name);
- mcast_send(cfg, aev, server);
- }
-}
-
-static void
announce_cb(struct cfg *cfg, struct uring_task *task, int res)
{
struct announce *aev = container_of(task, struct announce, task);
+ struct server *server;
assert_return(cfg && task);
assert_task_alive(DBG_ANN, task);
@@ -93,7 +32,8 @@ announce_cb(struct cfg *cfg, struct uring_task *task, int res)
}
debug(DBG_ANN, "timerfd value %" PRIu64, aev->value);
- mcast_send_all(cfg, aev);
+ list_for_each_entry(server, &cfg->servers, list)
+ server_announce(cfg, server, aev->mcast_fd);
uring_read(cfg, &aev->task, &aev->value, sizeof(aev->value), announce_cb);
}
@@ -103,7 +43,9 @@ announce_free(struct uring_task *task)
struct announce *aev = container_of(task, struct announce, task);
assert_return(task);
- debug(DBG_ANN, "task %p, aev 0x%p", task, aev);
+ debug(DBG_ANN, "task %p, aev 0x%p, mcast_fd: %i",
+ task, aev, aev->mcast_fd);
+ close(aev->mcast_fd);
xfree(aev);
}
@@ -113,7 +55,6 @@ announce_refdump(struct announce *aev)
assert_return_silent(aev);
uring_task_refdump(&aev->task);
- uring_task_refdump(&aev->mcast_task);
}
void
@@ -122,7 +63,6 @@ announce_delete(struct cfg *cfg)
assert_return(cfg && cfg->aev);
debug(DBG_ANN, "closing fd %i", cfg->aev->task.fd);
- uring_task_destroy(cfg, &cfg->aev->mcast_task);
uring_task_destroy(cfg, &cfg->aev->task);
cfg->aev = NULL;
}
@@ -190,11 +130,7 @@ announce_init(struct cfg *cfg)
uring_task_init(cfg, &aev->task, "aev", uring_parent(cfg), announce_free);
uring_task_set_fd(&aev->task, afd);
-
- uring_task_init(cfg, &aev->mcast_task, "aev_mcast", &aev->task, mcast_free);
- uring_task_set_fd(&aev->mcast_task, sfd);
- saddr_set_ipv4(&aev->mcast_task.saddr, cinet_addr(224,0,2,60), htons(4445));
-
+ aev->mcast_fd = sfd;
cfg->aev = aev;
uring_read(cfg, &aev->task, &aev->value, sizeof(aev->value), announce_cb);
}