1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-09 03:03:12 +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
{