diff options
Diffstat (limited to 'degesch.c')
-rw-r--r-- | degesch.c | 61 |
1 files changed, 59 insertions, 2 deletions
@@ -1269,6 +1269,10 @@ server_free (struct server *self) str_free (&self->read_buffer); str_free (&self->write_buffer); + poller_timer_reset (&self->ping_tmr); + poller_timer_reset (&self->timeout_tmr); + poller_timer_reset (&self->reconnect_tmr); + str_map_free (&self->irc_users); str_map_free (&self->irc_channels); str_map_free (&self->irc_buffer_map); @@ -2917,7 +2921,6 @@ buffer_remove (struct app_context *ctx, struct buffer *buffer) { hard_assert (buffer != ctx->current_buffer); hard_assert (buffer != ctx->global_buffer); - hard_assert (buffer->type != BUFFER_SERVER); input_destroy_buffer (&ctx->input, buffer->input_data); buffer->input_data = NULL; @@ -2931,6 +2934,8 @@ buffer_remove (struct app_context *ctx, struct buffer *buffer) if (buffer == ctx->last_buffer) ctx->last_buffer = NULL; + if (buffer->type == BUFFER_SERVER) + buffer->server->buffer = NULL; str_map_set (&ctx->buffers_by_name, buffer->name, NULL); LIST_UNLINK_WITH_TAIL (ctx->buffers, ctx->buffers_tail, buffer); @@ -6557,6 +6562,35 @@ server_add_new (struct app_context *ctx, const char *name) } } +static void +server_remove (struct app_context *ctx, struct server *s) +{ + hard_assert (!irc_is_connected (s)); + + if (s->buffer) + buffer_remove_safe (ctx, s->buffer); + + struct str_map_iter iter; + str_map_iter_init (&iter, &s->irc_buffer_map); + struct buffer *buffer, *next = str_map_iter_next (&iter); + for (buffer = next; buffer; buffer = next) + { + next = str_map_iter_next (&iter); + buffer_remove_safe (ctx, buffer); + } + + hard_assert (!s->buffer); + hard_assert (!s->irc_buffer_map.len); + hard_assert (!s->irc_channels.len); + soft_assert (!s->irc_users.len); + + str_map_set (get_servers_config (ctx), s->name, NULL); + s->config = NULL; + + // This actually destroys the server as it's owned by the map + str_map_set (&ctx->servers, s->name, NULL); +} + // --- User input handling ----------------------------------------------------- // HANDLER_NEEDS_REG is primarily for message sending commands, @@ -7478,7 +7512,30 @@ handle_server_add (struct handler_args *a) struct app_context *ctx = a->ctx; char *name = cut_word (&a->arguments); if (check_server_name_for_addition (ctx, name)) + { server_add_new (ctx, name); + log_global_status (ctx, "Server added: #s", name); + } + return true; +} + +static bool +handle_server_remove (struct handler_args *a) +{ + struct app_context *ctx = a->ctx; + struct server *s = NULL; + if (!(s = resolve_server (ctx, a, "server"))) + return true; + + if (irc_is_connected (s)) + log_server_error (s, s->buffer, "Can't remove a connected server"); + else + { + char *name = xstrdup (s->name); + server_remove (ctx, s); + log_global_status (ctx, "Server removed: #s", name); + free (name); + } return true; } @@ -7496,7 +7553,7 @@ handle_command_server (struct handler_args *a) else if (!strcasecmp_ascii (action, "add")) result = handle_server_add (a); else if (!strcasecmp_ascii (action, "remove")) - ; // TODO: <name> + result = handle_server_remove (a); else if (!strcasecmp_ascii (action, "rename")) ; // TODO: <old> <new> else |