void relay_server_free (struct t_relay_server *server) { struct t_relay_server *new_relay_servers; if (!server) return; /* remove server from list */ if (last_relay_server == server) last_relay_server = server->prev_server; if (server->prev_server) { (server->prev_server)->next_server = server->next_server; new_relay_servers = relay_servers; } else new_relay_servers = server->next_server; if (server->next_server) (server->next_server)->prev_server = server->prev_server; /* free data */ relay_server_close_socket (server); if (server->protocol_string) free (server->protocol_string); if (server->protocol_args) free (server->protocol_args); free (server); relay_servers = new_relay_servers; }
void relay_server_update_port (struct t_relay_server *server, int port) { if (port != server->port) { relay_server_close_socket (server); server->port = port; relay_server_create_socket (server); } }
void relay_server_update_port (struct t_relay_server *server, int port) { char str_path[128]; if (port != server->port) { relay_server_close_socket (server); server->port = port; snprintf (str_path, sizeof (str_path), "%d", port); free (server->path); server->path = strdup (str_path); relay_server_create_socket (server); } }
void relay_config_change_network_bind_address_cb (void *data, struct t_config_option *option) { struct t_relay_server *ptr_server; /* make C compiler happy */ (void) data; (void) option; for (ptr_server = relay_servers; ptr_server; ptr_server = ptr_server->next_server) { relay_server_close_socket (ptr_server); relay_server_create_socket (ptr_server); } }
void relay_config_change_network_ipv6_cb (void *data, struct t_config_option *option) { struct t_relay_server *ptr_server; /* make C compiler happy */ (void) data; (void) option; for (ptr_server = relay_servers; ptr_server; ptr_server = ptr_server->next_server) { relay_server_get_protocol_args (ptr_server->protocol_string, &ptr_server->ipv4, &ptr_server->ipv6, NULL, NULL, NULL); relay_server_close_socket (ptr_server); relay_server_create_socket (ptr_server); } }
void relay_server_update_path (struct t_relay_server *server, const char *path) { char *new_path; new_path = weechat_string_eval_path_home (path, NULL, NULL, NULL); if (!new_path) return; if (strcmp (new_path, server->path) != 0) { relay_server_close_socket (server); free (server->path); server->path = strdup (new_path); server->port = -1; relay_server_create_socket (server); } free (new_path); }
int relay_signal_upgrade_cb (const void *pointer, void *data, const char *signal, const char *type_data, void *signal_data) { struct t_relay_server *ptr_server; struct t_relay_client *ptr_client; int quit, ssl_disconnected; /* make C compiler happy */ (void) pointer; (void) data; (void) signal; (void) type_data; (void) signal_data; relay_signal_upgrade_received = 1; /* close socket for relay servers */ for (ptr_server = relay_servers; ptr_server; ptr_server = ptr_server->next_server) { relay_server_close_socket (ptr_server); } quit = (signal_data && (strcmp (signal_data, "quit") == 0)); ssl_disconnected = 0; for (ptr_client = relay_clients; ptr_client; ptr_client = ptr_client->next_client) { /* * FIXME: it's not possible to upgrade with SSL clients connected (GnuTLS * lib can't reload data after upgrade), so we close connection for * all SSL clients currently connected */ if ((ptr_client->sock >= 0) && (ptr_client->ssl || quit)) { if (!quit) { ssl_disconnected++; weechat_printf (NULL, _("%s%s: disconnecting from client %s%s%s because " "upgrade can't work for clients connected via SSL"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_CLIENT, ptr_client->desc, RELAY_COLOR_CHAT); } relay_client_set_status (ptr_client, RELAY_STATUS_DISCONNECTED); } } if (ssl_disconnected > 0) { weechat_printf (NULL, /* TRANSLATORS: "%s" after "%d" is "client" or "clients" */ _("%s%s: disconnected from %d %s (SSL connection " "not supported with upgrade)"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, ssl_disconnected, NG_("client", "clients", ssl_disconnected)); } return WEECHAT_RC_OK; }