summaryrefslogtreecommitdiff
path: root/src/servers.c
diff options
context:
space:
mode:
authorgeniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-04-04 14:16:25 +0000
committergeniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-04-04 14:16:25 +0000
commitd31359dcdc37be9797e50cdf1a6850c1f5ef0119 (patch)
tree6bb0449df10a73d77b1200d824024a4cd4560547 /src/servers.c
parentb738b7d6bc550ebdfb2e5b7068afa54dc6e1f9f7 (diff)
BUILD : 1.7.8 (655) BUGS : NOTES : We need to update the sync-state for leaf servers as well, or strange things will happen...
git-svn-id: svn://svn.anope.org/anope/trunk@655 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@503 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/servers.c')
-rw-r--r--src/servers.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/servers.c b/src/servers.c
index eb91f1226..9fb63c734 100644
--- a/src/servers.c
+++ b/src/servers.c
@@ -550,4 +550,54 @@ int is_sync(Server * server)
return 0;
}
+/*************************************************************************/
+
+/* Finish the syncing process for this server and (optionally) for all
+ * it's leaves as well
+ * @param serv Server to finish syncing
+ * @param sync_links Should all leaves be synced as well? (1: yes, 0: no)
+ * @return void
+ */
+void finish_sync(Server * serv, int sync_links)
+{
+ Server *s;
+
+ if (!serv || is_sync(serv))
+ return;
+
+ /* Mark each server as in sync */
+ s = serv;
+ do {
+ if (!is_sync(s)) {
+ if (debug)
+ alog("Finishing sync for server %s", s->name);
+
+ s->sync = SSYNC_DONE;
+ }
+
+ if (!sync_links)
+ break;
+
+ if (s->links) {
+ s = s->links;
+ } else if (s->next) {
+ s = s->next;
+ } else {
+ do {
+ s = s->uplink;
+ if (s == serv)
+ s = NULL;
+ if (s == me_server)
+ s = NULL;
+ } while (s && !(s->next));
+ if (s)
+ s = s->next;
+ }
+ } while (s);
+
+ /* Do some general stuff which should only be done once */
+ restore_unsynced_topics();
+ alog("Server %s is done syncing", serv->name);
+}
+
/* EOF */