diff options
| author | geniusdex 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 |
|---|---|---|
| committer | geniusdex 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 |
| commit | d31359dcdc37be9797e50cdf1a6850c1f5ef0119 (patch) | |
| tree | 6bb0449df10a73d77b1200d824024a4cd4560547 /src/servers.c | |
| parent | b738b7d6bc550ebdfb2e5b7068afa54dc6e1f9f7 (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.c | 50 |
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 */ |
