mirror of
https://github.com/weechat/weechat.git
synced 2026-06-25 04:16:38 +02:00
8b1b06a407
A malicious or compromised IRC server could send data with no end-of-line (or a flood of "005" messages), making WeeChat accumulate it in a buffer that grew without limit, until all memory was exhausted. The unterminated received message and the accumulated "005" (ISUPPORT) data are now bounded by IRC_SERVER_RECV_MSG_MAX_LENGTH and IRC_SERVER_ISUPPORT_MAX_LENGTH: extra data is ignored once the limit is reached.
481 lines
27 KiB
C
481 lines
27 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2003-2026 Sébastien Helleu <flashcode@flashtux.org>
|
|
* SPDX-FileCopyrightText: 2012 Simon Arlott
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* This file is part of WeeChat, the extensible chat client.
|
|
*
|
|
* WeeChat is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* WeeChat is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with WeeChat. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef WEECHAT_PLUGIN_IRC_SERVER_H
|
|
#define WEECHAT_PLUGIN_IRC_SERVER_H
|
|
|
|
#include <time.h>
|
|
#include <sys/time.h>
|
|
#include <regex.h>
|
|
|
|
#include <gnutls/gnutls.h>
|
|
|
|
#ifndef NI_MAXHOST
|
|
#define NI_MAXHOST 256
|
|
#endif /* NI_MAXHOST */
|
|
|
|
enum t_irc_server_ipv6
|
|
{
|
|
IRC_SERVER_IPV6_DISABLE = 0,
|
|
IRC_SERVER_IPV6_AUTO,
|
|
IRC_SERVER_IPV6_FORCE,
|
|
/* number of IPv6 options */
|
|
IRC_SERVER_NUM_IPV6,
|
|
};
|
|
|
|
enum t_irc_server_sasl_fail
|
|
{
|
|
IRC_SERVER_SASL_FAIL_CONTINUE = 0,
|
|
IRC_SERVER_SASL_FAIL_RECONNECT,
|
|
IRC_SERVER_SASL_FAIL_DISCONNECT,
|
|
/* number of SASL fail options */
|
|
IRC_SERVER_NUM_SASL_FAIL,
|
|
};
|
|
|
|
enum t_irc_server_charset_message
|
|
{
|
|
IRC_SERVER_CHARSET_MESSAGE_MESSAGE = 0,
|
|
IRC_SERVER_CHARSET_MESSAGE_CHANNEL,
|
|
IRC_SERVER_CHARSET_MESSAGE_TEXT,
|
|
};
|
|
|
|
enum t_irc_server_option
|
|
{
|
|
IRC_SERVER_OPTION_ADDRESSES = 0, /* server addresses (IP/name with port) */
|
|
IRC_SERVER_OPTION_PROXY, /* proxy used for server (optional) */
|
|
IRC_SERVER_OPTION_IPV6, /* use IPv6 protocol */
|
|
IRC_SERVER_OPTION_TLS, /* TLS protocol */
|
|
IRC_SERVER_OPTION_TLS_CERT, /* client TLS certificate file */
|
|
IRC_SERVER_OPTION_TLS_PASSWORD, /* client TLS certificate key password */
|
|
IRC_SERVER_OPTION_TLS_PRIORITIES, /* gnutls priorities */
|
|
IRC_SERVER_OPTION_TLS_DHKEY_SIZE, /* Diffie Hellman key size */
|
|
IRC_SERVER_OPTION_TLS_FINGERPRINT, /* SHA1 fingerprint of certificate */
|
|
IRC_SERVER_OPTION_TLS_VERIFY, /* check if the connection is trusted */
|
|
IRC_SERVER_OPTION_PASSWORD, /* password for server */
|
|
IRC_SERVER_OPTION_CAPABILITIES, /* client capabilities to enable */
|
|
IRC_SERVER_OPTION_SASL_MECHANISM,/* mechanism for SASL authentication */
|
|
IRC_SERVER_OPTION_SASL_USERNAME, /* username for SASL authentication */
|
|
IRC_SERVER_OPTION_SASL_PASSWORD, /* password for SASL authentication */
|
|
IRC_SERVER_OPTION_SASL_KEY, /* key for ECDSA-NIST256P-CHALLENGE */
|
|
IRC_SERVER_OPTION_SASL_TIMEOUT, /* timeout for SASL authentication */
|
|
IRC_SERVER_OPTION_SASL_FAIL, /* action on SASL fail */
|
|
IRC_SERVER_OPTION_AUTOCONNECT, /* autoconnect to server at startup */
|
|
IRC_SERVER_OPTION_AUTORECONNECT, /* autoreconnect when disconnected */
|
|
IRC_SERVER_OPTION_AUTORECONNECT_DELAY, /* delay before trying again reco */
|
|
IRC_SERVER_OPTION_NICKS, /* nicknames (comma separated list) */
|
|
IRC_SERVER_OPTION_NICKS_ALTERNATE, /* use alternate nicknames */
|
|
IRC_SERVER_OPTION_USERNAME, /* user name */
|
|
IRC_SERVER_OPTION_REALNAME, /* real name */
|
|
IRC_SERVER_OPTION_LOCAL_HOSTNAME,/* custom local hostname */
|
|
IRC_SERVER_OPTION_USERMODE, /* usermode to set once connected */
|
|
IRC_SERVER_OPTION_COMMAND_DELAY, /* delay before execution of command */
|
|
IRC_SERVER_OPTION_COMMAND, /* command to run once connected */
|
|
IRC_SERVER_OPTION_AUTOJOIN_DELAY, /* delay before autojoin */
|
|
IRC_SERVER_OPTION_AUTOJOIN, /* channels to automatically join */
|
|
IRC_SERVER_OPTION_AUTOJOIN_DYNAMIC, /* auto set autojoin option */
|
|
IRC_SERVER_OPTION_AUTOREJOIN, /* auto rejoin channels when kicked */
|
|
IRC_SERVER_OPTION_AUTOREJOIN_DELAY, /* delay before auto rejoin */
|
|
IRC_SERVER_OPTION_CONNECTION_TIMEOUT, /* timeout for connection */
|
|
IRC_SERVER_OPTION_ANTI_FLOOD, /* anti-flood (in ms) */
|
|
IRC_SERVER_OPTION_AWAY_CHECK, /* delay between away checks */
|
|
IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS, /* max nicks for away check */
|
|
IRC_SERVER_OPTION_MSG_KICK, /* default kick message */
|
|
IRC_SERVER_OPTION_MSG_PART, /* default part message */
|
|
IRC_SERVER_OPTION_MSG_QUIT, /* default quit message */
|
|
IRC_SERVER_OPTION_NOTIFY, /* notify list */
|
|
IRC_SERVER_OPTION_SPLIT_MSG_MAX_LENGTH, /* max length of messages */
|
|
IRC_SERVER_OPTION_CHARSET_MESSAGE, /* what to decode/encode in msg */
|
|
IRC_SERVER_OPTION_DEFAULT_CHANTYPES, /* chantypes if not received */
|
|
IRC_SERVER_OPTION_REGISTERED_MODE, /* mode set on registered user */
|
|
/* number of server options */
|
|
IRC_SERVER_NUM_OPTIONS,
|
|
};
|
|
|
|
#define IRC_SERVER_OPTION_BOOLEAN(__server, __index) \
|
|
weechat_config_boolean_inherited (__server->options[__index])
|
|
|
|
#define IRC_SERVER_OPTION_INTEGER(__server, __index) \
|
|
weechat_config_integer_inherited (__server->options[__index])
|
|
|
|
#define IRC_SERVER_OPTION_STRING(__server, __index) \
|
|
weechat_config_string_inherited (__server->options[__index])
|
|
|
|
#define IRC_SERVER_OPTION_ENUM(__server, __index) \
|
|
weechat_config_enum_inherited (__server->options[__index])
|
|
|
|
#define IRC_SERVER_DEFAULT_PORT_CLEARTEXT 6667
|
|
#define IRC_SERVER_DEFAULT_PORT_TLS 6697
|
|
|
|
#define IRC_SERVER_DEFAULT_NICKS "weechat1,weechat2,weechat3,weechat4,weechat5"
|
|
|
|
/* number of queues for sending messages */
|
|
#define IRC_SERVER_NUM_OUTQUEUES_PRIO 3
|
|
|
|
/* flags for irc_server_sendf() */
|
|
#define IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE (1 << 0)
|
|
#define IRC_SERVER_SEND_OUTQ_PRIO_HIGH (1 << 1)
|
|
#define IRC_SERVER_SEND_OUTQ_PRIO_LOW (1 << 2)
|
|
#define IRC_SERVER_SEND_RETURN_LIST (1 << 3)
|
|
#define IRC_SERVER_SEND_MULTILINE (1 << 4)
|
|
|
|
/* version strings */
|
|
#define IRC_SERVER_VERSION_CAP "302"
|
|
|
|
/* multiline default limits */
|
|
#define IRC_SERVER_MULTILINE_DEFAULT_MAX_BYTES 4096
|
|
#define IRC_SERVER_MULTILINE_DEFAULT_MAX_LINES 24
|
|
|
|
/*
|
|
* maximum length of an unterminated message (a received line without
|
|
* end-of-line) and of the accumulated "005" (ISUPPORT) data; these limits
|
|
* protect against a server sending a huge amount of data without end-of-line
|
|
* (or a flood of "005" messages), which would consume all the memory
|
|
*/
|
|
#define IRC_SERVER_RECV_MSG_MAX_LENGTH (64 * 1024)
|
|
#define IRC_SERVER_ISUPPORT_MAX_LENGTH (64 * 1024)
|
|
|
|
/* casemapping (string comparisons for nicks/channels) */
|
|
enum t_irc_server_casemapping
|
|
{
|
|
IRC_SERVER_CASEMAPPING_RFC1459 = 0, /* A-Z [ \ ] ^ ==> a-z { | } ~ */
|
|
IRC_SERVER_CASEMAPPING_STRICT_RFC1459, /* A-Z [ \ ] ==> a-z { | } */
|
|
IRC_SERVER_CASEMAPPING_ASCII, /* A-Z ==> a-z */
|
|
/* number of casemapping */
|
|
IRC_SERVER_NUM_CASEMAPPING,
|
|
};
|
|
|
|
/* utf8mapping (string comparisons for nicks/channels) */
|
|
enum t_irc_server_utf8mapping
|
|
{
|
|
IRC_SERVER_UTF8MAPPING_NONE = 0,
|
|
IRC_SERVER_UTF8MAPPING_RFC8265,
|
|
/* number of utf8mapping */
|
|
IRC_SERVER_NUM_UTF8MAPPING,
|
|
};
|
|
|
|
/* authentication method */
|
|
enum t_irc_server_auth_method
|
|
{
|
|
IRC_SERVER_AUTH_METHOD_NONE = 0,
|
|
IRC_SERVER_AUTH_METHOD_SASL,
|
|
IRC_SERVER_AUTH_METHOD_OTHER,
|
|
};
|
|
|
|
/* output queue of messages to server (for sending slowly to server) */
|
|
|
|
struct t_irc_outqueue
|
|
{
|
|
char *command; /* IRC command */
|
|
char *message_before_mod; /* msg before any modifier */
|
|
char *message_after_mod; /* msg after modifier(s) */
|
|
int modified; /* msg was modified by modifier(s) */
|
|
char *tags; /* tags (used by Relay plugin) */
|
|
struct t_irc_redirect *redirect; /* command redirection */
|
|
struct t_irc_outqueue *next_outqueue; /* link to next msg in queue */
|
|
struct t_irc_outqueue *prev_outqueue; /* link to prev msg in queue */
|
|
};
|
|
|
|
struct t_irc_server
|
|
{
|
|
/* user choices */
|
|
char *name; /* internal name of server */
|
|
struct t_config_option *options[IRC_SERVER_NUM_OPTIONS];
|
|
|
|
/* internal vars */
|
|
int fake_server; /* fake server (no I/O, for tests) */
|
|
int reloading_from_config; /* 1 if reloading from config file */
|
|
int reloaded_from_config; /* 1 if reloaded from config file */
|
|
char *addresses_eval; /* evaluation of addresses */
|
|
int addresses_count; /* number of addresses */
|
|
char **addresses_array; /* addresses (after split) */
|
|
int *ports_array; /* ports for addresses */
|
|
int *retry_array; /* retry count per address */
|
|
int index_current_address; /* current address index in array */
|
|
char *current_address; /* current address */
|
|
char *current_ip; /* current IP address */
|
|
int current_port; /* current port */
|
|
int current_retry; /* current retry count (increment if a */
|
|
/* connected server fails in any way) */
|
|
int sock; /* socket for server */
|
|
struct t_hook *hook_connect; /* connection hook */
|
|
struct t_hook *hook_fd; /* hook for server socket */
|
|
struct t_hook *hook_timer_connection; /* timer for connection */
|
|
struct t_hook *hook_timer_sasl; /* timer for SASL authentication */
|
|
struct t_hook *hook_timer_anti_flood; /* anti-flood timer */
|
|
char *sasl_scram_client_first; /* first message sent for SASL SCRAM */
|
|
char *sasl_scram_salted_pwd; /* salted password for SASL SCRAM */
|
|
int sasl_scram_salted_pwd_size; /* size of salted password for SASL SCRAM*/
|
|
char *sasl_scram_auth_message; /* auth message for SASL SCRAM */
|
|
char *sasl_temp_username; /* temp SASL username (set by /auth cmd) */
|
|
char *sasl_temp_password; /* temp SASL password (set by /auth cmd) */
|
|
int authentication_method; /* authentication method used to login */
|
|
int sasl_mechanism_used; /* SASL method used at login time */
|
|
int is_connected; /* 1 if WeeChat is connected to server */
|
|
int tls_connected; /* = 1 if connected with TLS */
|
|
int disconnected; /* 1 if server has been disconnected */
|
|
gnutls_session_t gnutls_sess; /* gnutls session (only if TLS is used) */
|
|
gnutls_x509_crt_t tls_cert; /* certificate used if tls_cert is set */
|
|
gnutls_x509_privkey_t tls_cert_key; /* key used if tls_cert is set */
|
|
char *unterminated_message; /* beginning of a message in input buf */
|
|
int nicks_count; /* number of nicknames */
|
|
char **nicks_array; /* nicknames (after split) */
|
|
int nick_first_tried; /* first nick tried in list of nicks */
|
|
/* when (re-)connecting to server */
|
|
int nick_alternate_number; /* number used to build alternate nicks */
|
|
/* (nick____1, nick____2, ...) */
|
|
char *nick; /* current nickname */
|
|
char *nick_modes; /* nick modes */
|
|
char *host; /* self host (set if known) */
|
|
int checking_cap_ls; /* 1 if checking supported capabilities */
|
|
struct t_hashtable *cap_ls; /* list of supported capabilities */
|
|
int checking_cap_list; /* 1 if checking enabled capabilities */
|
|
struct t_hashtable *cap_list; /* list of enabled capabilities */
|
|
int multiline_max_bytes; /* max bytes for multiline batch */
|
|
int multiline_max_lines; /* max lines for multiline batch */
|
|
char *isupport; /* copy of message 005 (ISUPPORT) */
|
|
char *prefix_modes; /* prefix modes from msg 005 (eg "ohv") */
|
|
char *prefix_chars; /* prefix chars from msg 005 (eg "@%+") */
|
|
int msg_max_length; /* max length of msg (from msg 005) */
|
|
int nick_max_length; /* max length of nick (from msg 005) */
|
|
int user_max_length; /* max length of user (from msg 005) */
|
|
int host_max_length; /* max length of host (from msg 005) */
|
|
int casemapping; /* casemapping from msg 005 */
|
|
int utf8mapping; /* utf8mapping from msg 005 */
|
|
int utf8only; /* UTF-8 only? */
|
|
char *chantypes; /* chantypes from msg 005 (eg "&#") */
|
|
char *chanmodes; /* chanmodes from msg 005 */
|
|
/* (eg "beI,k,l,imnpstaqr") */
|
|
int monitor; /* monitor limit from msg 005 (eg 100) */
|
|
time_t monitor_time; /* time for monitoring nicks (on connect)*/
|
|
char *clienttagdeny; /* list of blocked client-only tags */
|
|
int clienttagdeny_count; /* number of masks in clienttagdeny */
|
|
char **clienttagdeny_array; /* masks expanded from clienttagdeny */
|
|
int typing_allowed; /* typing not excluded by clienttagdeny? */
|
|
int reconnect_delay; /* current reconnect delay (growing) */
|
|
time_t reconnect_start; /* this time + delay = reconnect time */
|
|
time_t command_time; /* this time + command_delay = time to */
|
|
/* execute command */
|
|
time_t autojoin_time; /* this time + autojoin_delay = time to */
|
|
/* auto-join channels */
|
|
int autojoin_done; /* 1 if autojoin has been done */
|
|
int disable_autojoin; /* 1 if user asked to not autojoin chans */
|
|
int is_away; /* 1 is user is marked as away */
|
|
char *away_message; /* away message, NULL if not away */
|
|
time_t away_time; /* time() when user marking as away */
|
|
int lag; /* lag (in milliseconds) */
|
|
int lag_displayed; /* last value displayed for lag */
|
|
struct timeval lag_check_time; /* last time lag was checked (ping sent) */
|
|
time_t lag_next_check; /* time for next check */
|
|
time_t lag_last_refresh; /* last refresh of lag item */
|
|
regex_t *cmd_list_regexp; /* compiled Regular Expression for /list */
|
|
struct t_irc_list *list; /* /list buffer management */
|
|
time_t last_away_check; /* time of last away check on server */
|
|
time_t last_data_purge; /* time of last purge (some hashtables) */
|
|
struct t_irc_outqueue *outqueue[IRC_SERVER_NUM_OUTQUEUES_PRIO];
|
|
/* queue for outgoing messages */
|
|
/* with 2 priorities (high/low) */
|
|
struct t_irc_outqueue *last_outqueue[IRC_SERVER_NUM_OUTQUEUES_PRIO];
|
|
/* last outgoing message */
|
|
struct t_irc_redirect *redirects; /* command redirections */
|
|
struct t_irc_redirect *last_redirect; /* last command redirection */
|
|
struct t_irc_notify *notify_list; /* list of notify */
|
|
struct t_irc_notify *last_notify; /* last notify */
|
|
int notify_count; /* number of notify in list */
|
|
struct t_hashtable *join_manual; /* manual joins pending */
|
|
struct t_hashtable *join_channel_key; /* keys pending for joins */
|
|
struct t_hashtable *join_noswitch; /* joins w/o switch to buffer */
|
|
struct t_hashtable *echo_msg_recv; /* msg received with echo-message */
|
|
struct t_hashtable *names_channel_filter; /* filter for /names on channel*/
|
|
struct t_irc_batch *batches; /* batched events (cap "batch") */
|
|
struct t_irc_batch *last_batch; /* last batch */
|
|
struct t_gui_buffer *buffer; /* GUI buffer allocated for server */
|
|
char *buffer_as_string; /* used to return buffer info */
|
|
struct t_irc_channel *channels; /* opened channels on server */
|
|
struct t_irc_channel *last_channel; /* last opened channel on server */
|
|
struct t_irc_server *prev_server; /* link to previous server */
|
|
struct t_irc_server *next_server; /* link to next server */
|
|
};
|
|
|
|
/* IRC messages */
|
|
|
|
struct t_irc_message
|
|
{
|
|
struct t_irc_server *server; /* server pointer for received msg */
|
|
char *data; /* message content */
|
|
struct t_irc_message *next_message; /* link to next message */
|
|
};
|
|
|
|
/* digest algorithms for fingerprint */
|
|
|
|
enum t_irc_fingerprint_digest_algo
|
|
{
|
|
IRC_FINGERPRINT_ALGO_SHA1 = 0,
|
|
IRC_FINGERPRINT_ALGO_SHA256,
|
|
IRC_FINGERPRINT_ALGO_SHA512,
|
|
/* number of digest algorithms */
|
|
IRC_FINGERPRINT_NUM_ALGOS,
|
|
};
|
|
|
|
extern int irc_server_casemapping_range[];
|
|
extern char *irc_server_prefix_modes_default;
|
|
extern char *irc_server_prefix_chars_default;
|
|
extern char *irc_server_chanmodes_default;
|
|
extern struct t_irc_server *irc_servers;
|
|
extern const int gnutls_cert_type_prio[];
|
|
extern const int gnutls_prot_prio[];
|
|
extern struct t_irc_message *irc_recv_msgq, *irc_msgq_last_msg;
|
|
extern char *irc_server_ipv6_string[];
|
|
extern char *irc_server_sasl_fail_string[];
|
|
extern char *irc_server_options[][2];
|
|
|
|
extern int irc_server_valid (struct t_irc_server *server);
|
|
extern struct t_irc_server *irc_server_search (const char *server_name);
|
|
extern int irc_server_search_option (const char *option_name);
|
|
extern int irc_server_search_casemapping (const char *casemapping);
|
|
extern int irc_server_search_utf8mapping (const char *utf8mapping);
|
|
extern int irc_server_strcasecmp (struct t_irc_server *server,
|
|
const char *string1, const char *string2);
|
|
extern int irc_server_strncasecmp (struct t_irc_server *server,
|
|
const char *string1, const char *string2,
|
|
int max);
|
|
extern char *irc_server_eval_expression (struct t_irc_server *server,
|
|
const char *string);
|
|
extern void irc_server_sasl_get_creds (struct t_irc_server *server,
|
|
char **username,
|
|
char **password,
|
|
char **key);
|
|
extern int irc_server_sasl_enabled (struct t_irc_server *server);
|
|
extern char *irc_server_get_name_without_port (const char *name);
|
|
extern char *irc_server_get_short_description (struct t_irc_server *server);
|
|
extern int irc_server_set_addresses (struct t_irc_server *server,
|
|
const char *addresses, int tls);
|
|
extern void irc_server_set_nicks (struct t_irc_server *server,
|
|
const char *nicks);
|
|
extern void irc_server_set_nick (struct t_irc_server *server,
|
|
const char *nick);
|
|
extern void irc_server_set_host (struct t_irc_server *server,
|
|
const char *host);
|
|
extern const char *irc_server_get_alternate_nick (struct t_irc_server *server);
|
|
extern const char *irc_server_get_isupport_value (struct t_irc_server *server,
|
|
const char *feature);
|
|
extern const char *irc_server_get_chantypes (struct t_irc_server *server);
|
|
extern void irc_server_set_prefix_modes_chars (struct t_irc_server *server,
|
|
const char *prefix);
|
|
extern void irc_server_set_clienttagdeny (struct t_irc_server *server,
|
|
const char *clienttagdeny);
|
|
extern void irc_server_set_lag (struct t_irc_server *server);
|
|
extern void irc_server_set_tls_version (struct t_irc_server *server);
|
|
extern const char *irc_server_get_prefix_modes (struct t_irc_server *server);
|
|
extern const char *irc_server_get_prefix_chars (struct t_irc_server *server);
|
|
extern int irc_server_get_prefix_mode_index (struct t_irc_server *server,
|
|
char mode);
|
|
extern int irc_server_get_prefix_char_index (struct t_irc_server *server,
|
|
char prefix_char);
|
|
extern char irc_server_get_prefix_mode_for_char (struct t_irc_server *server,
|
|
char prefix_char);
|
|
extern char irc_server_get_prefix_char_for_mode (struct t_irc_server *server,
|
|
char mode);
|
|
extern const char *irc_server_get_chanmodes (struct t_irc_server *server);
|
|
extern int irc_server_prefix_char_statusmsg (struct t_irc_server *server,
|
|
char prefix_char);
|
|
extern int irc_server_get_max_modes (struct t_irc_server *server);
|
|
extern char *irc_server_get_default_msg (const char *default_msg,
|
|
struct t_irc_server *server,
|
|
const char *channel_name,
|
|
const char *target_nick);
|
|
extern void irc_server_set_buffer_input_prompt (struct t_irc_server *server);
|
|
extern void irc_server_set_buffer_input_multiline (struct t_irc_server *server,
|
|
int multiline);
|
|
extern int irc_server_has_channels (struct t_irc_server *server);
|
|
extern struct t_irc_server *irc_server_alloc (const char *name);
|
|
extern struct t_irc_server *irc_server_alloc_with_url (const char *irc_url);
|
|
extern void irc_server_apply_command_line_options (struct t_irc_server *server,
|
|
int argc, char **argv);
|
|
extern void irc_server_free_all (void);
|
|
extern struct t_irc_server *irc_server_copy (struct t_irc_server *server,
|
|
const char *new_name);
|
|
extern int irc_server_rename (struct t_irc_server *server, const char *new_name);
|
|
extern int irc_server_reorder (const char **servers, int num_servers);
|
|
extern int irc_server_send_signal (struct t_irc_server *server,
|
|
const char *signal, const char *command,
|
|
const char *full_message,
|
|
const char *tags);
|
|
extern void irc_server_set_send_default_tags (const char *tags);
|
|
extern void irc_server_outqueue_timer_remove (struct t_irc_server *server);
|
|
extern void irc_server_outqueue_timer_add (struct t_irc_server *server);
|
|
extern struct t_arraylist *irc_server_sendf (struct t_irc_server *server,
|
|
int flags,
|
|
const char *tags,
|
|
const char *format, ...);
|
|
extern void irc_server_msgq_add_buffer (struct t_irc_server *server,
|
|
const char *buffer);
|
|
extern void irc_server_msgq_flush (void);
|
|
extern void irc_server_set_buffer_title (struct t_irc_server *server);
|
|
extern struct t_gui_buffer *irc_server_create_buffer (struct t_irc_server *server);
|
|
char *irc_server_fingerprint_str_sizes (void);
|
|
extern int irc_server_connect (struct t_irc_server *server);
|
|
extern void irc_server_auto_connect (int auto_connect);
|
|
extern void irc_server_autojoin_channels (struct t_irc_server *server);
|
|
extern int irc_server_recv_cb (const void *pointer, void *data, int fd);
|
|
extern int irc_server_timer_sasl_cb (const void *pointer, void *data,
|
|
int remaining_calls);
|
|
extern int irc_server_timer_cb (const void *pointer, void *data,
|
|
int remaining_calls);
|
|
extern void irc_server_outqueue_free_all (struct t_irc_server *server,
|
|
int priority);
|
|
extern int irc_server_get_channel_count (struct t_irc_server *server);
|
|
extern int irc_server_get_pv_count (struct t_irc_server *server);
|
|
extern void irc_server_set_away (struct t_irc_server *server, const char *nick,
|
|
int is_away);
|
|
extern void irc_server_remove_away (struct t_irc_server *server);
|
|
extern void irc_server_check_away (struct t_irc_server *server);
|
|
extern void irc_server_switch_address (struct t_irc_server *server,
|
|
int connection);
|
|
extern void irc_server_disconnect (struct t_irc_server *server,
|
|
int switch_address, int reconnect);
|
|
extern void irc_server_disconnect_all (void);
|
|
extern void irc_server_execute_command (struct t_irc_server *server);
|
|
extern void irc_server_free_sasl_data (struct t_irc_server *server);
|
|
extern void irc_server_free (struct t_irc_server *server);
|
|
extern int irc_server_xfer_send_ready_cb (const void *pointer, void *data,
|
|
const char *signal,
|
|
const char *type_data,
|
|
void *signal_data);
|
|
extern int irc_server_xfer_resume_ready_cb (const void *pointer, void *data,
|
|
const char *signal,
|
|
const char *type_data,
|
|
void *signal_data);
|
|
extern int irc_server_xfer_send_accept_resume_cb (const void *pointer,
|
|
void *data,
|
|
const char *signal,
|
|
const char *type_data,
|
|
void *signal_data);
|
|
extern struct t_hdata *irc_server_hdata_server_cb (const void *pointer,
|
|
void *data,
|
|
const char *hdata_name);
|
|
extern int irc_server_add_to_infolist (struct t_infolist *infolist,
|
|
struct t_irc_server *server,
|
|
int force_disconnected_state);
|
|
extern void irc_server_print_log (void);
|
|
|
|
#endif /* WEECHAT_PLUGIN_IRC_SERVER_H */
|