1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-06 09:43:13 +02:00

core: add option -save in command /upgrade (closes #1630)

This commit is contained in:
Sébastien Helleu
2022-08-07 16:48:12 +02:00
parent d91cddc909
commit d068fe0de5
47 changed files with 2074 additions and 881 deletions
+2 -2
View File
@@ -534,7 +534,7 @@ irc_info_infolist_irc_server_cb (const void *pointer, void *data,
if (obj_pointer)
{
/* build list with only one server */
if (!irc_server_add_to_infolist (ptr_infolist, obj_pointer))
if (!irc_server_add_to_infolist (ptr_infolist, obj_pointer, 0))
{
weechat_infolist_free (ptr_infolist);
return NULL;
@@ -550,7 +550,7 @@ irc_info_infolist_irc_server_cb (const void *pointer, void *data,
if (!arguments || !arguments[0]
|| weechat_string_match (ptr_server->name, arguments, 0))
{
if (!irc_server_add_to_infolist (ptr_infolist, ptr_server))
if (!irc_server_add_to_infolist (ptr_infolist, ptr_server, 0))
{
weechat_infolist_free (ptr_infolist);
return NULL;
+157 -59
View File
@@ -3907,6 +3907,13 @@ irc_server_close_connection (struct t_irc_server *server)
{
int i;
/*
* IMPORTANT: if changes are made in this function or sub-functions called,
* please also update the function irc_server_add_to_infolist:
* when the flag force_disconnected_state is set to 1 we simulate
* a disconnected state for server in infolist (used on /upgrade -save)
*/
if (server->hook_timer_connection)
{
weechat_unhook (server->hook_timer_connection);
@@ -5402,6 +5409,13 @@ irc_server_disconnect (struct t_irc_server *server, int switch_address,
{
struct t_irc_channel *ptr_channel;
/*
* IMPORTANT: if changes are made in this function or sub-functions called,
* please also update the function irc_server_add_to_infolist:
* when the flag force_disconnected_state is set to 1 we simulate
* a disconnected state for server in infolist (used on /upgrade -save)
*/
if (server->is_connected)
{
/*
@@ -5477,7 +5491,9 @@ irc_server_disconnect (struct t_irc_server *server, int switch_address,
if (reconnect
&& IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTORECONNECT))
{
irc_server_reconnect_schedule (server);
}
else
{
server->reconnect_delay = 0;
@@ -6173,6 +6189,10 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
/*
* Adds a server in an infolist.
*
* If force_disconnected_state == 1, the infolist contains the server
* in a disconnected state (but the server is unchanged, still connected if it
* was).
*
* Returns:
* 1: OK
* 0: error
@@ -6180,9 +6200,13 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
int
irc_server_add_to_infolist (struct t_infolist *infolist,
struct t_irc_server *server)
struct t_irc_server *server,
int force_disconnected_state)
{
struct t_infolist_item *ptr_item;
int reconnect_delay, reconnect_start;
struct timeval lag_check_time;
time_t lag_next_check;
if (!infolist || !server)
return 0;
@@ -6327,40 +6351,138 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "fake_server", server->fake_server))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "index_current_address", server->index_current_address))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "current_address", server->current_address))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "current_ip", server->current_ip))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_port", server->current_port))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_retry", server->current_retry))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "sock", server->sock))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_connected", server->is_connected))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "ssl_connected", server->ssl_connected))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "disconnected", server->disconnected))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "unterminated_message", server->unterminated_message))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "nick", server->nick))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "nick_modes", server->nick_modes))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "host", server->host))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "checking_cap_ls", server->checking_cap_ls))
return 0;
if (!weechat_hashtable_add_to_infolist (server->cap_ls, ptr_item, "cap_ls"))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "checking_cap_list", server->checking_cap_list))
return 0;
if (!weechat_hashtable_add_to_infolist (server->cap_list, ptr_item, "cap_list"))
return 0;
if (server->is_connected && force_disconnected_state)
{
if (!weechat_infolist_new_var_integer (ptr_item, "index_current_address", 0))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "current_address", NULL))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "current_ip", NULL))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_port", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_retry", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "sock", -1))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_connected", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "ssl_connected", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "disconnected", 1))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "unterminated_message", NULL))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "monitor", 0))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "monitor_time", 0))
return 0;
reconnect_delay = IRC_SERVER_OPTION_INTEGER(
server,
IRC_SERVER_OPTION_AUTORECONNECT_DELAY);
reconnect_start = time (NULL) - reconnect_delay - 1;
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_delay", reconnect_delay))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "reconnect_start", reconnect_start))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "nick", NULL))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "nick_modes", NULL))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "host", NULL))
return 0;
/*
* note: these hashtables are NOT in the infolist when saving a
* disconnected state:
* - cap_ls
* - cap_list
*/
if (!weechat_infolist_new_var_integer (ptr_item, "checking_cap_ls", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "checking_cap_list", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_away", 0))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "away_message", NULL))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "away_time", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "lag", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "lag_displayed", -1))
return 0;
lag_check_time.tv_sec = 0;
lag_check_time.tv_usec = 0;
lag_next_check = time (NULL) +
weechat_config_integer (irc_config_network_lag_check);
if (!weechat_infolist_new_var_buffer (ptr_item, "lag_check_time", &lag_check_time, sizeof (lag_check_time)))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "lag_next_check", lag_next_check))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "lag_last_refresh", 0))
return 0;
}
else
{
if (!weechat_infolist_new_var_integer (ptr_item, "index_current_address", server->index_current_address))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "current_address", server->current_address))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "current_ip", server->current_ip))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_port", server->current_port))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "current_retry", server->current_retry))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "sock", server->sock))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_connected", server->is_connected))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "ssl_connected", server->ssl_connected))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "disconnected", server->disconnected))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "unterminated_message", server->unterminated_message))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "monitor", server->monitor))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "monitor_time", server->monitor_time))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_delay", server->reconnect_delay))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "reconnect_start", server->reconnect_start))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "nick", server->nick))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "nick_modes", server->nick_modes))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "host", server->host))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "checking_cap_ls", server->checking_cap_ls))
return 0;
if (!weechat_hashtable_add_to_infolist (server->cap_ls, ptr_item, "cap_ls"))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "checking_cap_list", server->checking_cap_list))
return 0;
if (!weechat_hashtable_add_to_infolist (server->cap_list, ptr_item, "cap_list"))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_away", server->is_away))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "away_message", server->away_message))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "away_time", server->away_time))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "lag", server->lag))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "lag_displayed", server->lag_displayed))
return 0;
if (!weechat_infolist_new_var_buffer (ptr_item, "lag_check_time", &(server->lag_check_time), sizeof (server->lag_check_time)))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "lag_next_check", server->lag_next_check))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "lag_last_refresh", server->lag_last_refresh))
return 0;
}
if (!weechat_infolist_new_var_string (ptr_item, "isupport", server->isupport))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "prefix_modes", server->prefix_modes))
@@ -6385,40 +6507,16 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "chanmodes", server->chanmodes))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "monitor", server->monitor))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "monitor_time", server->monitor_time))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "clienttagdeny", server->clienttagdeny))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "typing_allowed", server->typing_allowed))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_delay", server->reconnect_delay))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "reconnect_start", server->reconnect_start))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "command_time", server->command_time))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "reconnect_join", server->reconnect_join))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "disable_autojoin", server->disable_autojoin))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "is_away", server->is_away))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "away_message", server->away_message))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "away_time", server->away_time))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "lag", server->lag))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "lag_displayed", server->lag_displayed))
return 0;
if (!weechat_infolist_new_var_buffer (ptr_item, "lag_check_time", &(server->lag_check_time), sizeof (struct timeval)))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "lag_next_check", server->lag_next_check))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "lag_last_refresh", server->lag_last_refresh))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "last_user_message", server->last_user_message))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "last_away_check", server->last_away_check))
+2 -1
View File
@@ -424,7 +424,8 @@ 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);
struct t_irc_server *server,
int force_disconnected_state);
extern void irc_server_print_log ();
#endif /* WEECHAT_PLUGIN_IRC_SERVER_H */
+52 -47
View File
@@ -52,7 +52,8 @@ struct t_irc_modelist *irc_upgrade_current_modelist = NULL;
*/
int
irc_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
irc_upgrade_save_all_data (struct t_upgrade_file *upgrade_file,
int force_disconnected_state)
{
struct t_infolist *infolist;
struct t_irc_server *ptr_server;
@@ -73,7 +74,8 @@ irc_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!irc_server_add_to_infolist (infolist, ptr_server))
if (!irc_server_add_to_infolist (infolist, ptr_server,
force_disconnected_state))
{
weechat_infolist_free (infolist);
return 0;
@@ -105,64 +107,67 @@ irc_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
if (!rc)
return 0;
for (ptr_nick = ptr_channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
if (!force_disconnected_state)
{
/* save nick */
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!irc_nick_add_to_infolist (infolist, ptr_nick))
for (ptr_nick = ptr_channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
weechat_infolist_free (infolist);
return 0;
}
rc = weechat_upgrade_write_object (upgrade_file,
IRC_UPGRADE_TYPE_NICK,
infolist);
weechat_infolist_free (infolist);
if (!rc)
return 0;
}
for (ptr_modelist = ptr_channel->modelists; ptr_modelist;
ptr_modelist = ptr_modelist->next_modelist)
{
/* save modelist */
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!irc_modelist_add_to_infolist (infolist, ptr_modelist))
{
weechat_infolist_free (infolist);
return 0;
}
rc = weechat_upgrade_write_object (upgrade_file,
IRC_UPGRADE_TYPE_MODELIST,
infolist);
weechat_infolist_free (infolist);
if (!rc)
return 0;
for (ptr_item = ptr_modelist->items; ptr_item;
ptr_item = ptr_item->next_item)
{
/* save modelist item */
/* save nick */
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!irc_modelist_item_add_to_infolist (infolist, ptr_item))
if (!irc_nick_add_to_infolist (infolist, ptr_nick))
{
weechat_infolist_free (infolist);
return 0;
}
rc = weechat_upgrade_write_object (upgrade_file,
IRC_UPGRADE_TYPE_MODELIST_ITEM,
IRC_UPGRADE_TYPE_NICK,
infolist);
weechat_infolist_free (infolist);
if (!rc)
return 0;
}
for (ptr_modelist = ptr_channel->modelists; ptr_modelist;
ptr_modelist = ptr_modelist->next_modelist)
{
/* save modelist */
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!irc_modelist_add_to_infolist (infolist, ptr_modelist))
{
weechat_infolist_free (infolist);
return 0;
}
rc = weechat_upgrade_write_object (upgrade_file,
IRC_UPGRADE_TYPE_MODELIST,
infolist);
weechat_infolist_free (infolist);
if (!rc)
return 0;
for (ptr_item = ptr_modelist->items; ptr_item;
ptr_item = ptr_item->next_item)
{
/* save modelist item */
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!irc_modelist_item_add_to_infolist (infolist, ptr_item))
{
weechat_infolist_free (infolist);
return 0;
}
rc = weechat_upgrade_write_object (upgrade_file,
IRC_UPGRADE_TYPE_MODELIST_ITEM,
infolist);
weechat_infolist_free (infolist);
if (!rc)
return 0;
}
}
}
}
@@ -263,7 +268,7 @@ irc_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
*/
int
irc_upgrade_save ()
irc_upgrade_save (int force_disconnected_state)
{
int rc;
struct t_upgrade_file *upgrade_file;
@@ -273,7 +278,7 @@ irc_upgrade_save ()
if (!upgrade_file)
return 0;
rc = irc_upgrade_save_all_data (upgrade_file);
rc = irc_upgrade_save_all_data (upgrade_file, force_disconnected_state);
weechat_upgrade_close (upgrade_file);
+1 -1
View File
@@ -37,7 +37,7 @@ enum t_irc_upgrade_type
IRC_UPGRADE_TYPE_MODELIST_ITEM,
};
extern int irc_upgrade_save ();
extern int irc_upgrade_save (int force_disconnected_state);
extern int irc_upgrade_load ();
#endif /* WEECHAT_PLUGIN_IRC_UPGRADE_H */
+17 -3
View File
@@ -112,9 +112,21 @@ irc_signal_upgrade_cb (const void *pointer, void *data,
(void) signal;
(void) type_data;
/* only save session and continue? */
if (signal_data && (strcmp (signal_data, "save") == 0))
{
/*
* save session with a disconnected state in servers and a scheduled
* reconnection
*/
irc_upgrade_save (1);
return WEECHAT_RC_OK;
}
irc_signal_upgrade_received = 1;
quit = (signal_data && (strcmp (signal_data, "quit") == 0));
ssl_disconnected = 0;
for (ptr_server = irc_servers; ptr_server;
@@ -142,8 +154,10 @@ irc_signal_upgrade_cb (const void *pointer, void *data,
* after restart
*/
ptr_server->index_current_address = 0;
ptr_server->reconnect_delay = IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AUTORECONNECT_DELAY);
ptr_server->reconnect_start = time (NULL) - ptr_server->reconnect_delay - 1;
ptr_server->reconnect_delay = IRC_SERVER_OPTION_INTEGER(
ptr_server, IRC_SERVER_OPTION_AUTORECONNECT_DELAY);
ptr_server->reconnect_start = time (NULL) -
ptr_server->reconnect_delay - 1;
}
}
if (ssl_disconnected > 0)
@@ -293,7 +307,7 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
if (irc_signal_upgrade_received)
{
irc_config_write (1);
irc_upgrade_save ();
irc_upgrade_save (0);
}
else
{
+2 -1
View File
@@ -1228,7 +1228,8 @@ weechat_perl_signal_quit_upgrade_cb (const void *pointer, void *data,
(void) type_data;
(void) signal_data;
perl_quit_or_upgrade = 1;
if (!signal_data || (strcmp (signal_data, "save") != 0))
perl_quit_or_upgrade = 1;
return WEECHAT_RC_OK;
}
+16 -3
View File
@@ -1957,6 +1957,10 @@ relay_irc_free (struct t_relay_client *client)
/*
* Adds client IRC data in an infolist.
*
* If force_disconnected_state == 1, the infolist contains the client
* in a disconnected state (but the client is unchanged, still connected if it
* was).
*
* Returns:
* 1: OK
* 0: error
@@ -1964,11 +1968,22 @@ relay_irc_free (struct t_relay_client *client)
int
relay_irc_add_to_infolist (struct t_infolist_item *item,
struct t_relay_client *client)
struct t_relay_client *client,
int force_disconnected_state)
{
if (!item || !client)
return 0;
if (!RELAY_CLIENT_HAS_ENDED(client) && force_disconnected_state)
{
if (!weechat_infolist_new_var_integer (item, "connected", 0))
return 0;
}
else
{
if (!weechat_infolist_new_var_integer (item, "connected", RELAY_IRC_DATA(client, connected)))
return 0;
}
if (!weechat_infolist_new_var_string (item, "address", RELAY_IRC_DATA(client, address)))
return 0;
if (!weechat_infolist_new_var_integer (item, "password_ok", RELAY_IRC_DATA(client, password_ok)))
@@ -1981,8 +1996,6 @@ relay_irc_add_to_infolist (struct t_infolist_item *item,
return 0;
if (!weechat_infolist_new_var_integer (item, "cap_end_received", RELAY_IRC_DATA(client, cap_end_received)))
return 0;
if (!weechat_infolist_new_var_integer (item, "connected", RELAY_IRC_DATA(client, connected)))
return 0;
if (!weechat_infolist_new_var_integer (item, "server_capabilities", RELAY_IRC_DATA(client, server_capabilities)))
return 0;
if (!weechat_infolist_new_var_pointer (item, "hook_signal_irc_in2", RELAY_IRC_DATA(client, hook_signal_irc_in2)))
+2 -1
View File
@@ -73,7 +73,8 @@ extern void relay_irc_alloc_with_infolist (struct t_relay_client *client,
extern enum t_relay_status relay_irc_get_initial_status (struct t_relay_client *client);
extern void relay_irc_free (struct t_relay_client *client);
extern int relay_irc_add_to_infolist (struct t_infolist_item *item,
struct t_relay_client *client);
struct t_relay_client *client,
int force_disconnected_state);
extern void relay_irc_print_log (struct t_relay_client *client);
#endif /* WEECHAT_PLUGIN_RELAY_IRC_H */
+47 -15
View File
@@ -1610,6 +1610,13 @@ relay_client_set_status (struct t_relay_client *client,
{
struct t_relay_server *ptr_server;
/*
* IMPORTANT: if changes are made in this function or sub-functions called,
* please also update the function relay_client_add_to_infolist:
* when the flag force_disconnected_state is set to 1 we simulate
* a disconnected state for client in infolist (used on /upgrade -save)
*/
client->status = status;
if (client->status == RELAY_STATUS_CONNECTED)
@@ -1821,6 +1828,10 @@ relay_client_disconnect_all ()
/*
* Adds a client in an infolist.
*
* If force_disconnected_state == 1, the infolist contains the client
* in a disconnected state (but the client is unchanged, still connected if it
* was).
*
* Returns:
* 1: OK
* 0: error
@@ -1828,7 +1839,8 @@ relay_client_disconnect_all ()
int
relay_client_add_to_infolist (struct t_infolist *infolist,
struct t_relay_client *client)
struct t_relay_client *client,
int force_disconnected_state)
{
struct t_infolist_item *ptr_item;
char value[128];
@@ -1844,24 +1856,46 @@ relay_client_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "desc", client->desc))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "sock", client->sock))
return 0;
if (!RELAY_CLIENT_HAS_ENDED(client) && force_disconnected_state)
{
if (!weechat_infolist_new_var_integer (ptr_item, "sock", -1))
return 0;
if (!weechat_infolist_new_var_pointer (ptr_item, "hook_timer_handshake", NULL))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "gnutls_handshake_ok", 0))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "status", RELAY_STATUS_DISCONNECTED))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "end_time", time (NULL)))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "partial_message", NULL))
return 0;
}
else
{
if (!weechat_infolist_new_var_integer (ptr_item, "sock", client->sock))
return 0;
if (!weechat_infolist_new_var_pointer (ptr_item, "hook_timer_handshake", client->hook_timer_handshake))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "gnutls_handshake_ok", client->gnutls_handshake_ok))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "status", client->status))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "end_time", client->end_time))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "partial_message", client->partial_message))
return 0;
}
if (!weechat_infolist_new_var_integer (ptr_item, "server_port", client->server_port))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "ssl", client->ssl))
return 0;
if (!weechat_infolist_new_var_pointer (ptr_item, "hook_timer_handshake", client->hook_timer_handshake))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "gnutls_handshake_ok", client->gnutls_handshake_ok))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "websocket", client->websocket))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "address", client->address))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "real_ip", client->real_ip))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "status", client->status))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "status_string", relay_client_status_string[client->status]))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "protocol", client->protocol))
@@ -1882,8 +1916,6 @@ relay_client_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "start_time", client->start_time))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "end_time", client->end_time))
return 0;
if (!weechat_infolist_new_var_pointer (ptr_item, "hook_fd", client->hook_fd))
return 0;
if (!weechat_infolist_new_var_pointer (ptr_item, "hook_timer_send", client->hook_timer_send))
@@ -1900,16 +1932,16 @@ relay_client_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "send_data_type", client->send_data_type))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "partial_message", client->partial_message))
return 0;
switch (client->protocol)
{
case RELAY_PROTOCOL_WEECHAT:
relay_weechat_add_to_infolist (ptr_item, client);
relay_weechat_add_to_infolist (ptr_item, client,
force_disconnected_state);
break;
case RELAY_PROTOCOL_IRC:
relay_irc_add_to_infolist (ptr_item, client);
relay_irc_add_to_infolist (ptr_item, client,
force_disconnected_state);
break;
case RELAY_NUM_PROTOCOLS:
break;
+2 -1
View File
@@ -165,7 +165,8 @@ extern void relay_client_free_all ();
extern void relay_client_disconnect (struct t_relay_client *client);
extern void relay_client_disconnect_all ();
extern int relay_client_add_to_infolist (struct t_infolist *infolist,
struct t_relay_client *client);
struct t_relay_client *client,
int force_disconnected_state);
extern void relay_client_print_log ();
#endif /* WEECHAT_PLUGIN_RELAY_CLIENT_H */
+2 -2
View File
@@ -140,7 +140,7 @@ relay_info_infolist_relay_cb (const void *pointer, void *data,
if (obj_pointer)
{
/* build list with only one relay */
if (!relay_client_add_to_infolist (ptr_infolist, obj_pointer))
if (!relay_client_add_to_infolist (ptr_infolist, obj_pointer, 0))
{
weechat_infolist_free (ptr_infolist);
return NULL;
@@ -153,7 +153,7 @@ relay_info_infolist_relay_cb (const void *pointer, void *data,
for (ptr_client = relay_clients; ptr_client;
ptr_client = ptr_client->next_client)
{
if (!relay_client_add_to_infolist (ptr_infolist, ptr_client))
if (!relay_client_add_to_infolist (ptr_infolist, ptr_client, 0))
{
weechat_infolist_free (ptr_infolist);
return NULL;
+6 -4
View File
@@ -41,7 +41,8 @@
*/
int
relay_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
relay_upgrade_save_all_data (struct t_upgrade_file *upgrade_file,
int force_disconnected_state)
{
struct t_infolist *infolist;
struct t_relay_server *ptr_server;
@@ -76,7 +77,8 @@ relay_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
infolist = weechat_infolist_new ();
if (!infolist)
return 0;
if (!relay_client_add_to_infolist (infolist, ptr_client))
if (!relay_client_add_to_infolist (infolist, ptr_client,
force_disconnected_state))
{
weechat_infolist_free (infolist);
return 0;
@@ -121,7 +123,7 @@ relay_upgrade_save_all_data (struct t_upgrade_file *upgrade_file)
*/
int
relay_upgrade_save ()
relay_upgrade_save (int force_disconnected_state)
{
int rc;
struct t_upgrade_file *upgrade_file;
@@ -131,7 +133,7 @@ relay_upgrade_save ()
if (!upgrade_file)
return 0;
rc = relay_upgrade_save_all_data (upgrade_file);
rc = relay_upgrade_save_all_data (upgrade_file, force_disconnected_state);
weechat_upgrade_close (upgrade_file);
+1 -1
View File
@@ -31,7 +31,7 @@ enum t_relay_upgrade_type
RELAY_UPGRADE_TYPE_SERVER,
};
extern int relay_upgrade_save ();
extern int relay_upgrade_save (int force_disconnected_state);
extern int relay_upgrade_load ();
#endif /* WEECHAT_PLUGIN_RELAY_UPGRADE_H */
+11 -1
View File
@@ -96,6 +96,14 @@ relay_signal_upgrade_cb (const void *pointer, void *data,
(void) type_data;
(void) signal_data;
/* only save session and continue? */
if (signal_data && (strcmp (signal_data, "save") == 0))
{
/* save session with a disconnected state in clients */
relay_upgrade_save (1);
return WEECHAT_RC_OK;
}
relay_signal_upgrade_received = 1;
/* close socket for relay servers */
@@ -235,7 +243,9 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
relay_config_write ();
if (relay_signal_upgrade_received)
relay_upgrade_save ();
{
relay_upgrade_save (0);
}
else
{
relay_raw_message_free_all ();
+16 -1
View File
@@ -141,6 +141,13 @@ relay_weechat_recv (struct t_relay_client *client, const char *data)
void
relay_weechat_close_connection (struct t_relay_client *client)
{
/*
* IMPORTANT: if changes are made in this function or sub-functions called,
* please also update the function relay_weechat_add_to_infolist:
* when the flag force_disconnected_state is set to 1 we simulate
* a disconnected state for client in infolist (used on /upgrade -save)
*/
relay_weechat_unhook_signals (client);
}
@@ -319,6 +326,10 @@ relay_weechat_free (struct t_relay_client *client)
/*
* Adds client WeeChat data in an infolist.
*
* If force_disconnected_state == 1, the infolist contains the client
* in a disconnected state (but the client is unchanged, still connected if it
* was).
*
* Returns:
* 1: OK
* 0: error
@@ -326,11 +337,15 @@ relay_weechat_free (struct t_relay_client *client)
int
relay_weechat_add_to_infolist (struct t_infolist_item *item,
struct t_relay_client *client)
struct t_relay_client *client,
int force_disconnected_state)
{
if (!item || !client)
return 0;
/* parameter not used today, it may be in future */
(void) force_disconnected_state;
if (!weechat_infolist_new_var_integer (item, "handshake_done", RELAY_WEECHAT_DATA(client, handshake_done)))
return 0;
if (!weechat_infolist_new_var_integer (item, "password_ok", RELAY_WEECHAT_DATA(client, password_ok)))
+2 -1
View File
@@ -76,7 +76,8 @@ extern void relay_weechat_alloc_with_infolist (struct t_relay_client *client,
extern enum t_relay_status relay_weechat_get_initial_status (struct t_relay_client *client);
extern void relay_weechat_free (struct t_relay_client *client);
extern int relay_weechat_add_to_infolist (struct t_infolist_item *item,
struct t_relay_client *client);
struct t_relay_client *client,
int force_disconnected_state);
extern void relay_weechat_print_log (struct t_relay_client *client);
#endif /* WEECHAT_PLUGIN_RELAY_WEECHAT_H */
+3
View File
@@ -1267,6 +1267,9 @@ trigger_command_init ()
"\"${info:term_width} >= 100\" \"\" \"/bar show nicklist\"\n"
" silently save config each hour:\n"
" /trigger add cfgsave timer 3600000;0;0 \"\" \"\" \"/mute /save\"\n"
" silently save WeeChat session at midnight (see /help upgrade):\n"
" /trigger add session_save signal day_changed \"\" \"\" "
"\"/mute /upgrade -save\"\n"
" open trigger monitor and show only modifiers and triggers whose "
"name starts with \"resize\":\n"
" /trigger monitor @modifier,resize*"),
+7
View File
@@ -128,6 +128,13 @@ xfer_signal_upgrade_cb (const void *pointer, void *data,
(void) signal;
(void) type_data;
/* only save session and continue? */
if (signal_data && (strcmp (signal_data, "save") == 0))
{
xfer_upgrade_save ();
return WEECHAT_RC_OK;
}
xfer_signal_upgrade_received = 1;
/*