1
0
mirror of https://github.com/irssi/irssi.git synced 2024-12-04 14:46:39 -05:00

Merge remote-tracking branch 'origin' into sasl

This commit is contained in:
LemonBoy 2015-09-19 23:58:16 +02:00
commit 06040fb30b
33 changed files with 315 additions and 113 deletions

View File

@ -0,0 +1,14 @@
@SYNTAX:irssiproxy@
%9Description:%9
Displays the list of clients connected to irssiproxy.
%9Examples:%9
/IRSSIPROXY
/IRSSIPROXY STATUS
%9See also:%9 LOAD PROXY, SET irssiproxy

View File

@ -1185,3 +1185,11 @@ Client->{}
connected - whether the client is connected and ready connected - whether the client is connected and ready
want_ctcp - whether the client wants to receive CTCPs want_ctcp - whether the client wants to receive CTCPs
ircnet - network tag of the network we proxy ircnet - network tag of the network we proxy
Bugs and Limitations
--------------------
* Calling die in 'script error' handler causes segfault (#101)
* Storing and later using any Irssi object may result in use-after-free related crash

View File

@ -12,6 +12,11 @@ In irssi, say:
/LOAD proxy /LOAD proxy
If you want the proxy to be loaded automatically at startup, add the
load command to ~/.irssi/startup:
echo "load proxy" >> ~/.irssi/startup
You really should set some password for the proxy with: You really should set some password for the proxy with:
/SET irssiproxy_password secret /SET irssiproxy_password secret
@ -24,3 +29,20 @@ something like:
There we have 3 different irc networks answering in 3 ports. Note that There we have 3 different irc networks answering in 3 ports. Note that
you'll have to make the correct /IRCNET ADD and /SERVER ADD commands to you'll have to make the correct /IRCNET ADD and /SERVER ADD commands to
make it work properly. make it work properly.
By default, the proxy binds to all available interfaces. To make it
only listen on (for example) the loopback address:
/SET irssiproxy_bind 127.0.0.1
Note that bind address changes won't take effect until the proxy is
disabled and then reenabled.
Once everything is set up, you can enable / disable the proxy:
/TOGGLE irssiproxy
When the proxy is configured and running, the following command will
show all the currently connected clients:
/IRSSIPROXY status

View File

@ -225,6 +225,7 @@ notifylist.c:
proxy/listen.c: proxy/listen.c:
"proxy client connecting", CLIENT_REC
"proxy client connected", CLIENT_REC "proxy client connected", CLIENT_REC
"proxy client disconnected", CLIENT_REC "proxy client disconnected", CLIENT_REC
"proxy client command", CLIENT_REC, char *args, char *data "proxy client command", CLIENT_REC, char *args, char *data

View File

@ -18,7 +18,7 @@
(SERVER_CONNECT(conn) ? TRUE : FALSE) (SERVER_CONNECT(conn) ? TRUE : FALSE)
#define server_ischannel(server, channel) \ #define server_ischannel(server, channel) \
(server)->ischannel(server, channel) ((server)->ischannel(server, channel))
/* all strings should be either NULL or dynamically allocated */ /* all strings should be either NULL or dynamically allocated */
/* address and nick are mandatory, rest are optional */ /* address and nick are mandatory, rest are optional */

View File

@ -44,7 +44,7 @@ static void dcc_request(CHAT_DCC_REC *dcc)
if (!IS_DCC_CHAT(dcc)) return; if (!IS_DCC_CHAT(dcc)) return;
printformat(dcc->server, NULL, MSGLEVEL_DCC, printformat(dcc->server, NULL, MSGLEVEL_DCC,
ischannel(*dcc->target) ? IRCTXT_DCC_CHAT_CHANNEL : server_ischannel(SERVER(dcc->server), dcc->target) ? IRCTXT_DCC_CHAT_CHANNEL :
IRCTXT_DCC_CHAT, dcc->id, dcc->addrstr, IRCTXT_DCC_CHAT, dcc->id, dcc->addrstr,
dcc->port, dcc->target); dcc->port, dcc->target);
} }

View File

@ -21,6 +21,7 @@
#include "module.h" #include "module.h"
#include "signals.h" #include "signals.h"
#include "levels.h" #include "levels.h"
#include "servers.h"
#include "irc.h" #include "irc.h"
#include "dcc-file.h" #include "dcc-file.h"
@ -35,12 +36,12 @@ static void dcc_request(GET_DCC_REC *dcc)
{ {
char *sizestr; char *sizestr;
if (!IS_DCC_GET(dcc)) return; if (!IS_DCC_GET(dcc)) return;
sizestr = dcc_get_size_str(dcc->size); sizestr = dcc_get_size_str(dcc->size);
printformat(dcc->server, NULL, MSGLEVEL_DCC, printformat(dcc->server, NULL, MSGLEVEL_DCC,
ischannel(*dcc->target) ? IRCTXT_DCC_SEND_CHANNEL : server_ischannel(SERVER(dcc->server), dcc->target) ? IRCTXT_DCC_SEND_CHANNEL :
IRCTXT_DCC_SEND, dcc->nick, dcc->addrstr, IRCTXT_DCC_SEND, dcc->nick, dcc->addrstr,
dcc->port, dcc->arg, sizestr, dcc->target); dcc->port, dcc->arg, sizestr, dcc->target);

View File

@ -28,13 +28,11 @@
#include "themes.h" #include "themes.h"
#include "fe-irc-server.h" #include "fe-irc-server.h"
#include "fe-irc-channels.h"
void fe_irc_modules_init(void); void fe_irc_modules_init(void);
void fe_irc_modules_deinit(void); void fe_irc_modules_deinit(void);
void fe_irc_channels_init(void);
void fe_irc_channels_deinit(void);
void fe_irc_queries_init(void); void fe_irc_queries_init(void);
void fe_irc_queries_deinit(void); void fe_irc_queries_deinit(void);

View File

@ -49,7 +49,7 @@ static void ctcp_default_msg(IRC_SERVER_REC *server, const char *data,
data = p+1; data = p+1;
} }
printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS,
IRCTXT_CTCP_REQUESTED_UNKNOWN, IRCTXT_CTCP_REQUESTED_UNKNOWN,
nick, addr, cmd, data, target); nick, addr, cmd, data, target);
g_free(cmd); g_free(cmd);
@ -113,8 +113,8 @@ static void ctcp_default_reply(IRC_SERVER_REC *server, const char *data,
ctcpdata = ptr+1; ctcpdata = ptr+1;
} }
printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS,
ischannel(*target) ? IRCTXT_CTCP_REPLY_CHANNEL : server_ischannel(SERVER(server), target) ? IRCTXT_CTCP_REPLY_CHANNEL :
IRCTXT_CTCP_REPLY, ctcp, nick, ctcpdata, target); IRCTXT_CTCP_REPLY, ctcp, nick, ctcpdata, target);
g_free(ctcp); g_free(ctcp);
} }
@ -137,7 +137,7 @@ static void ctcp_ping_reply(IRC_SERVER_REC *server, const char *data,
g_get_current_time(&tv); g_get_current_time(&tv);
usecs = get_timeval_diff(&tv, &tv2); usecs = get_timeval_diff(&tv, &tv2);
printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS,
IRCTXT_CTCP_PING_REPLY, nick, usecs/1000, usecs%1000); IRCTXT_CTCP_PING_REPLY, nick, usecs/1000, usecs%1000);
} }

