xC: enable relay binding on multiple addresses
Alpine 3.24 Success
Arch Linux AUR Success
OpenBSD 7.8 Success

This commit is contained in:
2026-08-09 14:55:04 +02:00
parent 2d1df86a46
commit 621f76c797
2 changed files with 35 additions and 22 deletions
+2
View File
@@ -1,5 +1,7 @@
Unreleased
* xC: general.relay_bind is now a string array
* xC + all frontends: M-a now prioritizes highlights, newly added M-A looks
for buffers in reverse order, and the old M-! binding has been removed
+33 -22
View File
@@ -2061,7 +2061,7 @@ struct app_context
struct poller_fd tty_event; ///< Terminal input event
struct poller_fd signal_event; ///< Signal FD event
struct poller_fd relay_event; ///< New relay connection available
struct poller_fd *relay_events; ///< New relay connections available
struct poller_timer flush_timer; ///< Flush all open files (e.g. logs)
struct poller_timer date_chg_tmr; ///< Print a date change
@@ -2108,7 +2108,8 @@ struct app_context
// Relay:
int relay_fd; ///< Listening socket FD
int *relay_fds; ///< Listening socket FDs
size_t relay_len; ///< Number of listening sockets
struct client *clients; ///< Our relay clients
struct client *clients_tail; ///< End of the clients list
unsigned relay_resume_timeout; ///< Detached session TTL in seconds
@@ -2181,19 +2182,21 @@ app_context_init (struct app_context *self)
self->nick_palette =
filter_color_cube_for_acceptable_nick_colors (&self->nick_palette_len);
self->relay_fd = -1;
}
static void
app_context_relay_stop (struct app_context *self)
{
if (self->relay_fd != -1)
for (size_t i = 0; i < self->relay_len; i++)
{
poller_fd_reset (&self->relay_event);
xclose (self->relay_fd);
self->relay_fd = -1;
poller_fd_reset (&self->relay_events[i]);
xclose (self->relay_fds[i]);
}
free (self->relay_events);
free (self->relay_fds);
self->relay_events = NULL;
self->relay_fds = NULL;
self->relay_len = 0;
}
static void
@@ -2458,8 +2461,8 @@ static const struct config_schema g_config_general[] =
// Relay:
{ .name = "relay_bind",
.comment = "Address to bind to for a user interface relay point",
.type = CONFIG_ITEM_STRING,
.comment = "Addresses to bind to for user interface relay points",
.type = CONFIG_ITEM_STRING_ARRAY,
.validate = config_validate_nonjunk_string,
.on_change = on_config_relay_bind_change },
{ .name = "relay_resume_log_limit",
@@ -12175,7 +12178,7 @@ handle_command_relay (struct handler_args *a)
LIST_FOR_EACH (struct client, c, a->ctx->clients)
len++;
if (a->ctx->relay_fd == -1)
if (!a->ctx->relay_len)
log_global_status (a->ctx, "The relay is not enabled");
else
log_global_status (a->ctx, "The relay has #d clients", len);
@@ -15694,12 +15697,12 @@ relay_start (struct app_context *ctx, char *address, struct error **e)
set_blocking (fd, false);
struct poller_fd *event = &ctx->relay_event;
struct poller_fd *event = &ctx->relay_events[ctx->relay_len];
*event = poller_fd_make (&ctx->poller, fd);
event->dispatcher = (poller_fd_fn) on_relay_client_available;
event->user_data = ctx;
ctx->relay_fd = fd;
ctx->relay_fds[ctx->relay_len++] = fd;
poller_fd_set (event, POLLIN);
return true;
}
@@ -15708,21 +15711,29 @@ static void
on_config_relay_bind_change (struct config_item *item)
{
struct app_context *ctx = item->user_data;
char *value = item->value.string.str;
app_context_relay_stop (ctx);
if (!value)
if (item->type == CONFIG_ITEM_NULL)
return;
// XXX: This should perhaps be reencoded as the locale encoding.
char *address = xstrdup (value);
struct strv addresses = strv_make ();
cstr_split (item->value.string.str, ",", true, &addresses);
struct error *e = NULL;
if (!relay_start (ctx, address, &e))
ctx->relay_fds = xcalloc (addresses.len, sizeof *ctx->relay_fds);
ctx->relay_events = xcalloc (addresses.len, sizeof *ctx->relay_events);
for (size_t i = 0; i < addresses.len; i++)
{
log_global_error (ctx, "#s: #l", item->schema->name, e->message);
error_free (e);
// XXX: This should perhaps be reencoded as the locale encoding.
char *address = xstrdup (addresses.vector[i]);
struct error *e = NULL;
if (!relay_start (ctx, address, &e))
{
log_global_error (ctx, "#s: address `#l': #l",
item->schema->name, addresses.vector[i], e->message);
error_free (e);
}
free (address);
}
free (address);
strv_free (&addresses);
}
static void