#! /bin/sh /usr/share/dpatch/dpatch-run ## 31_fix_check_ntp_time.dpatch by Marc GariƩpy ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' nagios-plugins-1.4.11~/plugins/check_ntp_time.c nagios-plugins-1.4.11/plugins/check_ntp_time.c --- nagios-plugins-1.4.11~/plugins/check_ntp_time.c 2007-12-11 00:57:35.000000000 -0500 +++ nagios-plugins-1.4.11/plugins/check_ntp_time.c 2012-06-05 13:06:57.479782090 -0400 @@ -247,50 +247,52 @@ * this is done by filtering servers based on stratum, dispersion, and * finally round-trip delay. */ int best_offset_server(const ntp_server_results *slist, int nservers){ - int i=0, j=0, cserver=0, candidates[5], csize=0; + int i=0, cserver=0, best_server=-1; /* for each server */ for(cserver=0; cserveri; j--){ - candidates[j]=candidates[j-1]; + /* compare the server to the best one we've seen so far */ + /* does it have an equal or better stratum? */ + DBG(printf("comparing peer %d with peer %d\n", cserver, best_server)); + if(slist[cserver].stratum <= slist[best_server].stratum){ + DBG(printf("stratum for peer %d <= peer %d\n", cserver, best_server)); + /* does it have an equal or better dispersion? */ + if(slist[cserver].rtdisp <= slist[best_server].rtdisp){ + DBG(printf("dispersion for peer %d <= peer %d\n", cserver, best_server)); + /* does it have a better rtdelay? */ + if(slist[cserver].rtdelay < slist[best_server].rtdelay){ + DBG(printf("rtdelay for peer %d < peer %d\n", cserver, best_server)); + best_server = cserver; + DBG(printf("peer %d is now our best candidate\n", best_server)); + } } } - /* regardless, if they should be on the list... */ - if(i<5) { - candidates[i]=cserver; - if(csize<5) csize++; - /* otherwise discard the server */ - } else { - DBG(printf("discarding peer id %d\n", cserver)); - } } - if(csize>0) { - DBG(printf("best server selected: peer %d\n", candidates[0])); - return candidates[0]; + if(best_server >= 0) { + DBG(printf("best server selected: peer %d\n", best_server)); + return best_server; } else { DBG(printf("no peers meeting synchronization criteria :(\n")); return -1;