summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/session.c59
-rw-r--r--src/core/session.h1
-rw-r--r--src/fe-text/irssi.c4
3 files changed, 33 insertions, 31 deletions
diff --git a/src/core/session.c b/src/core/session.c
index 217b44f8..9cc9a14c 100644
--- a/src/core/session.c
+++ b/src/core/session.c
@@ -33,6 +33,8 @@
static char *session_file;
static char *irssi_binary;
+static char **session_args;
+
void session_set_binary(const char *path)
{
char **paths, **tmp;
@@ -70,13 +72,21 @@ void session_set_binary(const char *path)
g_strfreev(paths);
}
+void session_upgrade(void)
+{
+ if (session_args == NULL)
+ return;
+
+ execvp(session_args[0], session_args);
+ fprintf(stderr, "exec failed: %s: %s\n",
+ session_args[0], g_strerror(errno));
+}
+
/* SYNTAX: UPGRADE [<irssi binary path>] */
static void cmd_upgrade(const char *data)
{
CONFIG_REC *session;
- GSList *file_handles;
- char *session_file, *str, **args;
- int i;
+ char *session_file, *str;
if (*data == '\0')
data = irssi_binary;
@@ -88,32 +98,18 @@ static void cmd_upgrade(const char *data)
session = config_open(session_file, 0600);
unlink(session_file);
- file_handles = NULL;
- signal_emit("session save", 2, session, &file_handles);
+ signal_emit("session save", 1, session);
config_write(session, NULL, -1);
config_close(session);
- /* Cleanup the terminal etc. */
- signal_emit("session clean", 0);
-
- /* close the file handles we don't want to transfer to new client */
- for (i = 3; i < 256; i++) {
- if (g_slist_find(file_handles, GINT_TO_POINTER(i)) == NULL)
- close(i);
- }
- g_slist_free(file_handles),
-
/* irssi -! --session ~/.irssi/session
data may contain some other program as well, like
/UPGRADE /usr/bin/screen irssi */
str = g_strdup_printf("%s -! --session %s", data, session_file);
- args = g_strsplit(str, " ", -1);
+ session_args = g_strsplit(str, " ", -1);
g_free(str);
- execvp(args[0], (char **) args);
-
- fprintf(stderr, "exec: %s: %s\n", args[0], g_strerror(errno));
- _exit(-1);
+ signal_emit("gui exit", 0);
}
static void session_save_channel(CHANNEL_REC *channel, CONFIG_REC *config,
@@ -146,7 +142,7 @@ static void session_restore_channel(SERVER_REC *server, CONFIG_NODE *node)
}
static void session_save_server(SERVER_REC *server, CONFIG_REC *config,
- CONFIG_NODE *node, GSList **file_handles)
+ CONFIG_NODE *node)
{
GSList *tmp;
int handle;
@@ -162,16 +158,22 @@ static void session_save_server(SERVER_REC *server, CONFIG_REC *config,
config_node_set_str(config, node, "nick", server->nick);
handle = g_io_channel_unix_get_fd(net_sendbuffer_handle(server->handle));
- *file_handles = g_slist_append(*file_handles, GINT_TO_POINTER(handle));
config_node_set_int(config, node, "handle", handle);
- signal_emit("session save server", 4,
- server, config, node, file_handles);
+ signal_emit("session save server", 3, server, config, node);
/* save channels */
node = config_node_section(node, "channels", NODE_TYPE_LIST);
for (tmp = server->channels; tmp != NULL; tmp = tmp->next)
- session_save_channel(tmp->data, config, node);
+ session_save_channel(tmp->data, config, node);
+
+ /* fake the server disconnection */
+ g_io_channel_unref(net_sendbuffer_handle(server->handle));
+ net_sendbuffer_destroy(server->handle, FALSE);
+ server->handle = NULL;
+
+ server->connection_lost = TRUE;
+ server_disconnect(server);
}
static void session_restore_server(CONFIG_NODE *node)
@@ -218,14 +220,13 @@ static void session_restore_server(CONFIG_NODE *node)
}
}
-static void sig_session_save(CONFIG_REC *config, GSList **file_handles)
+static void sig_session_save(CONFIG_REC *config)
{
CONFIG_NODE *node;
- GSList *tmp;
node = config_node_traverse(config, "(servers", TRUE);
- for (tmp = servers; tmp != NULL; tmp = tmp->next)
- session_save_server(tmp->data, config, node, file_handles);
+ while (servers != NULL)
+ session_save_server(servers->data, config, node);
}
static void sig_session_restore(CONFIG_REC *config)
diff --git a/src/core/session.h b/src/core/session.h
index a0e789d1..5788b5f0 100644
--- a/src/core/session.h
+++ b/src/core/session.h
@@ -2,6 +2,7 @@
#define __SESSION_H
void session_set_binary(const char *path);
+void session_upgrade(void);
void session_init(void);
void session_deinit(void);
diff --git a/src/fe-text/irssi.c b/src/fe-text/irssi.c
index 39ae0ec6..6a7ae2c0 100644
--- a/src/fe-text/irssi.c
+++ b/src/fe-text/irssi.c
@@ -26,6 +26,7 @@
#include "levels.h"
#include "core.h"
#include "settings.h"
+#include "session.h"
#include "printtext.h"
#include "fe-common-core.h"
@@ -140,7 +141,6 @@ static void textui_init(void)
theme_register(gui_text_formats);
signal_add("gui exit", (SIGNAL_FUNC) sig_exit);
- signal_add("session clean", (SIGNAL_FUNC) term_deinit);
}
static void textui_finish_init(void)
@@ -197,7 +197,6 @@ static void textui_deinit(void)
dirty_check(); /* one last time to print any quit messages */
signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
- signal_remove("session clean", (SIGNAL_FUNC) term_deinit);
lastlog_deinit();
statusbar_deinit();
@@ -324,5 +323,6 @@ int main(int argc, char **argv)
g_main_destroy(main_loop);
textui_deinit();
+ session_upgrade(); /* if we /UPGRADEd, start the new process */
return 0;
}