View File

@ -400,7 +400,7 @@ static void event_target_unavailable(IRC_SERVER_REC *server, const char *data,
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
params = event_get_params(data, 2, NULL, &target); params = event_get_params(data, 2, NULL, &target);
if (!ischannel(*target)) { if (!server_ischannel(SERVER(server), target)) {
/* nick unavailable */ /* nick unavailable */
printformat(server, NULL, MSGLEVEL_CRAP, printformat(server, NULL, MSGLEVEL_CRAP,
IRCTXT_NICK_UNAVAILABLE, target); IRCTXT_NICK_UNAVAILABLE, target);
@ -583,7 +583,7 @@ static void print_event_received(IRC_SERVER_REC *server, const char *data,
return; return;
ptr++; ptr++;
if (ischannel(*data)) /* directed at channel */ if (server_ischannel(SERVER(server), data)) /* directed at channel */
target = g_strndup(data, (int)(ptr - data - 1)); target = g_strndup(data, (int)(ptr - data - 1));
else if (!target_param || *ptr == ':' || (ptr2 = strchr(ptr, ' ')) == NULL) else if (!target_param || *ptr == ':' || (ptr2 = strchr(ptr, ' ')) == NULL)
target = NULL; target = NULL;

View File

@ -41,6 +41,7 @@
#include "fe-queries.h" #include "fe-queries.h"
#include "fe-windows.h" #include "fe-windows.h"
#include "fe-irc-server.h" #include "fe-irc-server.h"
#include "fe-irc-channels.h"
static void event_privmsg(IRC_SERVER_REC *server, const char *data, static void event_privmsg(IRC_SERVER_REC *server, const char *data,
const char *nick, const char *addr) const char *nick, const char *addr)
@ -52,15 +53,17 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data,
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
if (nick == NULL) nick = server->real_address; if (nick == NULL) nick = server->real_address;
if (addr == NULL) addr = ""; if (addr == NULL) addr = "";
if (*target == '@' && ischannel(target[1])) {
if (fe_channel_is_opchannel(server, target)) {
/* Hybrid 6 feature, send msg to all ops in channel */ /* Hybrid 6 feature, send msg to all ops in channel */
recoded = recode_in(SERVER(server), msg, target+1); target = (char *)fe_channel_skip_prefix(server, target);
recoded = recode_in(SERVER(server), msg, target);
signal_emit("message irc op_public", 5, signal_emit("message irc op_public", 5,
server, recoded, nick, addr, server, recoded, nick, addr,
get_visible_target(server, target+1)); get_visible_target(server, target));
} else { } else {
recoded = recode_in(SERVER(server), msg, ischannel(*target) ? target : nick); recoded = recode_in(SERVER(server), msg, server_ischannel(SERVER(server), target) ? target : nick);
signal_emit(ischannel(*target) ? signal_emit(server_ischannel(SERVER(server), target) ?
"message public" : "message private", 5, "message public" : "message private", 5,
server, recoded, nick, addr, server, recoded, nick, addr,
get_visible_target(server, target)); get_visible_target(server, target));

View File

@ -31,6 +31,51 @@
#include "fe-windows.h" #include "fe-windows.h"
#include "window-items.h" #include "window-items.h"
int fe_channel_is_opchannel(IRC_SERVER_REC *server, const char *target)
{
const char *statusmsg;
/* Quick check */
if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0)
return FALSE;
statusmsg = g_hash_table_lookup(server->isupport, "statusmsg");
if (statusmsg == NULL)
statusmsg = "@+";
return strchr(statusmsg, *target) != NULL;
}
const char *fe_channel_skip_prefix(IRC_SERVER_REC *server, const char *target)
{
const char *statusmsg;
/* Quick check */
if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0)
return target;
/* Exit early if target doesn't name a channel */
if (server_ischannel(SERVER(server), target) == FALSE)
return FALSE;
statusmsg = g_hash_table_lookup(server->isupport, "statusmsg");
/* Hack: for bahamut 1.4 which sends neither STATUSMSG nor
* WALLCHOPS in 005, accept @#chan and @+#chan (but not +#chan) */
if (statusmsg == NULL && *target != '@')
return target;
if (statusmsg == NULL)
statusmsg = "@+";
/* Strip the leading statusmsg prefixes */
while (strchr(statusmsg, *target) != NULL) {
target++;
}
return target;
}
static void sig_channel_rejoin(SERVER_REC *server, REJOIN_REC *rec) static void sig_channel_rejoin(SERVER_REC *server, REJOIN_REC *rec)
{ {
g_return_if_fail(rec != NULL); g_return_if_fail(rec != NULL);
@ -46,7 +91,7 @@ static void sig_event_forward(SERVER_REC *server, const char *data,
char *params, *from, *to; char *params, *from, *to;
params = event_get_params(data, 3, NULL, &from, &to); params = event_get_params(data, 3, NULL, &from, &to);
if (from != NULL && to != NULL && ischannel(*from) && ischannel(*to)) { if (from != NULL && to != NULL && server_ischannel(server, from) && server_ischannel(server, to)) {
channel = irc_channel_find(server, from); channel = irc_channel_find(server, from);
if (channel != NULL && irc_channel_find(server, to) == NULL) { if (channel != NULL && irc_channel_find(server, to) == NULL) {
window_bind_add(window_item_window(channel), window_bind_add(window_item_window(channel),

View File

@ -0,0 +1,10 @@
#ifndef __FE_IRC_CHANNELS_H
#define __FE_IRC_CHANNELS_H
int fe_channel_is_opchannel(IRC_SERVER_REC *server, const char *target);
const char *fe_channel_skip_prefix(IRC_SERVER_REC *server, const char *target);
void fe_irc_channels_init(void);
void fe_irc_channels_deinit(void);
#endif

View File

@ -36,32 +36,7 @@
#include "fe-queries.h" #include "fe-queries.h"
#include "window-items.h" #include "window-items.h"
#include "fe-irc-channels.h"
static const char *skip_target(IRC_SERVER_REC *server, const char *target)
{
int i = 0;
const char *val, *chars;
/* Quick check */
if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0)
return target;
/* Hack: for bahamut 1.4 which sends neither STATUSMSG nor
* WALLCHOPS in 005, accept @#chan and @+#chan (but not +#chan) */
val = g_hash_table_lookup(server->isupport, "STATUSMSG");
if (val == NULL && *target != '@')
return target;
chars = val ? val : "@+";
for(i = 0; target[i] != '\0'; i++) {
if (strchr(chars, target[i]) == NULL)
break;
};
if(ischannel(target[i]))
target += i;
return target;
}
static void sig_message_own_public(SERVER_REC *server, const char *msg, static void sig_message_own_public(SERVER_REC *server, const char *msg,
const char *target, const char *origtarget) const char *target, const char *origtarget)
@ -72,7 +47,7 @@ static void sig_message_own_public(SERVER_REC *server, const char *msg,
if (!IS_IRC_SERVER(server)) if (!IS_IRC_SERVER(server))
return; return;
oldtarget = target; oldtarget = target;
target = skip_target(IRC_SERVER(server), target); target = fe_channel_skip_prefix(IRC_SERVER(server), target);
if (target != oldtarget) { if (target != oldtarget) {
/* Hybrid 6 / Bahamut feature, send msg to all /* Hybrid 6 / Bahamut feature, send msg to all
ops / ops+voices in channel */ ops / ops+voices in channel */
@ -135,8 +110,8 @@ static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg,
char *freemsg = NULL; char *freemsg = NULL;
oldtarget = target; oldtarget = target;
target = skip_target(IRC_SERVER(server), target); target = fe_channel_skip_prefix(IRC_SERVER(server), target);
if (ischannel(*target)) if (server_ischannel(SERVER(server), target))
item = irc_channel_find(server, target); item = irc_channel_find(server, target);
else else
item = irc_query_find(server, target); item = irc_query_find(server, target);
@ -146,7 +121,7 @@ static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg,
printformat(server, target, printformat(server, target,
MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT |
(ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS),
item != NULL && oldtarget == target ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, item != NULL && oldtarget == target ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET,
server->nick, msg, oldtarget); server->nick, msg, oldtarget);
g_free_not_null(freemsg); g_free_not_null(freemsg);
@ -163,10 +138,10 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg,
int own = FALSE; int own = FALSE;
oldtarget = target; oldtarget = target;
target = skip_target(IRC_SERVER(server), target); target = fe_channel_skip_prefix(IRC_SERVER(server), target);
level = MSGLEVEL_ACTIONS | level = MSGLEVEL_ACTIONS |
(ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS);
if (ignore_check(SERVER(server), nick, address, target, msg, level)) if (ignore_check(SERVER(server), nick, address, target, msg, level))
return; return;
@ -175,7 +150,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg,
level | MSGLEVEL_NO_ACT)) level | MSGLEVEL_NO_ACT))
level |= MSGLEVEL_NO_ACT; level |= MSGLEVEL_NO_ACT;
if (ischannel(*target)) { if (server_ischannel(SERVER(server), target)) {
item = irc_channel_find(server, target); item = irc_channel_find(server, target);
} else { } else {
own = (!g_strcmp0(nick, server->nick)); own = (!g_strcmp0(nick, server->nick));
@ -185,7 +160,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg,
if (settings_get_bool("emphasis")) if (settings_get_bool("emphasis"))
msg = freemsg = expand_emphasis(item, msg); msg = freemsg = expand_emphasis(item, msg);
if (ischannel(*target)) { if (server_ischannel(SERVER(server), target)) {
/* channel action */ /* channel action */
if (window_item_is_active(item) && target == oldtarget) { if (window_item_is_active(item) && target == oldtarget) {
/* message to active channel in window */ /* message to active channel in window */
@ -219,7 +194,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg,
static void sig_message_own_notice(IRC_SERVER_REC *server, const char *msg, static void sig_message_own_notice(IRC_SERVER_REC *server, const char *msg,
const char *target) const char *target)
{ {
printformat(server, skip_target(server, target), MSGLEVEL_NOTICES | printformat(server, fe_channel_skip_prefix(server, target), MSGLEVEL_NOTICES |
MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
IRCTXT_OWN_NOTICE, target, msg); IRCTXT_OWN_NOTICE, target, msg);
} }
@ -232,7 +207,7 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg,
int level = MSGLEVEL_NOTICES; int level = MSGLEVEL_NOTICES;
oldtarget = target; oldtarget = target;
target = skip_target(IRC_SERVER(server), target); target = fe_channel_skip_prefix(IRC_SERVER(server), target);
if (address == NULL || *address == '\0') { if (address == NULL || *address == '\0') {
/* notice from server */ /* notice from server */
@ -245,16 +220,16 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg,
} }
if (ignore_check(server, nick, address, if (ignore_check(server, nick, address,
ischannel(*target) ? target : NULL, server_ischannel(SERVER(server), target) ? target : NULL,
msg, level)) msg, level))
return; return;
if (ignore_check(server, nick, address, if (ignore_check(server, nick, address,
ischannel(*target) ? target : NULL, server_ischannel(SERVER(server), target) ? target : NULL,
msg, level | MSGLEVEL_NO_ACT)) msg, level | MSGLEVEL_NO_ACT))
level |= MSGLEVEL_NO_ACT; level |= MSGLEVEL_NO_ACT;
if (ischannel(*target)) { if (server_ischannel(SERVER(server), target)) {
/* notice in some channel */ /* notice in some channel */
printformat(server, target, level, printformat(server, target, level,
IRCTXT_NOTICE_PUBLIC, nick, oldtarget, msg); IRCTXT_NOTICE_PUBLIC, nick, oldtarget, msg);
@ -270,7 +245,7 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg,
static void sig_message_own_ctcp(IRC_SERVER_REC *server, const char *cmd, static void sig_message_own_ctcp(IRC_SERVER_REC *server, const char *cmd,
const char *data, const char *target) const char *data, const char *target)
{ {
printformat(server, skip_target(server, target), MSGLEVEL_CTCPS | printformat(server, fe_channel_skip_prefix(server, target), MSGLEVEL_CTCPS |
MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
IRCTXT_OWN_CTCP, target, cmd, data); IRCTXT_OWN_CTCP, target, cmd, data);
} }
@ -282,8 +257,8 @@ static void sig_message_irc_ctcp(IRC_SERVER_REC *server, const char *cmd,
const char *oldtarget; const char *oldtarget;
oldtarget = target; oldtarget = target;
target = skip_target(server, target); target = fe_channel_skip_prefix(server, target);
printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS,
IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, oldtarget); IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, oldtarget);
} }

View File

@ -63,7 +63,7 @@ static void event_privmsg(SERVER_REC *server, const char *data,
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
if (nick == NULL || address == NULL || ischannel(*data) || if (nick == NULL || address == NULL || server_ischannel(server, data) ||
!settings_get_bool("query_track_nick_changes")) !settings_get_bool("query_track_nick_changes"))
return; return;

View File

@ -168,7 +168,7 @@ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel,
mode, MSGLEVEL_MODES)) mode, MSGLEVEL_MODES))
return; return;
if (!ischannel(*channel)) { if (!server_ischannel(SERVER(server), channel)) {
/* user mode change */ /* user mode change */
printformat(server, NULL, MSGLEVEL_MODES, printformat(server, NULL, MSGLEVEL_MODES,
IRCTXT_USERMODE_CHANGE, mode, channel); IRCTXT_USERMODE_CHANGE, mode, channel);

View File

@ -400,7 +400,7 @@ static void msg_mode(IRC_SERVER_REC *server, const char *channel,
int show; int show;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
if (!ischannel(*channel) || addr != NULL) if (!server_ischannel(SERVER(server), channel) || addr != NULL)
return; return;
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, params = event_get_params(data, 2 | PARAM_FLAG_GETREST,

View File

@ -502,6 +502,9 @@ static void terminfo_input_init(TERM_REC *term)
memcpy(&term->tio, &term->old_tio, sizeof(term->tio)); memcpy(&term->tio, &term->old_tio, sizeof(term->tio));
term->tio.c_lflag &= ~(ICANON | ECHO); /* CBREAK, no ECHO */ term->tio.c_lflag &= ~(ICANON | ECHO); /* CBREAK, no ECHO */
/* Disable the ICRNL flag to disambiguate ^J and Enter, also disable the
* software flow control to leave ^Q and ^S ready to be bound */
term->tio.c_iflag &= ~(ICRNL | IXON | IXOFF);
term->tio.c_cc[VMIN] = 1; /* read() is satisfied after 1 char */ term->tio.c_cc[VMIN] = 1; /* read() is satisfied after 1 char */
term->tio.c_cc[VTIME] = 0; /* No timer */ term->tio.c_cc[VTIME] = 0; /* No timer */

View File

@ -186,7 +186,7 @@ static void command_set_ban(const char *data, IRC_SERVER_REC *server,
if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST, if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST,
item, &channel, &nicks)) return; item, &channel, &nicks)) return;
if (!ischannel(*channel)) cmd_param_error(CMDERR_NOT_JOINED); if (!server_ischannel(SERVER(server), channel)) cmd_param_error(CMDERR_NOT_JOINED);
if (*nicks == '\0') { if (*nicks == '\0') {
if (g_strcmp0(data, "*") != 0) if (g_strcmp0(data, "*") != 0)
cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);

View File

@ -149,7 +149,7 @@ static void event_target_unavailable(IRC_SERVER_REC *server, const char *data)
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
params = event_get_params(data, 2, NULL, &channel); params = event_get_params(data, 2, NULL, &channel);
if (ischannel(*channel)) { if (server_ischannel(SERVER(server), channel)) {
chanrec = irc_channel_find(server, channel); chanrec = irc_channel_find(server, channel);
if (chanrec != NULL && chanrec->joined) { if (chanrec != NULL && chanrec->joined) {
/* dalnet event - can't change nick while /* dalnet event - can't change nick while

View File

@ -99,7 +99,7 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
tmp = chanlist; tmp = chanlist;
for (;; tmp++) { for (;; tmp++) {
if (*tmp != NULL) { if (*tmp != NULL) {
channel = ischannel(**tmp) ? g_strdup(*tmp) : channel = server_ischannel(SERVER(server), *tmp) ? g_strdup(*tmp) :
g_strdup_printf("#%s", *tmp); g_strdup_printf("#%s", *tmp);
chanrec = irc_channel_find(server, channel); chanrec = irc_channel_find(server, channel);
@ -134,7 +134,7 @@ static void irc_channels_join(IRC_SERVER_REC *server, const char *data,
if (use_keys) if (use_keys)
cmdlen += outkeys->len; cmdlen += outkeys->len;
if (*tmpstr != NULL) if (*tmpstr != NULL)
cmdlen += ischannel(**tmpstr) ? strlen(*tmpstr) : cmdlen += server_ischannel(SERVER(server), *tmpstr) ? strlen(*tmpstr) :
strlen(*tmpstr)+1; strlen(*tmpstr)+1;
if (*tmpkey != NULL) if (*tmpkey != NULL)
cmdlen += strlen(*tmpkey); cmdlen += strlen(*tmpkey);

View File

@ -191,7 +191,7 @@ static void cmd_kick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item
return; return;
if (*channame == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*channame == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
if (!ischannel(*channame)) cmd_param_error(CMDERR_NOT_JOINED); if (!server_ischannel(SERVER(server), channame)) cmd_param_error(CMDERR_NOT_JOINED);
recoded = recode_out(SERVER(server), reason, channame); recoded = recode_out(SERVER(server), reason, channame);
g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, recoded); g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, recoded);

View File

@ -394,7 +394,7 @@ static void event_target_unavailable(IRC_SERVER_REC *server, const char *data)
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
params = event_get_params(data, 2, NULL, &channel); params = event_get_params(data, 2, NULL, &channel);
if (!ischannel(*channel)) { if (!server_ischannel(SERVER(server), channel)) {
/* nick is unavailable. */ /* nick is unavailable. */
event_nick_in_use(server, data); event_nick_in_use(server, data);
} }

View File

@ -60,8 +60,8 @@ static void check_query_changes(IRC_SERVER_REC *server, const char *nick,
{ {
QUERY_REC *query; QUERY_REC *query;
if (ischannel(*target)) if (server_ischannel(SERVER(server), target))
return; return;
query = irc_query_find(server, nick); query = irc_query_find(server, nick);
if (query == NULL) if (query == NULL)

View File

@ -34,6 +34,8 @@
#include "irc-servers.h" #include "irc-servers.h"
#include "irc-cap.h" #include "irc-cap.h"
#include "sasl.h" #include "sasl.h"
#include "channels-setup.h"
#include "channel-rejoin.h" #include "channel-rejoin.h"
#include "servers-idle.h" #include "servers-idle.h"
#include "servers-reconnect.h" #include "servers-reconnect.h"
@ -73,13 +75,20 @@ static int isnickflag_func(SERVER_REC *server, char flag)
static int ischannel_func(SERVER_REC *server, const char *data) static int ischannel_func(SERVER_REC *server, const char *data)
{ {
if (*data == '@') { IRC_SERVER_REC *irc_server = (IRC_SERVER_REC *) server;
/* @#channel, @+#channel */ char *chantypes, *statusmsg;
chantypes = g_hash_table_lookup(irc_server->isupport, "chantypes");
if (chantypes == NULL)
chantypes = "#&!+"; /* normal, local, secure, modeless */
statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg");
if (statusmsg == NULL)
statusmsg = "@+";
while (strchr(statusmsg, *data) != NULL)
data++; data++;
if (*data == '+' && ischannel(data[1]))
return 1; return strchr(chantypes, *data) != NULL;
}
return ischannel(*data);
} }
static char **split_line(const SERVER_REC *server, const char *line, static char **split_line(const SERVER_REC *server, const char *line,
@ -606,32 +615,59 @@ char *irc_server_get_channels(IRC_SERVER_REC *server)
GString *chans, *keys; GString *chans, *keys;
char *ret; char *ret;
int use_keys; int use_keys;
char *rejoin_channels_mode;
g_return_val_if_fail(server != NULL, FALSE); g_return_val_if_fail(server != NULL, FALSE);
rejoin_channels_mode = g_strdup(settings_get_str("rejoin_channels_on_reconnect"));
if (rejoin_channels_mode == NULL ||
(g_ascii_strcasecmp(rejoin_channels_mode, "on") != 0 &&
g_ascii_strcasecmp(rejoin_channels_mode, "off") != 0 &&
g_ascii_strcasecmp(rejoin_channels_mode, "auto") != 0)) {
g_warning("Invalid value for 'rejoin_channels_on_reconnect', valid values are 'on', 'off', 'auto', using 'on' as default value.");
g_free(rejoin_channels_mode);
rejoin_channels_mode = g_strdup("on");
}
chans = g_string_new(NULL); chans = g_string_new(NULL);
keys = g_string_new(NULL); keys = g_string_new(NULL);
use_keys = FALSE; use_keys = FALSE;
/* do we want to rejoin channels in the first place? */
if(g_ascii_strcasecmp(rejoin_channels_mode, "off") == 0) {
g_string_free(chans, TRUE);
g_string_free(keys, TRUE);
g_free(rejoin_channels_mode);
return g_strdup("");
}
/* get currently joined channels */ /* get currently joined channels */
for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { for (tmp = server->channels; tmp != NULL; tmp = tmp->next) {
CHANNEL_REC *channel = tmp->data; CHANNEL_REC *channel = tmp->data;
CHANNEL_SETUP_REC *setup = channel_setup_find(channel->name, channel->server->connrec->chatnet);
g_string_append_printf(chans, "%s,", channel->name); if ((setup != NULL && setup->autojoin && g_ascii_strcasecmp(rejoin_channels_mode, "auto") == 0) ||
g_string_append_printf(keys, "%s,", channel->key == NULL ? "x" : g_ascii_strcasecmp(rejoin_channels_mode, "on") == 0) {
channel->key); g_string_append_printf(chans, "%s,", channel->name);
if (channel->key != NULL) g_string_append_printf(keys, "%s,", channel->key == NULL ? "x" : channel->key);
use_keys = TRUE; if (channel->key != NULL)
use_keys = TRUE;
}
} }
/* get also the channels that are in rejoin list */ /* get also the channels that are in rejoin list */
for (tmp = server->rejoin_channels; tmp != NULL; tmp = tmp->next) { for (tmp = server->rejoin_channels; tmp != NULL; tmp = tmp->next) {
REJOIN_REC *rec = tmp->data; REJOIN_REC *rec = tmp->data;
CHANNEL_SETUP_REC *setup = channel_setup_find(rec->channel, server->tag);
g_string_append_printf(chans, "%s,", rec->channel); if ((setup != NULL && setup->autojoin && g_ascii_strcasecmp(rejoin_channels_mode, "auto") == 0) ||
g_string_append_printf(keys, "%s,", rec->key == NULL ? "x" : g_ascii_strcasecmp(rejoin_channels_mode, "on") == 0) {
rec->key); g_string_append_printf(chans, "%s,", rec->channel);
if (rec->key != NULL) use_keys = TRUE; g_string_append_printf(keys, "%s,", rec->key == NULL ? "x" :
rec->key);
if (rec->key != NULL) use_keys = TRUE;
}
} }
if (chans->len > 0) { if (chans->len > 0) {
@ -643,6 +679,7 @@ char *irc_server_get_channels(IRC_SERVER_REC *server)
ret = chans->str; ret = chans->str;
g_string_free(chans, FALSE); g_string_free(chans, FALSE);
g_string_free(keys, TRUE); g_string_free(keys, TRUE);
g_free(rejoin_channels_mode);
return ret; return ret;
} }
@ -988,6 +1025,7 @@ void irc_server_init_isupport(IRC_SERVER_REC *server)
void irc_servers_init(void) void irc_servers_init(void)
{ {
settings_add_str("servers", "rejoin_channels_on_reconnect", "on");
settings_add_str("misc", "usermode", DEFAULT_USER_MODE); settings_add_str("misc", "usermode", DEFAULT_USER_MODE);
settings_add_str("misc", "split_line_start", ""); settings_add_str("misc", "split_line_start", "");
settings_add_str("misc", "split_line_end", ""); settings_add_str("misc", "split_line_end", "");

View File

@ -22,12 +22,6 @@ typedef struct _REDIRECT_REC REDIRECT_REC;
#define isnickflag(server, a) \ #define isnickflag(server, a) \
(server->prefix[(int)(unsigned char) a] != '\0') (server->prefix[(int)(unsigned char) a] != '\0')
#define ischannel(a) \
((a) == '#' || /* normal */ \
(a) == '&' || /* local */ \
(a) == '!' || /* secure */ \
(a) == '+') /* modeless */
#define IS_IRC_ITEM(rec) (IS_IRC_CHANNEL(rec) || IS_IRC_QUERY(rec)) #define IS_IRC_ITEM(rec) (IS_IRC_CHANNEL(rec) || IS_IRC_QUERY(rec))
#define IRC_PROTOCOL (chat_protocol_lookup("IRC")) #define IRC_PROTOCOL (chat_protocol_lookup("IRC"))

View File

@ -488,7 +488,7 @@ static void event_mode(IRC_SERVER_REC *server, const char *data,
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
&channel, &mode); &channel, &mode);
if (!ischannel(*channel)) { if (!server_ischannel(SERVER(server), channel)) {
/* user mode change */ /* user mode change */
parse_user_mode(server, mode); parse_user_mode(server, mode);
} else { } else {
@ -536,7 +536,7 @@ static void sig_req_usermode_change(IRC_SERVER_REC *server, const char *data,
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
&target, &mode); &target, &mode);
if (!ischannel(*target)) { if (!server_ischannel(SERVER(server), target)) {
/* we requested a user mode change, save this */ /* we requested a user mode change, save this */
mode = modes_join(NULL, server->wanted_usermode, mode, FALSE); mode = modes_join(NULL, server->wanted_usermode, mode, FALSE);
g_free_not_null(server->wanted_usermode); g_free_not_null(server->wanted_usermode);
@ -856,7 +856,7 @@ static void cmd_mode(const char *data, IRC_SERVER_REC *server,
target = chanrec->name; target = chanrec->name;
irc_send_cmdv(server, "MODE %s", target); irc_send_cmdv(server, "MODE %s", target);
} else if (ischannel(*target)) } else if (server_ischannel(SERVER(server), target))
channel_set_mode(server, target, mode); channel_set_mode(server, target, mode);
else { else {
if (g_ascii_strcasecmp(target, server->nick) == 0) { if (g_ascii_strcasecmp(target, server->nick) == 0) {

View File

@ -51,7 +51,7 @@ static void sig_dcc_request(GET_DCC_REC *dcc, const char *nickaddr)
/* Unless specifically said in dcc_autoget_masks, don't do autogets /* Unless specifically said in dcc_autoget_masks, don't do autogets
sent to channels. */ sent to channels. */
if (*masks == '\0' && dcc->target != NULL && ischannel(*dcc->target)) if (*masks == '\0' && dcc->target != NULL && server_ischannel(SERVER(dcc->server), dcc->target))
return; return;
/* don't autoget files beginning with a dot, if download dir is /* don't autoget files beginning with a dot, if download dir is

View File

@ -250,7 +250,7 @@ static void flood_privmsg(IRC_SERVER_REC *server, const char *data,
params = event_get_params(data, 2, &target, &text); params = event_get_params(data, 2, &target, &text);
level = ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS; level = server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS;
if (addr != NULL && !ignore_check(SERVER(server), nick, addr, target, text, level)) if (addr != NULL && !ignore_check(SERVER(server), nick, addr, target, text, level))
flood_newmsg(server, level, nick, addr, target); flood_newmsg(server, level, nick, addr, target);
@ -287,7 +287,7 @@ static void flood_ctcp(IRC_SERVER_REC *server, const char *data,
return; return;
level = g_ascii_strncasecmp(data, "ACTION ", 7) != 0 ? MSGLEVEL_CTCPS : level = g_ascii_strncasecmp(data, "ACTION ", 7) != 0 ? MSGLEVEL_CTCPS :
(ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS);
if (!ignore_check(SERVER(server), nick, addr, target, data, level)) if (!ignore_check(SERVER(server), nick, addr, target, data, level))
flood_newmsg(server, level, nick, addr, target); flood_newmsg(server, level, nick, addr, target);
} }

View File

@ -37,6 +37,8 @@ GSList *proxy_clients;
static GString *next_line; static GString *next_line;
static int ignore_next; static int ignore_next;
static int enabled = FALSE;
static void remove_client(CLIENT_REC *rec) static void remove_client(CLIENT_REC *rec)
{ {
g_return_if_fail(rec != NULL); g_return_if_fail(rec != NULL);
@ -45,8 +47,8 @@ static void remove_client(CLIENT_REC *rec)
rec->listen->clients = g_slist_remove(rec->listen->clients, rec); rec->listen->clients = g_slist_remove(rec->listen->clients, rec);
signal_emit("proxy client disconnected", 1, rec); signal_emit("proxy client disconnected", 1, rec);
printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, printtext(rec->server, NULL, MSGLEVEL_CLIENTNOTICE,
"Proxy: Client disconnected from %s", rec->host); "Proxy: Client %s:%d disconnected", rec->host, rec->port);
g_free(rec->proxy_address); g_free(rec->proxy_address);
net_sendbuffer_destroy(rec->handle, TRUE); net_sendbuffer_destroy(rec->handle, TRUE);
@ -126,6 +128,10 @@ static void handle_client_connect_cmd(CLIENT_REC *client,
/* client didn't send us PASS, kill it */ /* client didn't send us PASS, kill it */
remove_client(client); remove_client(client);
} else { } else {
signal_emit("proxy client connected", 1, client);
printtext(client->server, NULL, MSGLEVEL_CLIENTNOTICE,
"Proxy: Client %s:%d connected",
client->host, client->port);
client->connected = TRUE; client->connected = TRUE;
proxy_dump_data(client); proxy_dump_data(client);
} }
@ -262,7 +268,7 @@ static void handle_client_cmd(CLIENT_REC *client, char *cmd, char *args,
ignore_next = TRUE; ignore_next = TRUE;
if (*msg != '\001' || msg[strlen(msg)-1] != '\001') { if (*msg != '\001' || msg[strlen(msg)-1] != '\001') {
signal_emit(ischannel(*target) ? signal_emit(server_ischannel(SERVER(client->server), target) ?
"message own_public" : "message own_private", 4, "message own_public" : "message own_private", 4,
client->server, msg, target, target); client->server, msg, target, target);
} else if (strncmp(msg+1, "ACTION ", 7) == 0) { } else if (strncmp(msg+1, "ACTION ", 7) == 0) {
@ -347,6 +353,7 @@ static void sig_listen(LISTEN_REC *listen)
rec->listen = listen; rec->listen = listen;
rec->handle = sendbuf; rec->handle = sendbuf;
rec->host = g_strdup(host); rec->host = g_strdup(host);
rec->port = port;
if (g_strcmp0(listen->ircnet, "*") == 0) { if (g_strcmp0(listen->ircnet, "*") == 0) {
rec->proxy_address = g_strdup("irc.proxy"); rec->proxy_address = g_strdup("irc.proxy");
rec->server = servers == NULL ? NULL : IRC_SERVER(servers->data); rec->server = servers == NULL ? NULL : IRC_SERVER(servers->data);
@ -361,9 +368,10 @@ static void sig_listen(LISTEN_REC *listen)
proxy_clients = g_slist_prepend(proxy_clients, rec); proxy_clients = g_slist_prepend(proxy_clients, rec);
rec->listen->clients = g_slist_prepend(rec->listen->clients, rec); rec->listen->clients = g_slist_prepend(rec->listen->clients, rec);
signal_emit("proxy client connected", 1, rec); signal_emit("proxy client connecting", 1, rec);
printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, printtext(rec->server, NULL, MSGLEVEL_CLIENTNOTICE,
"Proxy: Client connected from %s", rec->host); "Proxy: New client %s:%d on port %d (%s)",
rec->host, rec->port, listen->port, listen->ircnet);
} }
static void sig_incoming(IRC_SERVER_REC *server, const char *line) static void sig_incoming(IRC_SERVER_REC *server, const char *line)
@ -634,7 +642,8 @@ static void remove_listen(LISTEN_REC *rec)
static void read_settings(void) static void read_settings(void)
{ {
LISTEN_REC *rec; LISTEN_REC *rec;
GSList *remove_listens; GSList *remove_listens = NULL;
GSList *add_listens = NULL;
char **ports, **tmp, *ircnet, *port; char **ports, **tmp, *ircnet, *port;
int portnum; int portnum;
@ -653,17 +662,30 @@ static void read_settings(void)
continue; continue;
rec = find_listen(ircnet, portnum); rec = find_listen(ircnet, portnum);
if (rec == NULL) if (rec == NULL) {
add_listen(ircnet, portnum); rec = g_new0(LISTEN_REC, 1);
else rec->ircnet = ircnet; /* borrow */
rec->port = portnum;
add_listens = g_slist_prepend(add_listens, rec);
} else {
/* remove from the list of listens to remove == keep it */
remove_listens = g_slist_remove(remove_listens, rec); remove_listens = g_slist_remove(remove_listens, rec);
}
} }
g_strfreev(ports);
while (remove_listens != NULL) { while (remove_listens != NULL) {
remove_listen(remove_listens->data); remove_listen(remove_listens->data);
remove_listens = g_slist_remove(remove_listens, remove_listens->data); remove_listens = g_slist_remove(remove_listens, remove_listens->data);
} }
while (add_listens != NULL) {
rec = add_listens->data;
add_listen(rec->ircnet, rec->port);
g_free(rec);
add_listens = g_slist_remove(add_listens, add_listens->data);
}
g_strfreev(ports);
} }
static void sig_dump(CLIENT_REC *client, const char *data) static void sig_dump(CLIENT_REC *client, const char *data)
@ -676,6 +698,11 @@ static void sig_dump(CLIENT_REC *client, const char *data)
void proxy_listen_init(void) void proxy_listen_init(void)
{ {
if (enabled) {
return;
}
enabled = TRUE;
next_line = g_string_new(NULL); next_line = g_string_new(NULL);
proxy_clients = NULL; proxy_clients = NULL;
@ -697,6 +724,11 @@ void proxy_listen_init(void)
void proxy_listen_deinit(void) void proxy_listen_deinit(void)
{ {
if (!enabled) {
return;
}
enabled = FALSE;
while (proxy_listens != NULL) while (proxy_listens != NULL)
remove_listen(proxy_listens->data); remove_listen(proxy_listens->data);
g_string_free(next_line, TRUE); g_string_free(next_line, TRUE);

View File

@ -23,11 +23,60 @@
#include "settings.h" #include "settings.h"
#include "levels.h" #include "levels.h"
#include "fe-common/core/printtext.h"
/* SYNTAX: IRSSIPROXY STATUS */
static void cmd_irssiproxy_status(const char *data, IRC_SERVER_REC *server)
{
if (!settings_get_bool("irssiproxy")) {
printtext(server, NULL, MSGLEVEL_CLIENTNOTICE,
"Proxy is currently disabled");
return;
}
GSList *tmp;
printtext(server, NULL, MSGLEVEL_CLIENTNOTICE,
"Proxy: Currently connected clients: %d",
g_slist_length(proxy_clients));
for (tmp = proxy_clients; tmp != NULL; tmp = tmp->next) {
CLIENT_REC *rec = tmp->data;
printtext(server, NULL, MSGLEVEL_CLIENTNOTICE,
" %s:%d connect%s to %d (%s)",
rec->host, rec->port,
rec->connected ? "ed" : "ing",
rec->listen->port, rec->listen->ircnet);
}
}
/* SYNTAX: IRSSIPROXY */
static void cmd_irssiproxy(const char *data, IRC_SERVER_REC *server, void *item)
{
if (*data == '\0') {
cmd_irssiproxy_status(data, server);
return;
}
command_runsub("irssiproxy", data, server, item);
}
static void irc_proxy_setup_changed(void)
{
if (settings_get_bool("irssiproxy")) {
proxy_listen_init();
} else {
proxy_listen_deinit();
}
}
void irc_proxy_init(void) void irc_proxy_init(void)
{ {
settings_add_str("irssiproxy", "irssiproxy_ports", ""); settings_add_str("irssiproxy", "irssiproxy_ports", "");
settings_add_str("irssiproxy", "irssiproxy_password", ""); settings_add_str("irssiproxy", "irssiproxy_password", "");
settings_add_str("irssiproxy", "irssiproxy_bind", ""); settings_add_str("irssiproxy", "irssiproxy_bind", "");
settings_add_bool("irssiproxy", "irssiproxy", TRUE);
if (*settings_get_str("irssiproxy_password") == '\0') { if (*settings_get_str("irssiproxy_password") == '\0') {
/* no password - bad idea! */ /* no password - bad idea! */
@ -43,7 +92,14 @@ void irc_proxy_init(void)
"... to set them."); "... to set them.");
} }
proxy_listen_init(); command_bind("irssiproxy", NULL, (SIGNAL_FUNC) cmd_irssiproxy);
command_bind("irssiproxy status", NULL, (SIGNAL_FUNC) cmd_irssiproxy_status);
signal_add_first("setup changed", (SIGNAL_FUNC) irc_proxy_setup_changed);
if (settings_get_bool("irssiproxy")) {
proxy_listen_init();
}
settings_check(); settings_check();
module_register("proxy", "irc"); module_register("proxy", "irc");
} }

View File

@ -19,6 +19,7 @@ typedef struct {
typedef struct { typedef struct {
char *nick, *host; char *nick, *host;
int port;
NET_SENDBUF_REC *handle; NET_SENDBUF_REC *handle;
int recv_tag; int recv_tag;
char *proxy_address; char *proxy_address;

View File

@ -149,6 +149,7 @@ static void perl_client_fill_hash(HV *hv, CLIENT_REC *client)
{ {
(void) hv_store(hv, "nick", 4, new_pv(client->nick), 0); (void) hv_store(hv, "nick", 4, new_pv(client->nick), 0);
(void) hv_store(hv, "host", 4, new_pv(client->host), 0); (void) hv_store(hv, "host", 4, new_pv(client->host), 0);
(void) hv_store(hv, "port", 4, newSViv(client->port), 0);
(void) hv_store(hv, "proxy_address", 13, new_pv(client->proxy_address), 0); (void) hv_store(hv, "proxy_address", 13, new_pv(client->proxy_address), 0);
(void) hv_store(hv, "server", 6, iobject_bless(client->server), 0); (void) hv_store(hv, "server", 6, iobject_bless(client->server), 0);
(void) hv_store(hv, "pass_sent", 9, newSViv(client->pass_sent), 0); (void) hv_store(hv, "pass_sent", 9, newSViv(client->pass_sent), 0);