System: ntp version 3.4 Patch #: 10 Priority: From: Description: In the Makefile, remove references to the readclock.c module. New clockhopper supression code. Fix minor problem in ntp.c to get sin_family set in the proper place. Specify default file for drift value and more peer flag definitions to reflect various stages of clock selection critera. Add code to count number of peer switches and inhibited peer switches. Clock selection code has been updated to reflect 21 April 1989 draft of NTP spec. Add code to save the value of the drift compensation register to a file every hour. Add additional configuration file directives which can specify the same information as on the command line. ntpdc now will display addional peer flags which indicate how far through the clock selection process a peer was considered. Repeat-By: Fix: From rn, say "| patch -p -N -d DIR", where DIR is your ntp source directory. Outside of rn, say "cd DIR; patch -p -N #define PATCHLEVEL 10 Index: Makefile *** Makefile.old Wed May 3 15:17:41 1989 --- Makefile Wed May 3 15:17:44 1989 *************** *** 1,6 **** ! # $Source: /usr/users/louie/ntp/RCS/Makefile,v $ $Revision: 3.4.1.5 $ $Date: 89/04/10 15:54:19 $ # # $Log: Makefile,v $ # Revision 3.4.1.5 89/04/10 15:54:19 louie # Add dependency for ntpd.o on ntp.h so things sorta work even without doing a # "make depend". Trash "ci" rule. --- 1,9 ---- ! # $Source: /usr/users/louie/ntp/RCS/Makefile,v $ $Revision: 3.4.1.6 $ $Date: 89/05/03 15:08:06 $ # # $Log: Makefile,v $ + # Revision 3.4.1.6 89/05/03 15:08:06 louie + # In the Makefile, remove references to the readclock.c module. + # # Revision 3.4.1.5 89/04/10 15:54:19 louie # Add dependency for ntpd.o on ntp.h so things sorta work even without doing a # "make depend". Trash "ci" rule. *************** *** 106,121 **** # Source files # SRCS= ntp.c ntpd.c ntpdc.c ntpsubs.c ntp_proto.c ntp_sock.c ntp_adjust.c ! NTPDSRC= ntpd.c ntpsubs.c ntp_proto.c ntp_sock.c ntp_adjust.c readclock.c # Object files # OBJS= ntp.o ntpd.o ntpdc.o ntpsubs.o ntp_proto.o ntp_sock.o ntp_adjust.o NTPDOBJ= ntpd.o ntpsubs.o ntp_proto.o ntp_sock.o ntp_adjust.o - # - # if using REFCLOCK - # - #NTPDOBJ= ntpd.o ntpsubs.o ntp_proto.o ntp_sock.o ntp_adjust.o readclock.o DIST= README Makefile man ${SRCS} ${HDRS} ntp.conf test.c extract.pl stat.pl PROGS= ntp ntpd ntpdc ntest --- 109,120 ---- # Source files # SRCS= ntp.c ntpd.c ntpdc.c ntpsubs.c ntp_proto.c ntp_sock.c ntp_adjust.c ! NTPDSRC= ntpd.c ntpsubs.c ntp_proto.c ntp_sock.c ntp_adjust.c # Object files # OBJS= ntp.o ntpd.o ntpdc.o ntpsubs.o ntp_proto.o ntp_sock.o ntp_adjust.o NTPDOBJ= ntpd.o ntpsubs.o ntp_proto.o ntp_sock.o ntp_adjust.o DIST= README Makefile man ${SRCS} ${HDRS} ntp.conf test.c extract.pl stat.pl PROGS= ntp ntpd ntpdc ntest Index: README *** README.old Wed May 3 15:17:55 1989 --- README Wed May 3 15:17:58 1989 *************** *** 1,4 **** ! README for UNIX NTP release $Date: 89/04/08 10:35:44 $ $Revision: 3.4.1.4 $ --- 1,4 ---- ! README for UNIX NTP release $Date: 89/05/03 15:08:58 $ $Revision: 3.4.1.5 $ *************** *** 48,53 **** --- 48,68 ---- 7) Fire up ntpd in /etc/rc.local History: + 5/3/89 + The changes to the ntp_proto.c module for clockhopper suppression have + been tweaked once more, ever so slightly to conform with the 21 April + 1989 draft of the NTP spec. We won't switch peers if the current + peer makes it into the final selection list, unless the first peer on + the selection list is of a higher stratum than the current peer. + + The ntpd.c/hourly() function now saves the value of the drift + compensation register to a file (/etc/ntp.drift by default). In fact, + the last 5 hourly samples are written to the file, as well as how + many hours the ntpd process has been running. Ntpd will also attempt + to intialize the value of the drift compensation register from this + file when it is started up. The hourly stats: log message has been + augmented to log additional information. + 4/8/89 Changes to the ntp_proto.c module to supress peer switching when the dispersion between the newly selected peer and the currently selected Index: ntp.c *** ntp.c.old Wed May 3 15:18:09 1989 --- ntp.c Wed May 3 15:18:11 1989 *************** *** 1,9 **** #ifndef lint ! static char *rcsid = "$Source: /usr/users/louie/ntp/RCS/ntp.c,v $ $Revision: 3.4.1.4 $ $Date: 89/04/07 18:04:49 $"; #endif lint /* * $Log: ntp.c,v $ * Revision 3.4.1.4 89/04/07 18:04:49 louie * Removed unused variables from ntp.c program. * --- 1,12 ---- #ifndef lint ! static char *rcsid = "$Source: /usr/users/louie/ntp/RCS/ntp.c,v $ $Revision: 3.4.1.5 $ $Date: 89/05/03 15:09:53 $"; #endif lint /* * $Log: ntp.c,v $ + * Revision 3.4.1.5 89/05/03 15:09:53 louie + * Fix minor problem in ntp.c to get sin_family set in the proper place. + * * Revision 3.4.1.4 89/04/07 18:04:49 louie * Removed unused variables from ntp.c program. * *************** *** 147,152 **** --- 150,156 ---- } else dst.sin_port = sp->s_port; + dst.sin_family = AF_INET; while ((n = getopt(argc, argv, "vsf")) != EOF) { switch (n) { case 'v': *************** *** 165,172 **** if (argv[host] == NULL) continue; - dst.sin_family = AF_INET; - dst.sin_port = sp->s_port; hp = NULL; HostAddr = inet_addr(argv[host]); --- 169,174 ---- Index: ntp.h *** ntp.h.old Wed May 3 15:18:22 1989 --- ntp.h Wed May 3 15:18:26 1989 *************** *** 1,7 **** ! /* $Source: /usr/users/louie/ntp/RCS/ntp.h,v $ $Revision: 3.4.1.5 $ $Date: 89/04/10 15:55:42 $ */ /* * $Log: ntp.h,v $ * Revision 3.4.1.5 89/04/10 15:55:42 louie * Provide default value for number of bits/byte if not defined. Compute the * Window shift mask inside of conditional code on XTAL so we get the correct --- 1,11 ---- ! /* $Source: /usr/users/louie/ntp/RCS/ntp.h,v $ $Revision: 3.4.1.6 $ $Date: 89/05/03 15:11:06 $ */ /* * $Log: ntp.h,v $ + * Revision 3.4.1.6 89/05/03 15:11:06 louie + * Specify default file for drift value and more peer flag definitions to + * reflect various stages of clock selection critera. + * * Revision 3.4.1.5 89/04/10 15:55:42 louie * Provide default value for number of bits/byte if not defined. Compute the * Window shift mask inside of conditional code on XTAL so we get the correct *************** *** 108,113 **** --- 112,120 ---- #ifndef NTPINITFILE #define NTPINITFILE "/etc/ntp.conf" #endif + #ifndef NTPDRIFTCOMP + #define NTPDRIFTCOMP "/etc/ntp.drift" + #endif struct list { struct ntp_peer *head; *************** *** 286,291 **** --- 293,300 ---- int flags; /* local flags */ #define PEER_FL_CONFIG 1 #define PEER_FL_AUTHENABLE 2 + #define PEER_FL_SANE 0x0100 /* sane peer */ + #define PEER_FL_CANDIDATE 0x0200 /* candidate peer */ #define PEER_FL_SYNC 0x1000 /* peer can bet sync'd to */ #define PEER_FL_BCAST 0x2000 /* broadcast peer */ #define PEER_FL_SELECTED 0x8000 /* actually used by query routine */ Index: ntp_proto.c *** ntp_proto.c.old Wed May 3 15:18:48 1989 --- ntp_proto.c Wed May 3 15:18:56 1989 *************** *** 1,5 **** #ifndef lint ! static char *rcsid = "$Source: /usr/users/louie/ntp/RCS/ntp_proto.c,v $ $Revision: 3.4.1.8 $ $Date: 89/04/10 15:57:59 $"; #endif /* --- 1,5 ---- #ifndef lint ! static char *rcsid = "$Source: /usr/users/louie/ntp/RCS/ntp_proto.c,v $ $Revision: 3.4.1.9 $ $Date: 89/05/03 15:13:25 $"; #endif /* *************** *** 11,16 **** --- 11,20 ---- /* * $Log: ntp_proto.c,v $ + * Revision 3.4.1.9 89/05/03 15:13:25 louie + * Add code to count number of peer switches and inhibited peer switches. Clock + * selection code has been updated to reflect 21 April 1989 draft of NTP spec. + * * Revision 3.4.1.8 89/04/10 15:57:59 louie * New -l option for ntpd to enable logging for clock adjust messages. Changed * our idea of a bogus packet in the packet procedure to include a packet received *************** *** 118,123 **** --- 122,129 ---- #include "ntp.h" + int peer_switches, peer_sw_inhibited; + struct ntp_peer dummy_peer; extern double WayTooBig; extern unsigned long clock_watchdog; *************** *** 822,827 **** --- 828,834 ---- struct sel_lst { struct ntp_peer *peer; double distance; + double precision; } sel_lst[X_NTP_CANDIDATES]; int i, j, stratums, candidates; int sanity_check(); *************** *** 834,843 **** --- 841,852 ---- /* * Check if this is a candidate for "sys.peer" */ + peer->flags &= ~(PEER_FL_SANE | PEER_FL_CANDIDATE); if(sanity_check(peer)) { sel_lst[candidates].peer = peer; sel_lst[candidates].distance = peer->estdisp + s_fixed_to_double(&peer->dispersion); + peer->flags |= PEER_FL_SANE; candidates++; } peer = peer->next; *************** *** 944,949 **** --- 953,959 ---- } while (candidates > 1) { double maxdispersion = 0.0, dispersion, weight; + double min_precision_thres = 10e20, precision_thres; short worst = 0; /* shut up GNU CC about unused var */ #ifdef DEBUG if (debug > 3) *************** *** 954,959 **** --- 964,970 ---- rest of the candidates */ dispersion = 0.0; weight = 1.0; + sel_lst[i].peer->flags |= PEER_FL_CANDIDATE; for (j = 0; j < candidates; j++) { dtmp = sel_lst[j].peer->estoffset - sel_lst[i].peer->estoffset; *************** *** 965,983 **** /* since we just happen to have this double floating around.. */ sel_lst[i].distance = dispersion; if (dispersion >= maxdispersion) { maxdispersion = dispersion; worst = i; } #ifdef DEBUG if (debug > 4) { ! printf(" peer %s => disp %f\n", ntoa(sel_lst[i].peer->src.sin_addr), ! dispersion); } #endif } #ifdef DEBUG if (debug > 4) printf(" peer %s => TOSS\n", ntoa(sel_lst[worst].peer->src.sin_addr)); --- 976,1018 ---- /* since we just happen to have this double floating around.. */ sel_lst[i].distance = dispersion; + + precision_thres = NTP_MAXSKW + 1.0/(1<<-sys.precision); + if (peer->precision < 0 && + -peer->precision < sizeof(long)*NBBY) + precision_thres += 1.0/(1<<-peer->precision); + + sel_lst[i].precision = precision_thres; + if (dispersion >= maxdispersion) { maxdispersion = dispersion; worst = i; } + if (precision_thres < min_precision_thres) { + min_precision_thres = precision_thres; + } #ifdef DEBUG if (debug > 4) { ! printf(" peer %s => disp %f prec_th %f\n", ntoa(sel_lst[i].peer->src.sin_addr), ! dispersion, precision_thres); } #endif } + /* + * Now check to see if the max dispersion is greater than + * the min dispersion limit. If so, crank again, otherwise + * bail out. + */ + if (! (maxdispersion > min_precision_thres)) { #ifdef DEBUG + if (debug > 4) + printf(" %d left valid\n", candidates); + #endif + break; + } + + #ifdef DEBUG if (debug > 4) printf(" peer %s => TOSS\n", ntoa(sel_lst[worst].peer->src.sin_addr)); *************** *** 987,992 **** --- 1022,1028 ---- * and interate until there is only one candidate peer left. */ if (worst != candidates - 1) { + sel_lst[worst].peer->flags &= ~PEER_FL_CANDIDATE; for (i = worst, j = worst + 1; j < candidates; ) sel_lst[i++].peer = sel_lst[j++].peer; } *************** *** 997,1038 **** if (debug > 3) printf("select_clock: step6 %d candidates\n", candidates); #endif - if (sys.peer != NULL && sys.peer != sel_lst[0].peer) { - /* - * Potential peer is different that current one; don't switch - * to new peer unless the offset is suitably "large". - */ - if (sys.peer->stratum == sel_lst[0].peer->stratum) { - double threshold ; ! threshold = NTP_MAXSKW + ! 1.0/(unsigned long)(1L << -sys.precision); ! ! /* make sure we don't try to divide by zero */ ! if (-sel_lst[0].peer->precision < sizeof(long)*NBBY) ! threshold += 1.0/(unsigned long) ! (1L << -sel_lst[0].peer->precision); ! ! if (sel_lst[0].peer->estoffset < threshold) { ! #ifdef DEBUG ! if (debug > 2) ! printf("clock: inhibit peer switch\n"); ! #endif return; } ! } } ! #ifdef DEBUG ! if ((debug > 2) || (sys.peer != sel_lst[0].peer)) ! printf("clock: select peer %s stratum %d\n", ! ntoa(sel_lst[0].peer->src.sin_addr), ! sel_lst[0].peer->stratum); ! #endif ! ! /* ! * We've finally selected our best bet for a clock to synchronize to. */ if (sys.peer != sel_lst[0].peer) { if (sys.peer != NULL) syslog(LOG_INFO, "clock: select peer %s stratum %d was %s stratum %d", --- 1033,1072 ---- if (debug > 3) printf("select_clock: step6 %d candidates\n", candidates); #endif ! /* ! * Check to see if current peer is on the list of candidate peers. If ! * don't change sys.peer. Note that if the first selected clock is ! * at a higher stratum, don't even bother; we're going to want to ! * switch to it. ! */ ! if (sys.peer != NULL && ! (sys.peer->stratum > sel_lst[0].peer->stratum)) { ! for (i = 0; i < candidates; i++) { ! if (sys.peer == sel_lst[i].peer) { ! /* ! * The clock we're currently synchronized to ! * is among the candidate peers. Don't switch. ! */ ! if (i != 0) { ! /* ! * Count instances where the best ! * candidate is different from the ! * current clock, thus inhibiting ! * clockhopping. ! */ ! peer_sw_inhibited++; ! } return; } ! } } ! /* ! * The currently selected peer (if any) isn't on the candidate list. ! * Grab the first one and let it be. */ + if (sys.peer != sel_lst[0].peer) { if (sys.peer != NULL) syslog(LOG_INFO, "clock: select peer %s stratum %d was %s stratum %d", *************** *** 1043,1053 **** syslog(LOG_INFO, "clock: select peer %s stratum %d was UNSYNCED", ntoa(sel_lst[0].peer->src.sin_addr), sel_lst[0].peer->stratum); } - - - /* finally, set new peer */ - sys.peer = sel_lst[0].peer; } int --- 1077,1092 ---- syslog(LOG_INFO, "clock: select peer %s stratum %d was UNSYNCED", ntoa(sel_lst[0].peer->src.sin_addr), sel_lst[0].peer->stratum); + + #ifdef DEBUG + if (debug > 2) + printf("clock: select peer %s stratum %d of %d cand\n", + ntoa(sel_lst[0].peer->src.sin_addr), + sel_lst[0].peer->stratum, candidates); + #endif + sys.peer = sel_lst[0].peer; + peer_switches++; } } int Index: ntpd.c *** ntpd.c.old Wed May 3 15:19:23 1989 --- ntpd.c Wed May 3 15:19:31 1989 *************** *** 1,9 **** #ifndef lint ! static char *rcsid = "$Source: /usr/users/louie/ntp/RCS/ntpd.c,v $ $Revision: 3.4.1.7 $ $Date: 89/04/10 15:58:45 $"; #endif lint /* * $Log: ntpd.c,v $ * Revision 3.4.1.7 89/04/10 15:58:45 louie * Add -l option to enable logging of clock adjust messages. * --- 1,14 ---- #ifndef lint ! static char *rcsid = "$Source: /usr/users/louie/ntp/RCS/ntpd.c,v $ $Revision: 3.4.1.8 $ $Date: 89/05/03 15:16:17 $"; #endif lint /* * $Log: ntpd.c,v $ + * Revision 3.4.1.8 89/05/03 15:16:17 louie + * Add code to save the value of the drift compensation register to a file every + * hour. Add additional configuration file directives which can specify the same + * information as on the command line. + * * Revision 3.4.1.7 89/04/10 15:58:45 louie * Add -l option to enable logging of clock adjust messages. * *************** *** 115,120 **** --- 120,127 ---- char *prog_name; char *conf = NTPINITFILE; + char *driftcomp_file = NTPDRIFTCOMP; + static int drift_fd = -1; #ifdef DEBUG int debug = 0; *************** *** 275,286 **** setlogmask(LOG_UPTO(LOG_INFO)); #endif /* LOG_DAEMON */ ! syslog(LOG_NOTICE, "%s version $Revision: 3.4.1.7 $", prog_name); syslog(LOG_NOTICE, "patchlevel %d", PATCHLEVEL); #ifdef DEBUG if (debug) ! printf("%s version $Revision: 3.4.1.7 $ patchlevel %d\n", prog_name, PATCHLEVEL); #endif (void) setpriority(PRIO_PROCESS, 0, -10); --- 282,293 ---- setlogmask(LOG_UPTO(LOG_INFO)); #endif /* LOG_DAEMON */ ! syslog(LOG_NOTICE, "%s version $Revision: 3.4.1.8 $", prog_name); syslog(LOG_NOTICE, "patchlevel %d", PATCHLEVEL); #ifdef DEBUG if (debug) ! printf("%s version $Revision: 3.4.1.8 $ patchlevel %d\n", prog_name, PATCHLEVEL); #endif (void) setpriority(PRIO_PROCESS, 0, -10); *************** *** 312,317 **** --- 319,331 ---- init_kern_vars(); init_logical_clock(); + /* + * Attempt to open for writing the file for storing the drift comp + * register. File must already exist for snapshots to be taken. + */ + if ((i = open(driftcomp_file, O_WRONLY|O_CREAT, 0644)) >= 0) { + drift_fd = i; + } (void) gettimeofday(&tv, (struct timezone *) 0); srand(tv.tv_sec); *************** *** 627,646 **** register struct ntp_peer *peer = peer_list.head, *next; #ifndef XADJTIME2 extern void adj_host_clock(); - #endif ! #ifdef REFCLOCK ! /* ! * I think that this is being done wrong. The reference clock ! * attached to this host should look like another peer. Then the ! * normal clock selection stuff will select the "right" one. ! */ ! if (sys.stratum == 1) ! adj_from_source(); ! else ! #endif /* REFCLOCK */ ! #ifndef XADJTIME2 ! adj_host_clock(); #endif /* * Count down sys.hold if necessary. --- 641,648 ---- register struct ntp_peer *peer = peer_list.head, *next; #ifndef XADJTIME2 extern void adj_host_clock(); ! adj_host_clock(); #endif /* * Count down sys.hold if necessary. *************** *** 720,725 **** --- 722,729 ---- int i; int debuglevel; int stagger = 0; + double j; + extern double drift_comp; bzero((char *) &sin, sizeof(sin)); fp = fopen(config, "r"); *************** *** 747,753 **** } else trusting = atoi(name); } ! } else if (strcmp(name, "debuglevel") == 0) { if (fscanf(fp, "%d", &debuglevel) != 1) error = TRUE; #ifdef DEBUG --- 751,785 ---- } else trusting = atoi(name); } ! } else if (strcmp(name, "logclock") == 0) { ! if (fscanf(fp, "%s", name) != 1) ! error = TRUE; ! else { ! if (*name == 'Y' || *name == 'y') { ! logstats = 1; ! } else if (*name == 'N' || *name == 'n') { ! logstats = 0; ! } else ! logstats = atoi(name); ! } ! } else if (strcmp(name, "driftfile") == 0) { ! if (fscanf(fp, "%s", name) != 1) ! error = TRUE; ! else { ! if (driftcomp_file = malloc(strlen(name)+1)) ! strcpy(driftcomp_file, name); ! } ! } else if (strcmp(name, "waytoobig") == 0 || ! strcmp(name, "setthreshold") == 0) { ! if (fscanf(fp, "%s", name) != 1) ! error = TRUE; ! else { ! if (strcmp(name, "any") == 0) ! WayTooBig = 10e15; ! else ! WayTooBig = atof(name); ! } ! } else if (strncmp(name, "debuglevel", 5) == 0) { if (fscanf(fp, "%d", &debuglevel) != 1) error = TRUE; #ifdef DEBUG *************** *** 754,771 **** else debug += debuglevel; #endif } else if (strcmp(name, "stratum") == 0) { ! if (fscanf(fp, "%d", &stratum) != 1) ! error = TRUE; ! else sys.stratum = (u_char) stratum; ! if (sys.stratum == 1) { ! if (fscanf(fp, "%4s", ref_clock) != 1) ! error = TRUE; ! else { ! ref_clock[4] = 0; ! (void) strncpy((char *) &sys.refid, ! ref_clock, 4); ! } ! } } else if (strcmp(name, "precision") == 0) { if (fscanf(fp, "%d", &precision) != 1) error = TRUE; --- 786,793 ---- else debug += debuglevel; #endif } else if (strcmp(name, "stratum") == 0) { ! fprintf(stderr, "Obsolete command 'stratum'\n"); ! error = TRUE; } else if (strcmp(name, "precision") == 0) { if (fscanf(fp, "%d", &precision) != 1) error = TRUE; *************** *** 775,780 **** --- 797,813 ---- if (fscanf(fp, "%d", &i) != 1) error = TRUE; else tickadj = i; + } else if (strcmp(name, "settickadj") == 0) { + if (fscanf(fp, "%s", name) != 1) + error = TRUE; + else { + if (*name == 'Y' || *name == 'y') { + dotickadj = 1; + } else if (*name == 'N' || *name == 'n') { + dotickadj = 0; + } else + dotickadj = atoi(name); + } #endif #ifdef NOSWAP } else if (strcmp(name, "noswap") == 0) { *************** *** 915,920 **** --- 948,969 ---- exit(1); } + /* + * Read saved drift compensation register value. + */ + if ((fp = fopen(driftcomp_file, "r")) != NULL) { + if (fscanf(fp, "%f", &j) == 1 && j > -1.0 && j < 1.0) { + drift_comp = j; + syslog(LOG_INFO, + "Drift compensation value initialized to %f", j); + } else { + fprintf(stderr, + "init_ntp: bad drift compensation value\n"); + syslog(LOG_ERR, + "init_ntp: bad drift compensation value\n"); + } + fclose(fp); + } } int kern_tickadj, kern_hz, kern_tick; *************** *** 1168,1183 **** hourly() { char buf[200]; register int p = 0; extern double drift_comp, compliance; ! (void) sprintf(buf, "stats: dc %f comp %f", drift_comp, compliance); if (sys.peer == NULL) strcat(buf, " UNSYNC"); else { p = strlen(buf); ! (void) sprintf(buf + p, " SYNC %s %d", ! ntoa(sys.peer->src.sin_addr), sys.peer->stratum); } syslog(LOG_INFO, buf); #ifdef DEBUG --- 1217,1239 ---- hourly() { char buf[200]; register int p = 0; + static double drifts[5] = { 0.0, 0.0, 0.0, 0.0, 0.0 }; + static int drift_count = 0; extern double drift_comp, compliance; + extern int peer_switches, peer_sw_inhibited; ! (void) sprintf(buf, "stats: dc %f comp %f peersw %d inh %d", ! drift_comp, compliance, peer_switches, ! peer_sw_inhibited); if (sys.peer == NULL) strcat(buf, " UNSYNC"); else { p = strlen(buf); ! (void) sprintf(buf + p, " off %f SYNC %s %d", ! sys.peer->estoffset, ! ntoa(sys.peer->src.sin_addr), ! sys.peer->stratum); } syslog(LOG_INFO, buf); #ifdef DEBUG *************** *** 1184,1189 **** --- 1240,1269 ---- if (debug) puts(buf); #endif + /* + * If the drift compensation snapshot file is open, then write + * the current value to it. Since there's only one block in the + * file, and no one else is reading it, we'll just keep the file + * open and write to it. + */ + if (drift_fd >= 0) { + drifts[drift_count % 5] = drift_comp; + /* works out to be 70 bytes */ + (void) sprintf(buf, + "%+12.10f %+12.10f %+12.10f %+12.10f %+12.10f %4d\n", + drifts[drift_count % 5], + drifts[(drift_count+4) % 5], + drifts[(drift_count+3) % 5], + drifts[(drift_count+2) % 5], + drifts[(drift_count+1) % 5], + drift_count + 1); + + (void) lseek(drift_fd, 0L, L_SET); + if (write(drift_fd, buf, strlen(buf)) < 0) { + syslog(LOG_ERR, "Error writing drift comp file: %m"); + } + drift_count++; + } } #if defined(DEBUG) && defined(SIGUSR1) && defined(SIGUSR2) Index: ntpdc.c *** ntpdc.c.old Wed May 3 15:19:48 1989 --- ntpdc.c Wed May 3 15:19:51 1989 *************** *** 1,9 **** #ifndef lint ! static char *RCSid = "$Source: /usr/users/louie/ntp/RCS/ntpdc.c,v $ $Revision: 3.4.1.5 $ $Date: 89/04/08 10:38:06 $"; #endif /* * $Log: ntpdc.c,v $ * Revision 3.4.1.5 89/04/08 10:38:06 louie * Minor cosmetic changes and removed dead debug code from ntpd.c * --- 1,13 ---- #ifndef lint ! static char *RCSid = "$Source: /usr/users/louie/ntp/RCS/ntpdc.c,v $ $Revision: 3.4.1.6 $ $Date: 89/05/03 15:17:27 $"; #endif /* * $Log: ntpdc.c,v $ + * Revision 3.4.1.6 89/05/03 15:17:27 louie + * ntpdc now will display addional peer flags which indicate how far through + * the clock selection process a peer was considered. + * * Revision 3.4.1.5 89/04/08 10:38:06 louie * Minor cosmetic changes and removed dead debug code from ntpd.c * *************** *** 287,292 **** --- 291,297 ---- double offset[PEER_SHIFT], delay[PEER_SHIFT], dsp,del,off; char c; char *cvthname(); + int flags; sin.sin_addr.s_addr = n->net_address; for (i = 0; i < PEER_SHIFT; i++) { *************** *** 297,305 **** del = (long) ntohl(n->estdelay); /* leave in milliseconds */ off = (long) ntohl(n->estoffset); /* leave in milliseconds */ c = ' '; ! if (ntohs(n->flags) & PEER_FL_CONFIG) c = '-'; /* mark pre-configured */ ! if (ntohs(n->flags) & PEER_FL_SELECTED) c = '*'; /* mark peer selection */ sin.sin_addr.s_addr = n->net_address; printf("%c%-15.15s ", c, cvthname(&sin)); --- 302,315 ---- del = (long) ntohl(n->estdelay); /* leave in milliseconds */ off = (long) ntohl(n->estoffset); /* leave in milliseconds */ c = ' '; ! flags = ntohs(n->flags); ! if (flags & PEER_FL_CONFIG) c = '-'; /* mark pre-configured */ ! if (flags & PEER_FL_SANE) ! c = '.'; /* passed sanity check */ ! if (flags & PEER_FL_CANDIDATE) ! c = '+'; /* made candidate list */ ! if (flags & PEER_FL_SELECTED) c = '*'; /* mark peer selection */ sin.sin_addr.s_addr = n->net_address; printf("%c%-15.15s ", c, cvthname(&sin)); .