diff --git a/src/sources/mcast.c b/src/sources/mcast.c index 64abd8a..b4642da 100644 --- a/src/sources/mcast.c +++ b/src/sources/mcast.c @@ -14,6 +14,10 @@ #include #include +#include "../commands.h" +#include "../cmsg.h" +#include "../csocket.h" + #define DEFAULT_BIND_ADDR "0.0.0.0" #define DEFAULT_MCAST_ADDR "239.255.186.1" #define DEFAULT_MCAST_PORT "3370" @@ -195,11 +199,42 @@ stop(cfg_t *cfg) { bool next(cfg_t *cfg, char *buf, size_t bufsize, bool reset) { + const char *args[DATA_ARGS_MAX]; + struct sockaddr_storage addr; + socklen_t socklen; + f2b_cmsg_t cmsg; + int ret; + + (void)(reset); assert(cfg != NULL); assert(buf != NULL); assert(bufsize > 0); - /* TODO */ + memset(&cmsg, 0x0, sizeof(cmsg)); + memset(&addr, 0x0, sizeof(addr)); + + while (1) { + ret = f2b_csocket_recv(cfg->sock, &cmsg, &addr, &socklen); + if (ret == 0) + break; /* no messages */ + if (ret < 0) { + cfg->errcb(f2b_csocket_error(ret)); + continue; + } + /* ret > 0 */ + if (cmsg.type != CMD_JAIL_IP_BAN) + continue; + ret = f2b_cmsg_extract_args(&cmsg, args); + if (!f2b_cmd_check_argc(cmsg.type, ret)) { + cfg->errcb("received cmsg with wrong args count"); + continue; + } + if (strcmp(cfg->name, args[0]) != 0) + continue; /* wrong group */ + strlcpy(buf, args[1], bufsize); + return true; + } + return false; }