xC: enable relay binding on multiple addresses
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user