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:
@@ -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
@@ -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))
|
||||
|
||||
@@ -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,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);
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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*"),
|
||||
|
||||
@@ -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;
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user