summaryrefslogtreecommitdiff
path: root/src/irc/proxy
diff options
context:
space:
mode:
Diffstat (limited to 'src/irc/proxy')
-rw-r--r--src/irc/proxy/dump.c5
-rw-r--r--src/irc/proxy/listen.c36
-rw-r--r--src/irc/proxy/module.h5
3 files changed, 28 insertions, 18 deletions
diff --git a/src/irc/proxy/dump.c b/src/irc/proxy/dump.c
index a2959409..2ed60eae 100644
--- a/src/irc/proxy/dump.c
+++ b/src/irc/proxy/dump.c
@@ -20,6 +20,7 @@
#include "module.h"
#include "network.h"
+#include "net-sendbuffer.h"
#include "settings.h"
#include "irssi-version.h"
#include "recode.h"
@@ -40,7 +41,7 @@ void proxy_outdata(CLIENT_REC *client, const char *data, ...)
va_start(args, data);
str = g_strdup_vprintf(data, args);
- net_transmit(client->handle, str, strlen(str));
+ net_sendbuffer_send(client->handle, str, strlen(str));
g_free(str);
va_end(args);
@@ -64,7 +65,7 @@ void proxy_outdata_all(IRC_SERVER_REC *server, const char *data, ...)
CLIENT_REC *rec = tmp->data;
if (rec->connected && rec->server == server)
- net_transmit(rec->handle, str, len);
+ net_sendbuffer_send(rec->handle, str, len);
}
g_free(str);
diff --git a/src/irc/proxy/listen.c b/src/irc/proxy/listen.c
index b240a4b5..2239fe58 100644
--- a/src/irc/proxy/listen.c
+++ b/src/irc/proxy/listen.c
@@ -30,6 +30,15 @@
#include "fe-common/core/printtext.h" /* FIXME: evil. need to do fe-proxy */
+struct _NET_SENDBUF_REC {
+ GIOChannel *handle;
+
+ int send_tag;
+ int bufsize;
+ int bufpos;
+ char *buffer; /* Buffer is NULL until it's actually needed. */
+};
+
GSList *proxy_listens;
GSList *proxy_clients;
@@ -48,8 +57,8 @@ static void remove_client(CLIENT_REC *rec)
"Proxy: Client disconnected from %s", rec->host);
g_free(rec->proxy_address);
- net_disconnect(rec->handle);
- g_source_remove(rec->tag);
+ net_sendbuffer_destroy(rec->handle, TRUE);
+ g_source_remove(rec->recv_tag);
line_split_free(rec->buffer);
g_free_not_null(rec->nick);
g_free_not_null(rec->host);
@@ -171,7 +180,8 @@ static void handle_client_cmd(CLIENT_REC *client, char *cmd, char *args,
for (tmp = proxy_clients; tmp != NULL; tmp = tmp->next) {
CLIENT_REC *rec = tmp->data;
if ((g_strcasecmp(client->listen->ircnet,rec->listen->ircnet) == 0) &&
- (client->tag != rec->tag)) {
+ /* kludgy way to check if the clients aren't the same */
+ (client->recv_tag != rec->recv_tag)) {
if (rec->want_ctcp == 1)
proxy_outdata(rec, ":%s NOTICE %s :Another client is now receiving CTCPs sent to %s\n",
rec->proxy_address, rec->nick, rec->listen->ircnet);
@@ -299,7 +309,7 @@ static void sig_listen_client(CLIENT_REC *client)
g_return_if_fail(client != NULL);
while (g_slist_find(proxy_clients, client) != NULL) {
- recvlen = net_receive(client->handle, tmpbuf, sizeof(tmpbuf));
+ recvlen = net_receive(client->handle->handle, tmpbuf, sizeof(tmpbuf));
ret = line_split(tmpbuf, recvlen, &str, &client->buffer);
if (ret == -1) {
/* connection lost */
@@ -326,6 +336,7 @@ static void sig_listen(LISTEN_REC *listen)
{
CLIENT_REC *rec;
IPADDR ip;
+ NET_SENDBUF_REC *sendbuf;
GIOChannel *handle;
char host[MAX_IP_LEN];
int port;
@@ -337,10 +348,10 @@ static void sig_listen(LISTEN_REC *listen)
if (handle == NULL)
return;
net_ip2host(&ip, host);
-
+ sendbuf = net_sendbuffer_create(handle, 0);
rec = g_new0(CLIENT_REC, 1);
rec->listen = listen;
- rec->handle = handle;
+ rec->handle = sendbuf;
rec->host = g_strdup(host);
if (strcmp(listen->ircnet, "*") == 0) {
rec->proxy_address = g_strdup("irc.proxy");
@@ -350,7 +361,7 @@ static void sig_listen(LISTEN_REC *listen)
rec->server = servers == NULL ? NULL :
IRC_SERVER(server_find_chatnet(listen->ircnet));
}
- rec->tag = g_input_add(handle, G_INPUT_READ,
+ rec->recv_tag = g_input_add(handle, G_INPUT_READ,
(GInputFunction) sig_listen_client, rec);
proxy_clients = g_slist_prepend(proxy_clients, rec);
@@ -403,7 +414,7 @@ static void sig_server_event(IRC_SERVER_REC *server, const char *line,
if (sscanf(signal+6, "%p", &client) == 1) {
/* send it to specific client only */
if (g_slist_find(proxy_clients, client) != NULL)
- net_transmit(((CLIENT_REC *) client)->handle, next_line->str, next_line->len);
+ net_sendbuffer_send(((CLIENT_REC *) client)->handle, next_line->str, next_line->len);
g_free(event);
signal_stop();
return;
@@ -418,11 +429,10 @@ static void sig_server_event(IRC_SERVER_REC *server, const char *line,
CLIENT_REC *rec = tmp->data;
if (rec->want_ctcp == 1) {
- /* one of the clients answers */
- /* patched, so only CTCP for the chatnet where client is connected to will be forwarded */
- if (strstr(rec->proxy_address,server->connrec->chatnet) != NULL) {
- net_transmit(rec->handle,
- next_line->str, next_line->len);
+ /* only CTCP for the chatnet where client is connected to will be forwarded */
+ if (strstr(rec->proxy_address, server->connrec->chatnet) != NULL) {
+ net_sendbuffer_send(rec->handle,
+ next_line->str, next_line->len);
signal_stop();
}
}
diff --git a/src/irc/proxy/module.h b/src/irc/proxy/module.h
index 35aa7297..4116b716 100644
--- a/src/irc/proxy/module.h
+++ b/src/irc/proxy/module.h
@@ -21,9 +21,8 @@ typedef struct {
LINEBUF_REC *buffer;
char *nick, *host;
- GIOChannel *handle;
- int tag;
-
+ NET_SENDBUF_REC *handle;
+ int recv_tag;
char *proxy_address;
LISTEN_REC *listen;
IRC_SERVER_REC *server;