summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/chat-commands.c4
-rw-r--r--src/core/chat-protocols.h3
-rw-r--r--src/core/server-connect-rec.h1
-rw-r--r--src/core/servers-reconnect.c8
-rw-r--r--src/core/servers.c20
-rw-r--r--src/core/servers.h2
-rw-r--r--src/core/session.c6
-rw-r--r--src/irc/core/irc-core.c4
-rw-r--r--src/irc/core/irc-servers.c52
-rw-r--r--src/irc/core/irc-servers.h3
-rw-r--r--src/perl/irc/Server.xs6
11 files changed, 59 insertions, 50 deletions
diff --git a/src/core/chat-commands.c b/src/core/chat-commands.c
index debe6655..cc44a213 100644
--- a/src/core/chat-commands.c
+++ b/src/core/chat-commands.c
@@ -118,7 +118,7 @@ static void cmd_connect(const char *data)
conn = get_server_connect(data, NULL, &rawlog_file);
if (conn != NULL) {
- server = CHAT_PROTOCOL(conn)->server_connect(conn);
+ server = server_connect(conn);
server_connect_unref(conn);
if (server != NULL && rawlog_file != NULL)
@@ -224,7 +224,7 @@ static void cmd_server_connect(const char *data, SERVER_REC *server)
if (conn != NULL) {
if (!plus_addr)
update_reconnection(conn, server);
- server = CHAT_PROTOCOL(conn)->server_connect(conn);
+ server = server_connect(conn);
server_connect_unref(conn);
if (server != NULL && rawlog_file != NULL)
diff --git a/src/core/chat-protocols.h b/src/core/chat-protocols.h
index 95ab0937..8b7dc170 100644
--- a/src/core/chat-protocols.h
+++ b/src/core/chat-protocols.h
@@ -17,7 +17,8 @@ struct _CHAT_PROTOCOL_REC {
SERVER_CONNECT_REC *(*create_server_connect) (void);
void (*destroy_server_connect) (SERVER_CONNECT_REC *);
- SERVER_REC *(*server_connect) (SERVER_CONNECT_REC *);
+ SERVER_REC *(*server_init_connect) (SERVER_CONNECT_REC *);
+ void (*server_connect) (SERVER_REC *);
CHANNEL_REC *(*channel_create) (SERVER_REC *, const char *,
const char *, int);
QUERY_REC *(*query_create) (const char *, const char *, int);
diff --git a/src/core/server-connect-rec.h b/src/core/server-connect-rec.h
index cc5afa57..3613759e 100644
--- a/src/core/server-connect-rec.h
+++ b/src/core/server-connect-rec.h
@@ -29,6 +29,5 @@ GIOChannel *connect_handle; /* connect using this handle */
unsigned int reconnection:1; /* we're trying to reconnect */
unsigned int no_autojoin_channels:1; /* don't autojoin any channels */
unsigned int unix_socket:1; /* Connect using named unix socket */
-unsigned int session_reconnect:1; /* Connected to this server with /UPGRADE */
char *channels;
char *away_reason;
diff --git a/src/core/servers-reconnect.c b/src/core/servers-reconnect.c
index 1b17c921..93067b2b 100644
--- a/src/core/servers-reconnect.c
+++ b/src/core/servers-reconnect.c
@@ -99,7 +99,7 @@ static int server_reconnect_timeout(void)
conn = rec->conn;
server_connect_ref(conn);
server_reconnect_destroy(rec);
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
}
}
@@ -329,7 +329,7 @@ static void reconnect_all(void)
while (list != NULL) {
conn = list->data;
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
list = g_slist_remove(list, conn);
}
@@ -351,7 +351,7 @@ static void cmd_reconnect(const char *data, SERVER_REC *server)
signal_emit("command disconnect", 2, "* Reconnecting", server);
conn->reconnection = TRUE;
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
return;
}
@@ -383,7 +383,7 @@ static void cmd_reconnect(const char *data, SERVER_REC *server)
conn = rec->conn;
server_connect_ref(conn);
server_reconnect_destroy(rec);
- CHAT_PROTOCOL(conn)->server_connect(conn);
+ server_connect(conn);
server_connect_unref(conn);
}
diff --git a/src/core/servers.c b/src/core/servers.c
index e16d323c..4828750b 100644
--- a/src/core/servers.c
+++ b/src/core/servers.c
@@ -264,6 +264,18 @@ static void server_connect_callback_readpipe(SERVER_REC *server)
g_free(iprec.errorstr);
}
+SERVER_REC *server_connect(SERVER_CONNECT_REC *conn)
+{
+ CHAT_PROTOCOL_REC *proto;
+ SERVER_REC *server;
+
+ proto = CHAT_PROTOCOL(conn);
+ server = proto->server_init_connect(conn);
+ proto->server_connect(server);
+
+ return server;
+}
+
/* initializes server record but doesn't start connecting */
void server_connect_init(SERVER_REC *server)
{
@@ -305,16 +317,8 @@ int server_start_connect(SERVER_REC *server)
if (!server->connrec->unix_socket && server->connrec->port <= 0)
return FALSE;
- server_connect_init(server);
server->rawlog = rawlog_create();
- if (server->connrec->session_reconnect) {
- /* /UPGRADE connection - the session_connect is meant
- for us only once, move it into server->session_connect */
- server->connrec->session_reconnect = FALSE;
- server->session_reconnect = TRUE;
- }
-
if (server->connrec->connect_handle != NULL) {
/* already connected */
GIOChannel *handle = server->connrec->connect_handle;
diff --git a/src/core/servers.h b/src/core/servers.h
index dddde263..3c2c8634 100644
--- a/src/core/servers.h
+++ b/src/core/servers.h
@@ -53,6 +53,8 @@ int server_start_connect(SERVER_REC *server);
void server_connect_ref(SERVER_CONNECT_REC *conn);
void server_connect_unref(SERVER_CONNECT_REC *conn);
+SERVER_REC *server_connect(SERVER_CONNECT_REC *conn);
+
/* initializes server record but doesn't start connecting */
void server_connect_init(SERVER_REC *server);
/* Connection to server finished, fill the rest of the fields */
diff --git a/src/core/session.c b/src/core/session.c
index 94bedfb6..0f3d089c 100644
--- a/src/core/session.c
+++ b/src/core/session.c
@@ -277,10 +277,12 @@ static void session_restore_server(CONFIG_NODE *node)
if (conn != NULL) {
conn->reconnection = TRUE;
conn->connect_handle = g_io_channel_unix_new(handle);
- conn->session_reconnect = TRUE;
- server = proto->server_connect(conn);
+ server = proto->server_init_connect(conn);
+ server->session_reconnect = TRUE;
signal_emit("session restore server", 2, server, node);
+
+ proto->server_connect(server);
}
}
diff --git a/src/irc/core/irc-core.c b/src/irc/core/irc-core.c
index 9d441f09..5386f372 100644
--- a/src/irc/core/irc-core.c
+++ b/src/irc/core/irc-core.c
@@ -91,8 +91,8 @@ void irc_core_init(void)
rec->create_server_connect = create_server_connect;
rec->destroy_server_connect = destroy_server_connect;
- rec->server_connect = (SERVER_REC *(*) (SERVER_CONNECT_REC *))
- irc_server_connect;
+ rec->server_init_connect = irc_server_init_connect;
+ rec->server_connect = irc_server_connect;
rec->channel_create =
(CHANNEL_REC *(*) (SERVER_REC *, const char *,
const char *, int))
diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c
index e294f9fc..5e5dba55 100644
--- a/src/irc/core/irc-servers.c
+++ b/src/irc/core/irc-servers.c
@@ -150,8 +150,9 @@ static void server_init(IRC_SERVER_REC *server)
server->cmdcount = 0;
}
-IRC_SERVER_REC *irc_server_connect(IRC_SERVER_CONNECT_REC *conn)
+SERVER_REC *irc_server_init_connect(SERVER_CONNECT_REC *conn)
{
+ IRC_SERVER_CONNECT_REC *ircconn;
IRC_SERVER_REC *server;
g_return_val_if_fail(IS_IRC_SERVER_CONNECT(conn), NULL);
@@ -161,34 +162,39 @@ IRC_SERVER_REC *irc_server_connect(IRC_SERVER_CONNECT_REC *conn)
server = g_new0(IRC_SERVER_REC, 1);
server->chat_type = IRC_PROTOCOL;
- server->connrec = conn;
- server_connect_ref(SERVER_CONNECT(conn));
+ ircconn = (IRC_SERVER_CONNECT_REC *) conn;
+ server->connrec = ircconn;
+ server_connect_ref(conn);
if (server->connrec->port <= 0)
server->connrec->port = 6667;
- server->cmd_queue_speed = conn->cmd_queue_speed > 0 ?
- conn->cmd_queue_speed : settings_get_int("cmd_queue_speed");
- server->max_cmds_at_once = conn->max_cmds_at_once > 0 ?
- conn->max_cmds_at_once : settings_get_int("cmds_max_at_once");
- server->max_query_chans = conn->max_query_chans > 0 ?
- conn->max_query_chans : DEFAULT_MAX_QUERY_CHANS;
-
- server->max_kicks_in_cmd = conn->max_kicks > 0 ?
- conn->max_kicks : DEFAULT_MAX_KICKS;
- server->max_modes_in_cmd = conn->max_modes > 0 ?
- conn->max_modes : DEFAULT_MAX_MODES;
- server->max_whois_in_cmd = conn->max_whois > 0 ?
- conn->max_whois : DEFAULT_MAX_WHOIS;
- server->max_msgs_in_cmd = conn->max_msgs > 0 ?
- conn->max_msgs : DEFAULT_MAX_MSGS;
-
- if (!server_start_connect((SERVER_REC *) server)) {
- server_connect_unref(SERVER_CONNECT(conn));
+ server->cmd_queue_speed = ircconn->cmd_queue_speed > 0 ?
+ ircconn->cmd_queue_speed : settings_get_int("cmd_queue_speed");
+ server->max_cmds_at_once = ircconn->max_cmds_at_once > 0 ?
+ ircconn->max_cmds_at_once : settings_get_int("cmds_max_at_once");
+ server->max_query_chans = ircconn->max_query_chans > 0 ?
+ ircconn->max_query_chans : DEFAULT_MAX_QUERY_CHANS;
+
+ server->max_kicks_in_cmd = ircconn->max_kicks > 0 ?
+ ircconn->max_kicks : DEFAULT_MAX_KICKS;
+ server->max_modes_in_cmd = ircconn->max_modes > 0 ?
+ ircconn->max_modes : DEFAULT_MAX_MODES;
+ server->max_whois_in_cmd = ircconn->max_whois > 0 ?
+ ircconn->max_whois : DEFAULT_MAX_WHOIS;
+ server->max_msgs_in_cmd = ircconn->max_msgs > 0 ?
+ ircconn->max_msgs : DEFAULT_MAX_MSGS;
+
+ server_connect_init((SERVER_REC *) server);
+ return (SERVER_REC *) server;
+}
+
+void irc_server_connect(SERVER_REC *server)
+{
+ if (!server_start_connect(server)) {
+ server_connect_unref(server->connrec);
g_free(server);
- return NULL;
}
- return server;
}
/* Returns TRUE if `command' is sent to `target' */
diff --git a/src/irc/core/irc-servers.h b/src/irc/core/irc-servers.h
index f6ee1821..ce6da564 100644
--- a/src/irc/core/irc-servers.h
+++ b/src/irc/core/irc-servers.h
@@ -97,7 +97,8 @@ struct _IRC_SERVER_REC {
void *chanqueries;
};
-IRC_SERVER_REC *irc_server_connect(IRC_SERVER_CONNECT_REC *conn);
+SERVER_REC *irc_server_init_connect(SERVER_CONNECT_REC *conn);
+void irc_server_connect(SERVER_REC *server);
/* Purge server output, either all or for specified target */
void irc_server_purge_output(IRC_SERVER_REC *server, const char *target);
diff --git a/src/perl/irc/Server.xs b/src/perl/irc/Server.xs
index 85b13f80..bcab6f49 100644
--- a/src/perl/irc/Server.xs
+++ b/src/perl/irc/Server.xs
@@ -129,9 +129,3 @@ CODE:
RETVAL = (char *) server_redirect_peek_signal(server, event, args, &redirection);
OUTPUT:
RETVAL
-
-MODULE = Irssi::Irc::Server PACKAGE = Irssi::Irc::Connect PREFIX = irc_server_
-
-Irssi::Irc::Server
-irc_server_connect(conn)
- Irssi::Irc::Connect conn