int relay_buffer_input_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, const char *input_data) { struct t_relay_client *client, *ptr_client, *next_client; /* make C compiler happy */ (void) pointer; (void) data; if (buffer == relay_raw_buffer) { if (weechat_strcasecmp (input_data, "q") == 0) weechat_buffer_close (buffer); } else if (buffer == relay_buffer) { client = relay_client_search_by_number (relay_buffer_selected_line); /* disconnect client */ if (weechat_strcasecmp (input_data, "d") == 0) { if (client && !RELAY_CLIENT_HAS_ENDED(client)) { relay_client_disconnect (client); relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } } /* purge old clients */ else if (weechat_strcasecmp (input_data, "p") == 0) { ptr_client = relay_clients; while (ptr_client) { next_client = ptr_client->next_client; if (RELAY_CLIENT_HAS_ENDED(ptr_client)) relay_client_free (ptr_client); ptr_client = next_client; } relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } /* quit relay buffer (close it) */ else if (weechat_strcasecmp (input_data, "q") == 0) { weechat_buffer_close (buffer); } /* remove client */ else if (weechat_strcasecmp (input_data, "r") == 0) { if (client && RELAY_CLIENT_HAS_ENDED(client)) { relay_client_free (client); relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } } } return WEECHAT_RC_OK; }
void relay_config_refresh_cb (void *data, struct t_config_option *option) { /* make C compiler happy */ (void) data; (void) option; if (relay_buffer) relay_buffer_refresh (NULL); }
int relay_command_relay (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { /* make C compiler happy */ (void) data; (void) buffer; (void) argv_eol; if ((argc > 1) && (weechat_strcasecmp (argv[1], "list") == 0)) { relay_command_client_list (0); return WEECHAT_RC_OK; } if ((argc > 1) && (weechat_strcasecmp (argv[1], "listfull") == 0)) { relay_command_client_list (1); return WEECHAT_RC_OK; } if (!relay_buffer) relay_buffer_open (); if (relay_buffer) { weechat_buffer_set (relay_buffer, "display", "1"); if (argc > 1) { if (strcmp (argv[1], "up") == 0) { if (relay_buffer_selected_line > 0) relay_buffer_selected_line--; } else if (strcmp (argv[1], "down") == 0) { if (relay_buffer_selected_line < relay_client_count - 1) relay_buffer_selected_line++; } } } relay_buffer_refresh (NULL); return WEECHAT_RC_OK; }
int relay_client_recv_cb (void *arg_client, int fd) { struct t_relay_client *client; static char buffer[4096 + 2]; int num_read; /* make C compiler happy */ (void) fd; client = (struct t_relay_client *)arg_client; num_read = recv (client->sock, buffer, sizeof (buffer) - 1, 0); if (num_read > 0) { client->bytes_recv += num_read; buffer[num_read] = '\0'; switch (client->protocol) { case RELAY_PROTOCOL_WEECHAT: relay_weechat_recv (client, buffer); break; case RELAY_PROTOCOL_IRC: relay_irc_recv (client, buffer); break; case RELAY_NUM_PROTOCOLS: break; } relay_buffer_refresh (NULL); } else { relay_client_set_status (client, RELAY_STATUS_DISCONNECTED); } return WEECHAT_RC_OK; }
void relay_client_set_status (struct t_relay_client *client, enum t_relay_status status) { client->status = status; if (RELAY_CLIENT_HAS_ENDED(client)) { client->end_time = time (NULL); if (client->hook_fd) { weechat_unhook (client->hook_fd); client->hook_fd = NULL; } switch (client->protocol) { case RELAY_PROTOCOL_WEECHAT: relay_weechat_close_connection (client); break; case RELAY_PROTOCOL_IRC: relay_irc_close_connection (client); break; case RELAY_NUM_PROTOCOLS: break; } switch (client->status) { case RELAY_STATUS_AUTH_FAILED: weechat_printf (NULL, _("%s%s: authentication failed with client %s%s%s (%s%s%s)"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_HOST, client->address, RELAY_COLOR_CHAT, relay_protocol_string[client->protocol], (client->protocol_args) ? "." : "", (client->protocol_args) ? client->protocol_args : ""); break; case RELAY_STATUS_DISCONNECTED: weechat_printf (NULL, _("%s: disconnected from client %s%s%s (%s%s%s)"), RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_HOST, client->address, RELAY_COLOR_CHAT, relay_protocol_string[client->protocol], (client->protocol_args) ? "." : "", (client->protocol_args) ? client->protocol_args : ""); break; default: break; } if (client->sock >= 0) { close (client->sock); client->sock = -1; } } relay_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); }
struct t_relay_client * relay_client_new (int sock, const char *address, struct t_relay_server *server) { struct t_relay_client *new_client; new_client = malloc (sizeof (*new_client)); if (new_client) { new_client->id = (relay_clients) ? relay_clients->id + 1 : 1; new_client->sock = sock; new_client->address = strdup ((address) ? address : "?"); new_client->status = RELAY_STATUS_CONNECTED; new_client->protocol = server->protocol; new_client->protocol_args = (server->protocol_args) ? strdup (server->protocol_args) : NULL; new_client->listen_start_time = server->start_time; new_client->start_time = time (NULL); new_client->end_time = 0; new_client->hook_fd = NULL; new_client->last_activity = new_client->start_time; new_client->bytes_recv = 0; new_client->bytes_sent = 0; new_client->protocol_data = NULL; switch (new_client->protocol) { case RELAY_PROTOCOL_WEECHAT: relay_weechat_alloc (new_client); break; case RELAY_PROTOCOL_IRC: relay_irc_alloc (new_client); break; case RELAY_NUM_PROTOCOLS: break; } new_client->prev_client = NULL; new_client->next_client = relay_clients; if (relay_clients) relay_clients->prev_client = new_client; else last_relay_client = new_client; relay_clients = new_client; weechat_printf (NULL, _("%s: new client from %s%s%s on port %d (id: %d, relaying: %s%s%s)"), RELAY_PLUGIN_NAME, RELAY_COLOR_CHAT_HOST, new_client->address, RELAY_COLOR_CHAT, server->port, new_client->id, relay_protocol_string[new_client->protocol], (new_client->protocol_args) ? "." : "", (new_client->protocol_args) ? new_client->protocol_args : ""); new_client->hook_fd = weechat_hook_fd (new_client->sock, 1, 0, 0, &relay_client_recv_cb, new_client); relay_client_count++; if (!relay_buffer && weechat_config_boolean (relay_config_look_auto_open_buffer)) { relay_buffer_open (); } relay_buffer_refresh (WEECHAT_HOTLIST_PRIVATE); } else { weechat_printf (NULL, _("%s%s: not enough memory for new client"), weechat_prefix ("error"), RELAY_PLUGIN_NAME); } return new_client; }
int relay_command_relay (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { struct t_relay_server *ptr_server; struct t_config_option *ptr_option; int port; /* make C compiler happy */ (void) data; (void) buffer; if (argc > 1) { if (weechat_strcasecmp (argv[1], "list") == 0) { relay_command_client_list (0); return WEECHAT_RC_OK; } if (weechat_strcasecmp (argv[1], "listfull") == 0) { relay_command_client_list (1); return WEECHAT_RC_OK; } if (weechat_strcasecmp (argv[1], "listrelay") == 0) { relay_command_server_list (); return WEECHAT_RC_OK; } if (weechat_strcasecmp (argv[1], "add") == 0) { if (argc >= 4) { if (relay_config_create_option_port (NULL, relay_config_file, relay_config_section_port, argv[2], argv_eol[3]) != WEECHAT_CONFIG_OPTION_SET_ERROR) { weechat_printf (NULL, _("%s: relay \"%s\" (port %s) added"), RELAY_PLUGIN_NAME, argv[2], argv_eol[3]); } } else { weechat_printf (NULL, _("%s%s: missing arguments for \"%s\" " "command"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, "relay add"); } return WEECHAT_RC_OK; } if (weechat_strcasecmp (argv[1], "del") == 0) { if (argc >= 3) { ptr_server = relay_server_search (argv_eol[2]); if (ptr_server) { port = ptr_server->port; relay_server_free (ptr_server); ptr_option = weechat_config_search_option (relay_config_file, relay_config_section_port, argv_eol[2]); if (ptr_option) weechat_config_option_free (ptr_option); weechat_printf (NULL, _("%s: relay \"%s\" (port %d) removed"), RELAY_PLUGIN_NAME, argv[2], port); } else { weechat_printf (NULL, _("%s%s: relay \"%s\" not found"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, argv_eol[2]); } } else { weechat_printf (NULL, _("%s%s: missing arguments for \"%s\" " "command"), weechat_prefix ("error"), RELAY_PLUGIN_NAME, "relay del"); } return WEECHAT_RC_OK; } if (weechat_strcasecmp (argv[1], "raw") == 0) { relay_raw_open (1); return WEECHAT_RC_OK; } if (weechat_strcasecmp (argv[1], "sslcertkey") == 0) { relay_network_set_ssl_cert_key (1); return WEECHAT_RC_OK; } } if (!relay_buffer) relay_buffer_open (); if (relay_buffer) { weechat_buffer_set (relay_buffer, "display", "1"); if (argc > 1) { if (strcmp (argv[1], "up") == 0) { if (relay_buffer_selected_line > 0) relay_buffer_selected_line--; } else if (strcmp (argv[1], "down") == 0) { if (relay_buffer_selected_line < relay_client_count - 1) relay_buffer_selected_line++; } } } relay_buffer_refresh (NULL); return WEECHAT_RC_OK; }