ntpd.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 1,502 行 · 第 1/3 页
C
1,502 行
(pkt->status & LEAPMASK) >> 6, (pkt->status & VERSIONMASK) >> 3, pkt->status & MODEMASK, pkt->ppoll, pkt->precision, pkt->stratum); switch (pkt->stratum) { case 0: case 1: printf(" (%.4s)\n", (char *)&pkt->refid); break; default: clock_host.s_addr = (u_long) pkt->refid; printf(" [%s]\n", inet_ntoa(clock_host)); break; } printf("Synch Dist is %04X.%04X Synch Dispersion is %04X.%04X\n", ntohs((u_short) pkt->distance.int_part), ntohs((u_short) pkt->distance.fraction), ntohs((u_short) pkt->dispersion.int_part), ntohs((u_short) pkt->dispersion.fraction)); printf("Reference Timestamp is %08lx.%08lx\n", ntohl(pkt->reftime.int_part), ntohl(pkt->reftime.fraction)); printf("Originate Timestamp is %08lx.%08lx\n", ntohl(pkt->org.int_part), ntohl(pkt->org.fraction)); printf("Receive Timestamp is %08lx.%08lx\n", ntohl(pkt->rec.int_part), ntohl(pkt->rec.fraction)); printf("Transmit Timestamp is %08lx.%08lx\n", ntohl(pkt->xmt.int_part), ntohl(pkt->xmt.fraction)); if(peer != NULL) printf("Input Timestamp is %08lx.%08lx\n", ntohl(peer->rec.int_part), ntohl(peer->rec.fraction)); putchar('\n');}#endifvoidmake_new_peer(peer) struct ntp_peer *peer;{ int i; /* * initialize peer data fields */ peer->src.sin_family = AF_INET; peer->src.sin_port = 0; peer->src.sin_addr.s_addr = 0; peer->hmode = MODE_SYM_PAS; /* default: symmetric passive mode */ peer->flags = 0; peer->timer = 1 << NTP_MINPOLL; peer->stopwatch = 0; peer->hpoll = NTP_MINPOLL; double_to_s_fixed(&peer->dispersion, PEER_MAXDISP); peer->reach = 0; peer->estoffset = 0.0; peer->estdelay = 0.0; peer->org.int_part = peer->org.fraction = 0; peer->rec.int_part = peer->rec.fraction = 0; peer->filter.samples = 0; for (i = 0; i < NTP_WINDOW; i++) { peer->filter.offset[i] = 0.0; peer->filter.delay[i] = 0.0; } peer->pkt_sent = 0; peer->pkt_rcvd = 0; peer->pkt_dropped = 0;}/* * This procedure is called to delete a peer from our list of peers. */voiddemobilize(l, peer) struct list *l; struct ntp_peer *peer;{ extern struct ntp_peer dummy_peer; if (peer == &dummy_peer)#ifdef DEBUG abort();#else return;#endif#ifdef DEBUG if ((peer->next == NULL && peer->prev == NULL) || l->tail == NULL || l->head == NULL) abort();#endif /* delete only peer in list? */ if (l->head == l->tail) {#ifdef DEBUG if (l->head != peer) abort();#endif l->head = l->tail = NULL; goto dropit; } /* delete first peer? */ if (l->head == peer) { l->head = peer->next; l->head->prev = NULL; goto dropit; } /* delete last peer? */ if (l->tail == peer) { l->tail = peer->prev; l->tail->next = NULL; goto dropit; } /* drop peer in middle */ peer->prev->next = peer->next; peer->next->prev = peer->prev; dropit:#ifdef DEBUG /* just some sanity checking */ if ((l->members < 0) || (l->members && l->tail == NULL) || (l->members == 0 && l->tail != NULL)) { syslog(LOG_ERR, "List hosed (demobilize)"); abort(); } peer->next = peer->prev = NULL;#endif free((char *) peer); l->members--; return;}enqueue(l, peer) register struct list *l; struct ntp_peer *peer;{ l->members++; if (l->tail == NULL) { /* insertion into empty list */ l->tail = l->head = peer; peer->next = peer->prev = NULL; return; } /* insert at end of list */ l->tail->next = peer; peer->next = NULL; peer->prev = l->tail; l->tail = peer;}/* XXX *//* * Trivial signal handler. Assumes you have Berkeley flavored signals which * re-enable themselves. */void tock() { ticked = 1;}voidtimeout(){ static int periodic = 0; 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. */ if (sys.hold) { if (sys.hold <= (1<<CLOCK_ADJ)) sys.hold = 0; else sys.hold -= (1<<CLOCK_ADJ); } /* * If interval has expired blast off an NTP to that host. */ while (peer != NULL) {#ifdef DEBUG if (peer->next == NULL && peer != peer_list.tail) { printf("Broken peer list\n"); syslog(LOG_ERR, "Broken peer list"); abort(); }#endif next = peer->next; if (peer->reach != 0 || peer->hmode != MODE_SERVER) { peer->stopwatch +=(1<<CLOCK_ADJ); if (peer->timer <= peer->stopwatch) { transmit(peer); peer->stopwatch = 0; } } peer = next; } periodic += (1<<CLOCK_ADJ); if (periodic >= 60*60) { periodic = 0; hourly(); } clock_watchdog += (1 << CLOCK_ADJ); if (clock_watchdog >= NTP_MAXAGE) { /* woof, woof - barking dogs bite! */ sys.leap = ALARM; if (clock_watchdog < NTP_MAXAGE + (1 << CLOCK_ADJ)) { syslog(LOG_ERR, "logical clock adjust timeout (%d seconds)", NTP_MAXAGE);#ifdef DEBUG if (debug) printf("logical clock adjust timeout (%d seconds)\n", NTP_MAXAGE);#endif } }#ifdef DEBUG if (debug) (void) fflush(stdout);#endif}/* * init_ntp() reads NTP daemon configuration information from disk file. */voidinit_ntp(config) char *config;{ struct sockaddr_in sin; char ref_clock[5]; char name[81]; FILE *fp; int error = FALSE, c; struct ntp_peer *peer; int precision; int stratum; int i; int debuglevel; int stagger = 0; double j; extern double drift_comp; bzero((char *) &sin, sizeof(sin)); fp = fopen(config, "r"); if (fp == NULL) { fprintf(stderr,"Problem opening NTP initialization file %s\n", config); syslog(LOG_ERR,"Problem opening NTP initialization file %s", config); exit(1); } while (fscanf(fp, "%s", name) != EOF) { /* read first word of line * and compare to key words */ if (strcmp(name, "maxpeers") == 0) { if (fscanf(fp, "%d", &sys.maxpeers) != 1) error = TRUE; } else if (strcmp(name, "trusting") == 0) { if (fscanf(fp, "%s", name) != 1) error = TRUE; else { if (*name == 'Y' || *name == 'y') { trusting = 1; } else if (*name == 'N' || *name == 'n') { trusting = 0; } 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 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; else sys.precision = (char) precision;#ifdef SETTICKADJ } else if (strcmp(name, "tickadj") == 0) { 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) { noswap = 1;#endif#ifdef BROADCAST_NTP } else if (strcmp(name, "broadcast") == 0) { if (fscanf(fp, "%s", name) != 1) { error = TRUE; goto skipit; } for (i = 0; i < nintf; i++) if (strcmp(addrs[i].name, name) == 0) break; if (i == nintf) { syslog(LOG_ERR, "config file: %s not a known interface"); error = TRUE; goto skipit; } if ((addrs[i].if_flags & IFF_BROADCAST) == 0) { syslog(LOG_ERR, "config file: %s doesn't support broadcast", name); error = TRUE; goto skipit; } if (peer = check_peer(&addrs[i].bcast, -1)) { syslog(LOG_ERR, "config file: duplicate broadcast for %s", name); error = TRUE; goto skipit; } peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer)); if (peer == NULL) { error = TRUE; syslog(LOG_ERR, "No memory"); goto skipit; } make_new_peer(peer); peer->flags = PEER_FL_BCAST; peer->hmode = MODE_BROADCAST; peer->src = addrs[i].bcast; peer->sock = i;#endif /* BROADCAST_NTP */ } else if ((strcmp(name, "peer") == 0) || (strcmp(name, "passive") == 0) || (strcmp(name, "server") == 0)) { int mode = 0; if (strcmp(name, "peer") == 0) { mode = MODE_SYM_ACT; } else if (strcmp(name, "server") == 0) { mode = MODE_CLIENT; } else if (strcmp(name, "passive") == 0) { mode = MODE_SYM_PAS; } else { printf("can't happen\n"); abort(); } if (fscanf(fp, "%s", name) != 1) error = TRUE;#ifdef REFCLOCK else if (name[0] == '/') { int stratum, precision; char clk_type[20]; if (fscanf(fp, "%4s", ref_clock) != 1) { error = TRUE; syslog(LOG_ERR, "reference id missing"); goto skipit; } if (fscanf(fp, "%4d", &stratum) != 1) { error = TRUE; syslog(LOG_ERR, "reference stratum missing"); goto skipit; } if (fscanf(fp, "%4d", &precision) != 1) { error = TRUE; syslog(LOG_ERR, "reference precision missing"); goto skipit; } if (fscanf(fp, "%19s", clk_type) != 1) { error = TRUE; syslog(LOG_ERR, "reference type missing"); goto skipit; } if((i = init_clock(name, clk_type)) < 0) { /* If we could not initialize clock line */#ifdef DEBUG if (debug) printf("Could not init reference source %s (type %s)\n", name, clk_type); else#endif DEBUG syslog(LOG_ERR, "Could not init reference source %s (type %s)", name, clk_type); error = TRUE; goto skipit; } peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer)); if (peer == NULL) { close(i); error = TRUE; goto skipit; } make_new_peer(peer); ref_clock[4] = 0; (void) strncpy((char *) &peer->refid, ref_clock, 4); peer->flags = PEER_FL_CONFIG|PEER_FL_REFCLOCK; peer->hmode = MODE_SYM_ACT; peer->stopwatch = stagger; stagger += (1<<CLOCK_ADJ); peer->flags |= PEER_FL_SYNC; peer->sock = i; peer->stratum = stratum; peer->precision = precision; clear(peer); enqueue(&peer_list, peer); if (debug > 1) printf("Peer %s mode %d refid %.4s stratum %d precision %d\n", name, peer->hmode, (char *)&peer->refid, stratum, precision); transmit(peer); /* head start for REFCLOCK */ }#endif REFCLOCK else if (GetHostName(name, &sin) == 0) syslog(LOG_ERR, "%s: unknown host", name); else { for (i=0; i<nintf; i++) if (addrs[i].sin.sin_addr.s_addr == sin.sin_addr.s_addr) goto skipit; if (servp) sin.sin_port = servp->s_port; else sin.sin_port = htons(NTP_PORT); peer = check_peer(&sin, -1); if (peer == NULL) { peer = (struct ntp_peer *) malloc(sizeof(struct ntp_peer)); if (peer == NULL) error = TRUE; else { make_new_peer(peer); peer->flags = PEER_FL_CONFIG; switch (mode) { case MODE_SYM_ACT: /* "peer" */ peer->hmode = MODE_SYM_ACT; peer->stopwatch = stagger; stagger += (1<<CLOCK_ADJ); peer->flags |= PEER_FL_SYNC; break; case MODE_CLIENT: /* "server" */ peer->hmode = MODE_CLIENT; peer->stopwatch = stagger;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?