📄 ntpd.c
字号:
static void timeout(n)int n;{ static int periodic = 0; register struct ntp_peer *peer;#ifndef XADJTIME2 extern void adj_host_clock(); adj_host_clock(n);#endif TRACE (7, ("timeout (%d)", n)); /* * Count down sys.hold if necessary. */ if (sys.hold) { if (sys.hold <= n) sys.hold = 0; else sys.hold -= n; } /* * If interval has expired blast off an NTP to that host. */ for (peer = peer_list.head; peer != NULL; peer = peer->next) {#ifdef DEBUG if (peer->next == NULL && peer != peer_list.tail) { advise (LLOG_EXCEPTIONS, NULLCP, "Broken peer list"); abort(); }#endif if (peer -> flags & PEER_FL_SNOOZE) continue; if (peer -> mode == PEERMODE_QUERY) continue; if (peer->reach != 0 || peer->hmode != MODE_SERVER) { peer->stopwatch += n; if (peer->timer <= peer->stopwatch) do_peer (peer); } } periodic += n; if (periodic >= 60*60) { periodic = 0; hourly(); } clock_watchdog += n; if (clock_watchdog >= NTP_MAXAGE) { /* woof, woof - barking dogs bite! */ sys.leap = ALARM; if (clock_watchdog < NTP_MAXAGE + n) { advise (LLOG_EXCEPTIONS, NULLCP, "logical clock adjust timeout (%d seconds)", NTP_MAXAGE); } }#ifdef DEBUG if (debug) (void) fflush(stdout);#endif}static void do_peer (peer)struct ntp_peer *peer;{ if (peer -> flags & PEER_FL_SNOOZE) return; peer->stopwatch = 0; if (peer->flags & PEER_FL_CONREQ) { switch (peer -> flags & PEER_FL_CONNSTATE) { case 0: peer -> timer = 1 << (MAX(MIN((int)peer->ppoll, MIN((int)peer->hpoll, NTP_MAXPOLL)), NTP_MINPOLL)); if (peer->backoff == 0) peer -> backoff = BACKOFF_COUNT; else { if (peer -> backoff == 1) poll_update (peer, (int)peer->hpoll +1); peer -> backoff --; } if (make_osi_conn (peer, osiaddress) == NOTOK) return; break; case PEER_FL_CONNECTED: break; case PEER_FL_CONINP1: case PEER_FL_CONINP2: return; default: advise (LLOG_EXCEPTIONS, NULLCP, "Bad state flags %d", peer -> flags & PEER_FL_CONNSTATE); return; } } transmit (peer);}/* * init_ntp() reads NTP daemon configuration information from disk file. */int precision;static void init_ntp(config)char *config;{ struct Naddr addr; char buffer[BUFSIZ]; FILE *fp; double j; int argc;#define MAXARGS 10 char *argv[MAXARGS]; extern double drift_comp; bzero((char *) &addr, sizeof(addr)); fp = fopen(config, "r"); if (fp == NULL) adios (config, "Problem opening NTP initialization file"); while (fgets (buffer, sizeof buffer, fp)) { /* read line and parse */ if (buffer[0] == '#' || buffer[0] == '\n') continue; if ((argc = sstr2arg (buffer, MAXARGS, argv, " \t\n")) <= 0) continue; if (config_line (argv, argc) != OK) TRACE (1, ("Ignoring line %s ...", argv[0])); } /* * Read saved drift compensation register value. */ if ((fp = fopen(driftcomp_file, "r")) != NULL) { if (fscanf(fp, "%lf", &j) == 1 && j > -1.0 && j < 1.0) { drift_comp = j; advise (LLOG_NOTICE, NULLCP, "Drift compensation value initialized to %f", j); } else { advise (LLOG_EXCEPTIONS, NULLCP, "init_ntp: bad drift compensation value"); } (void) fclose(fp); }}#include "cmd_srch.h"CMD_TABLE config_tbl[] = {#define TBL_MAXPEERS 1 "maxpeers", TBL_MAXPEERS,#define TBL_TRUSTING 2 "trusting", TBL_TRUSTING,#define TBL_OSILISTEN 3 "osilisten", TBL_OSILISTEN,#define TBL_LOGCLOCK 4 "logclock", TBL_LOGCLOCK,#define TBL_DRIFTFILE 5 "driftfile", TBL_DRIFTFILE,#define TBL_WAYTOOBIG 6 "waytoobig", TBL_WAYTOOBIG, "setthreshold", TBL_WAYTOOBIG,#define TBL_DEBUGLEVEL 7 "debuglevel", TBL_DEBUGLEVEL,#define TBL_TICKADJ 8 "tickadj", TBL_TICKADJ,#define TBL_SETTICKADJ 9 "settickadj", TBL_SETTICKADJ,#define TBL_NOSWAP 10 "noswap", TBL_NOSWAP,#define TBL_BROADCAST 11 "broadcast", TBL_BROADCAST,#define TBL_PEER 12 "peer", TBL_PEER,#define TBL_PASSIVE 13 "passive", TBL_PASSIVE,#define TBL_SERVER 14 "server", TBL_SERVER,#define TBL_REFCLOCK 15 "refclock", TBL_REFCLOCK,#define TBL_STRATUM 16 "stratum", TBL_STRATUM,#define TBL_PRECISION 17 "precision", TBL_PRECISION,#define TBL_LOGFILE 18 "logfile", TBL_LOGFILE,#define TBL_PRIORITY 19 "priority", TBL_PRIORITY,#define TBL_KEEPALLPEERS 20 "keepallpeers", TBL_KEEPALLPEERS, "", -1};config_line (argv, argc)char *argv[];int argc;{ int result; struct Naddr addr; int i; struct ntp_peer *peer; switch (result = cmd_srch (argv[0], config_tbl)) { case TBL_PRIORITY: if (argc > 1) priority = atoi (argv[1]); else return NOTOK; break; case TBL_MAXPEERS: if (argc > 1) sys.maxpeers = atoi (argv[1]); else return NOTOK; break; case TBL_TRUSTING: if (argc < 2) return NOTOK; trusting = ynorint (argv[1]); break; case TBL_OSILISTEN: if (argc < 2) return NOTOK; osiaddress = strdup (argv[1]); break; case TBL_LOGCLOCK: if (argc < 2) return NOTOK; logstats = ynorint (argv[1]); break; case TBL_LOGFILE: if (argc < 2) return NOTOK; pgm_log -> ll_file = strdup (argv[1]); break; case TBL_DRIFTFILE: if (argc < 2) return NOTOK; driftcomp_file = strdup (argv[1]); break; case TBL_WAYTOOBIG: if (argc < 2) return NOTOK; if (lexequ (argv[1], "any") == 0) WayTooBig = 10e15; else WayTooBig = atof (argv[1]); break; case TBL_DEBUGLEVEL: if (argc < 2) return NOTOK;#ifdef DEBUG debug += atoi (argv[1]);#endif break; case TBL_STRATUM: advise (LLOG_NOTICE, NULLCP, "Obsolete command 'stratum'"); break; case TBL_PRECISION: if (argc < 2) return NOTOK; sys.precision = atoi (argv[1]); break; case TBL_TICKADJ: if (argc < 2) return NOTOK;#ifdef SETTICKADJ tickadj = atoi (argv[1]);#endif break; case TBL_SETTICKADJ: if (argc < 2) return NOTOK;#ifdef SETTICKADJ dotickadj = ynorint (argv[1]);#endif break; case TBL_NOSWAP:#ifdef NOSWAP noswap = 1;#endif break; case TBL_BROADCAST: if (argc < 2) return NOTOK;#ifdef BROADCAST_NTP for (i = 0; i < nintf; i++) if (strcmp(addrs[i].name, argv[1]) == 0) break; if (i == nintf) { advise (LLOG_EXCEPTIONS, NULLCP, "config: %s not a known interface", argv[1]); return NOTOK; } if ((addrs[i].if_flags & IFF_BROADCAST) == 0) { advise (LLOG_EXCEPTIONS, NULLCP, "config: %s doesn't support broadcast", argv[1]); return NOTOK; } if (peer = check_peer(&addrs[i].bcast, -1)) { advise (LLOG_EXCEPTIONS, NULLCP, "config file: duplicate broadcast for %s", argv[1]); return NOTOK; } peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer)); if (peer == NULL) adios ("malloc", "peer"); make_new_peer(peer); peer->flags = PEER_FL_BCAST; peer->hmode = MODE_BROADCAST; peer->src = addrs[i].bcast; peer->sock = i;#endif /* BROADCAST_NTP */ break; case TBL_PEER: case TBL_PASSIVE: case TBL_SERVER: if (argc < 2) return NOTOK; if (GetHostName(argv[1], &addr) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "%s: unknown host", argv[1]); return NOTOK; } for (i=0; i<nintf; i++) if (addr_compare (&addrs[i].addr, &addr)) return NOTOK; peer = check_peer(&addr, -1); if (peer != NULL) { advise (LLOG_NOTICE, NULLCP, "Duplicate peer %s in in config file", paddr (&addr)); return NOTOK; } peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer)); if (peer == NULL) adios ("failed", "malloc"); make_new_peer(peer); peer->flags = PEER_FL_CONFIG; switch (result) { case TBL_PEER: /* "peer" */ peer->hmode = MODE_SYM_ACT; peer->stopwatch = random () % (1 << NTP_MINPOLL); peer->flags |= PEER_FL_SYNC; break; case TBL_SERVER: /* "server" */ peer->hmode = MODE_CLIENT; peer->stopwatch = random () % (1 << NTP_MINPOLL); peer->flags |= PEER_FL_SYNC; break; case TBL_PASSIVE: /* "passive" */ peer->hmode = MODE_SYM_PAS; peer->flags |= PEER_FL_SYNC; break; default: (void) printf("can't happen\n"); abort(); } peer->src = addr; if (addr.type == AF_OSI) peer -> flags |= PEER_FL_CONREQ; peer->sock = -1; clear(peer); other_peer_fields (peer, argv + 2, argc - 2); enqueue(&peer_list, peer); TRACE (2, ("Peer %s mode %d", paddr(&peer->src), peer->hmode)); break; case TBL_REFCLOCK: if (argc < 6) return NOTOK;#ifdef REFCLOCK else { int stratum, prec; char *ref_clock; char *clk_type; ref_clock = argv[2]; stratum = atoi (argv[3]); prec = atoi (argv[4]); clk_type = argv[5]; if((i = init_clock(argv[1], clk_type)) < 0) { /* If we could not initialize clock line */ advise (LLOG_EXCEPTIONS, NULLCP, "Could not init reference source %s (type %s)", argv[1], clk_type); return NOTOK; } peer = (struct ntp_peer *) calloc(1, sizeof(struct ntp_peer)); if (peer == NULL) { (void) close(i); return NOTOK; } make_new_peer(peer); (void) strncpy(peer->refid.rid_string, ref_clock, 4); peer->refid.rid_string[4] = 0; peer->refid.rid_type = RID_STRING; peer->flags = PEER_FL_CONFIG|PEER_FL_REFCLOCK; peer->hmode = MODE_SYM_ACT; peer->stopwatch = random () % (1 << NTP_MINPOLL); peer->flags |= PEER_FL_SYNC; peer->sock = i; peer->stratum = stratum; peer->precision = prec; clear(peer); enqueue(&peer_list, peer); TRACE (2, ("Refclock %s mode %d refid %.4s stratum %d precision %d", argv[1], peer->hmode, peer->refid.rid_string, stratum, prec)); transmit(peer); /* head start for REFCLOCK */ }#endif REFCLOCK break; case TBL_KEEPALLPEERS: if (argc < 2) return NOTOK; keepallpeers = ynorint (argv[1]); break; default: return NOTOK; } return OK;}CMD_TABLE tbl_peer_flags[] = {#define TBLPEER_VERSION 1 "version", TBLPEER_VERSION,#define TBLPEER_AUTH 2 "auth", TBLPEER_AUTH, NULLCP, -1 }; other_peer_fields (peer, argv, argc)struct ntp_peer *peer;char **argv;int argc;{ while (argc > 0) { switch (cmd_srch (argv[0], tbl_peer_flags)) { case TBLPEER_VERSION: peer -> vers = atoi(argv[1]); if (peer -> vers < 1 || peer -> vers > 2) adios (NULLCP, "Bad version %d", peer -> vers); break; case TBLPEER_AUTH: advise (LLOG_NOTICE, "auth code not done yet"); break; } argc -= 2; argv += 2; }}ynorint (s)char *s;{ if (*s == 'y' || *s == 'Y') return 1; if (*s == 'n' || *s == 'N') return 0; return atoi (s);}/* */int kern_tickadj;static int kern_hz, kern_tick;#ifdef NeXT#define n_name n_un.n_name#endifstatic voidinit_kern_vars() { int kmem; static char *memory = "/dev/kmem"; static struct nlist nl[4];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -