update timed to the latest version, as supplied and ported by
<Vernon Schryver> vjs@calcite.rhyolite.com.
This commit is contained in:
parent
0ec046b62b
commit
4bb7cfabaf
|
@ -1,12 +1,11 @@
|
|||
# from: @(#)Makefile 5.2 (Berkeley) 5/11/90
|
||||
# $Id: Makefile,v 1.3 1993/07/30 20:50:37 mycroft Exp $
|
||||
# @(#)Makefile 5.4 (Berkeley) 5/11/93
|
||||
|
||||
PROG= timedc
|
||||
SRCS= cmds.c cmdtab.c timedc.c byteorder.c measure.c cksum.${MACHINE}.c
|
||||
SRCS= cmds.c cmdtab.c timedc.c byteorder.c measure.c cksum.c
|
||||
MAN8= timedc.0
|
||||
BINOWN= root
|
||||
BINMODE=4555
|
||||
.PATH: ${.CURDIR}/../timed ${.CURDIR}/../timed/obj
|
||||
.PATH: ${.CURDIR}/../timed
|
||||
|
||||
.include "../../Makefile.inc"
|
||||
.include <bsd.prog.mk>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 1983 Regents of the University of California.
|
||||
/*-
|
||||
* Copyright (c) 1985, 1993 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -32,131 +32,257 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
/*static char sccsid[] = "from: @(#)cmds.c 2.8 (Berkeley) 3/2/91";*/
|
||||
static char rcsid[] = "$Id: cmds.c,v 1.2 1993/08/01 17:55:12 mycroft Exp $";
|
||||
static char sccsid[] = "@(#)cmds.c 5.1 (Berkeley) 5/11/93";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifdef sgi
|
||||
#ident "$Revision: 1.3 $"
|
||||
#endif
|
||||
|
||||
#include "timedc.h"
|
||||
#include <sys/file.h>
|
||||
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/ip_icmp.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <strings.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define TSPTYPES
|
||||
#include <protocols/timed.h>
|
||||
#include <sys/file.h>
|
||||
|
||||
int id;
|
||||
#ifdef sgi
|
||||
#include <bstring.h>
|
||||
#include <sys/clock.h>
|
||||
#else
|
||||
#define SECHR (60*60)
|
||||
#define SECDAY (24*SECHR)
|
||||
#endif /* sgi */
|
||||
|
||||
# define DATE_PROTO "udp"
|
||||
# define DATE_PORT "time"
|
||||
|
||||
|
||||
int sock;
|
||||
int sock_raw;
|
||||
char hostname[MAXHOSTNAMELEN];
|
||||
struct hostent *hp, *gethostbyname();
|
||||
char myname[MAXHOSTNAMELEN];
|
||||
struct hostent *hp;
|
||||
struct sockaddr_in server;
|
||||
struct sockaddr_in dayaddr;
|
||||
extern int measure_delta;
|
||||
int bytenetorder(), bytehostorder();
|
||||
char *strcpy();
|
||||
|
||||
void bytenetorder(struct tsp *);
|
||||
void bytehostorder(struct tsp *);
|
||||
|
||||
|
||||
#define BU ((unsigned long)2208988800) /* seconds before UNIX epoch */
|
||||
|
||||
|
||||
/* compute the difference between our date and another machine
|
||||
*/
|
||||
static int /* difference in days from our time */
|
||||
daydiff(char *hostname)
|
||||
{
|
||||
int i;
|
||||
int trials;
|
||||
struct timeval tout, now;
|
||||
fd_set ready;
|
||||
struct sockaddr from;
|
||||
int fromlen;
|
||||
unsigned long sec;
|
||||
|
||||
|
||||
/* wait 2 seconds between 10 tries */
|
||||
tout.tv_sec = 2;
|
||||
tout.tv_usec = 0;
|
||||
for (trials = 0; trials < 10; trials++) {
|
||||
/* ask for the time */
|
||||
sec = 0;
|
||||
if (sendto(sock, &sec, sizeof(sec), 0,
|
||||
(struct sockaddr*)&dayaddr, sizeof(dayaddr)) < 0) {
|
||||
perror("sendto(sock)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
FD_ZERO(&ready);
|
||||
FD_SET(sock, &ready);
|
||||
i = select(sock+1, &ready, (fd_set *)0,
|
||||
(fd_set *)0, &tout);
|
||||
if (i < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
perror("select(date read)");
|
||||
return 0;
|
||||
}
|
||||
if (0 == i)
|
||||
break;
|
||||
|
||||
fromlen = sizeof(from);
|
||||
if (recvfrom(sock,&sec,sizeof(sec),0,
|
||||
&from,&fromlen) < 0) {
|
||||
perror("recvfrom(date read)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
sec = ntohl(sec);
|
||||
if (sec < BU) {
|
||||
fprintf(stderr,
|
||||
"%s says it is before 1970: %lu",
|
||||
hostname, sec);
|
||||
return 0;
|
||||
}
|
||||
sec -= BU;
|
||||
|
||||
(void)gettimeofday(&now, (struct timezone*)0);
|
||||
return (sec - now.tv_sec);
|
||||
}
|
||||
}
|
||||
|
||||
/* if we get here, we tried too many times */
|
||||
fprintf(stderr,"%s will not tell us the date\n", hostname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Clockdiff computes the difference between the time of the machine on
|
||||
* Clockdiff computes the difference between the time of the machine on
|
||||
* which it is called and the time of the machines given as argument.
|
||||
* The time differences measured by clockdiff are obtained using a sequence
|
||||
* of ICMP TSTAMP messages which are returned to the sender by the IP module
|
||||
* in the remote machine.
|
||||
* In order to compare clocks of machines in different time zones, the time
|
||||
* is transmitted (as a 32-bit value) in milliseconds since midnight UT.
|
||||
* In order to compare clocks of machines in different time zones, the time
|
||||
* is transmitted (as a 32-bit value) in milliseconds since midnight UT.
|
||||
* If a hosts uses a different time format, it should set the high order
|
||||
* bit of the 32-bit quantity it transmits.
|
||||
* However, VMS apparently transmits the time in milliseconds since midnight
|
||||
* local time (rather than GMT) without setting the high order bit.
|
||||
* Furthermore, it does not understand daylight-saving time. This makes
|
||||
* local time (rather than GMT) without setting the high order bit.
|
||||
* Furthermore, it does not understand daylight-saving time. This makes
|
||||
* clockdiff behaving inconsistently with hosts running VMS.
|
||||
*
|
||||
* In order to reduce the sensitivity to the variance of message transmission
|
||||
* time, clockdiff sends a sequence of messages. Yet, measures between
|
||||
* two `distant' hosts can be affected by a small error. The error can, however,
|
||||
* be reduced by increasing the number of messages sent in each measurement.
|
||||
* In order to reduce the sensitivity to the variance of message transmission
|
||||
* time, clockdiff sends a sequence of messages. Yet, measures between
|
||||
* two `distant' hosts can be affected by a small error. The error can,
|
||||
* however, be reduced by increasing the number of messages sent in each
|
||||
* measurement.
|
||||
*/
|
||||
|
||||
void
|
||||
clockdiff(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
int measure_status;
|
||||
struct timeval ack;
|
||||
int measure();
|
||||
extern int measure(u_long, u_long, char *, struct sockaddr_in*, int);
|
||||
register int avg_cnt;
|
||||
register long avg;
|
||||
struct servent *sp;
|
||||
|
||||
if(argc < 2) {
|
||||
if (argc < 2) {
|
||||
printf("Usage: clockdiff host ... \n");
|
||||
return;
|
||||
}
|
||||
|
||||
id = getpid();
|
||||
(void)gethostname(hostname,sizeof(hostname));
|
||||
(void)gethostname(myname,sizeof(myname));
|
||||
|
||||
/* get the address for the date ready */
|
||||
sp = getservbyname(DATE_PORT, DATE_PROTO);
|
||||
if (!sp) {
|
||||
(void)fprintf(stderr, "%s/%s is an unknown service\n",
|
||||
DATE_PORT, DATE_PROTO);
|
||||
dayaddr.sin_port = 0;
|
||||
} else {
|
||||
dayaddr.sin_port = sp->s_port;
|
||||
}
|
||||
|
||||
while (argc > 1) {
|
||||
argc--; argv++;
|
||||
hp = gethostbyname(*argv);
|
||||
if (hp == NULL) {
|
||||
fprintf(stderr, "timed: %s: ", *argv);
|
||||
herror((char *)NULL);
|
||||
fprintf(stderr, "timedc: %s: ", *argv);
|
||||
herror(0);
|
||||
continue;
|
||||
}
|
||||
server.sin_family = hp->h_addrtype;
|
||||
bcopy(hp->h_addr, &(server.sin_addr.s_addr), hp->h_length);
|
||||
ack.tv_sec = 10;
|
||||
ack.tv_usec = 0;
|
||||
if ((measure_status = measure(&ack, &server)) < 0) {
|
||||
perror("measure");
|
||||
return;
|
||||
}
|
||||
switch (measure_status) {
|
||||
|
||||
server.sin_family = hp->h_addrtype;
|
||||
bcopy(hp->h_addr, &server.sin_addr.s_addr, hp->h_length);
|
||||
for (avg_cnt = 0, avg = 0; avg_cnt < 16; avg_cnt++) {
|
||||
measure_status = measure(10000,100, *argv, &server, 1);
|
||||
if (measure_status != GOOD)
|
||||
break;
|
||||
avg += measure_delta;
|
||||
}
|
||||
if (measure_status == GOOD)
|
||||
measure_delta = avg/avg_cnt;
|
||||
|
||||
switch (measure_status) {
|
||||
case HOSTDOWN:
|
||||
printf("%s is down\n", hp->h_name);
|
||||
continue;
|
||||
break;
|
||||
case NONSTDTIME:
|
||||
printf("%s time transmitted in a non-standard format\n", hp->h_name);
|
||||
printf("%s transmitts a non-standard time format\n",
|
||||
hp->h_name);
|
||||
continue;
|
||||
break;
|
||||
case UNREACHABLE:
|
||||
printf("%s is unreachable\n", hp->h_name);
|
||||
continue;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (measure_delta > 0)
|
||||
printf("time on %s is %d ms. ahead of time on %s\n",
|
||||
hp->h_name, measure_delta,
|
||||
hostname);
|
||||
else
|
||||
if (measure_delta == 0)
|
||||
printf("%s and %s have the same time\n",
|
||||
hp->h_name, hostname);
|
||||
else
|
||||
printf("time on %s is %d ms. behind time on %s\n",
|
||||
hp->h_name, -measure_delta, hostname);
|
||||
/*
|
||||
* Try to get the date only after using ICMP timestamps to
|
||||
* get the time. This is because the date protocol
|
||||
* is optional.
|
||||
*/
|
||||
if (dayaddr.sin_port != 0) {
|
||||
dayaddr.sin_family = hp->h_addrtype;
|
||||
bcopy(hp->h_addr, &dayaddr.sin_addr.s_addr,
|
||||
hp->h_length);
|
||||
avg = daydiff(*argv);
|
||||
if (avg > SECDAY) {
|
||||
printf("time on %s is %ld days ahead %s\n",
|
||||
hp->h_name, avg/SECDAY, myname);
|
||||
continue;
|
||||
} else if (avg < -SECDAY) {
|
||||
printf("time on %s is %ld days behind %s\n",
|
||||
hp->h_name, -avg/SECDAY, myname);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (measure_delta > 0) {
|
||||
printf("time on %s is %d ms. ahead of time on %s\n",
|
||||
hp->h_name, measure_delta, myname);
|
||||
} else if (measure_delta == 0) {
|
||||
printf("%s and %s have the same time\n",
|
||||
hp->h_name, myname);
|
||||
} else {
|
||||
printf("time on %s is %d ms. behind time on %s\n",
|
||||
hp->h_name, -measure_delta, myname);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* finds location of master timedaemon
|
||||
*/
|
||||
|
||||
msite(argc)
|
||||
int argc;
|
||||
void
|
||||
msite(int argc, char *argv[])
|
||||
{
|
||||
int length;
|
||||
int cc;
|
||||
fd_set ready;
|
||||
struct sockaddr_in dest;
|
||||
int i, length;
|
||||
struct sockaddr from;
|
||||
struct timeval tout;
|
||||
struct sockaddr_in from;
|
||||
struct tsp msg;
|
||||
struct servent *srvp;
|
||||
char *tgtname;
|
||||
|
||||
if (argc != 1) {
|
||||
printf("Usage: msite\n");
|
||||
if (argc < 1) {
|
||||
printf("Usage: msite [hostname]\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -168,77 +294,80 @@ int argc;
|
|||
dest.sin_port = srvp->s_port;
|
||||
dest.sin_family = AF_INET;
|
||||
|
||||
(void)gethostname(hostname, sizeof(hostname));
|
||||
hp = gethostbyname(hostname);
|
||||
if (hp == NULL) {
|
||||
fprintf(stderr, "timed: %s: ", hostname);
|
||||
herror((char *)NULL);
|
||||
return;
|
||||
}
|
||||
bcopy(hp->h_addr, &dest.sin_addr.s_addr, hp->h_length);
|
||||
|
||||
(void)strcpy(msg.tsp_name, hostname);
|
||||
msg.tsp_type = TSP_MSITE;
|
||||
msg.tsp_vers = TSPVERSION;
|
||||
bytenetorder(&msg);
|
||||
length = sizeof(struct sockaddr_in);
|
||||
if (sendto(sock, (char *)&msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr *)&dest, length) < 0) {
|
||||
perror("sendto");
|
||||
return;
|
||||
}
|
||||
|
||||
tout.tv_sec = 15;
|
||||
tout.tv_usec = 0;
|
||||
FD_ZERO(&ready);
|
||||
FD_SET(sock, &ready);
|
||||
if (select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout)) {
|
||||
length = sizeof(struct sockaddr_in);
|
||||
cc = recvfrom(sock, (char *)&msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr *)&from, &length);
|
||||
if (cc < 0) {
|
||||
perror("recvfrom");
|
||||
return;
|
||||
(void)gethostname(myname, sizeof(myname));
|
||||
i = 1;
|
||||
do {
|
||||
tgtname = (i >= argc) ? myname : argv[i];
|
||||
hp = gethostbyname(tgtname);
|
||||
if (hp == 0) {
|
||||
fprintf(stderr, "timedc: %s: ", tgtname);
|
||||
herror(0);
|
||||
continue;
|
||||
}
|
||||
bytehostorder(&msg);
|
||||
if (msg.tsp_type == TSP_ACK)
|
||||
printf("master timedaemon runs on %s\n", msg.tsp_name);
|
||||
else
|
||||
printf("received wrong ack: %s\n",
|
||||
tsptype[msg.tsp_type]);
|
||||
} else
|
||||
printf("communication error\n");
|
||||
bcopy(hp->h_addr, &dest.sin_addr.s_addr, hp->h_length);
|
||||
|
||||
(void)strcpy(msg.tsp_name, myname);
|
||||
msg.tsp_type = TSP_MSITE;
|
||||
msg.tsp_vers = TSPVERSION;
|
||||
bytenetorder(&msg);
|
||||
if (sendto(sock, &msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr*)&dest,
|
||||
sizeof(struct sockaddr)) < 0) {
|
||||
perror("sendto");
|
||||
continue;
|
||||
}
|
||||
|
||||
tout.tv_sec = 15;
|
||||
tout.tv_usec = 0;
|
||||
FD_ZERO(&ready);
|
||||
FD_SET(sock, &ready);
|
||||
if (select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0,
|
||||
&tout)) {
|
||||
length = sizeof(struct sockaddr);
|
||||
cc = recvfrom(sock, &msg, sizeof(struct tsp), 0,
|
||||
&from, &length);
|
||||
if (cc < 0) {
|
||||
perror("recvfrom");
|
||||
continue;
|
||||
}
|
||||
bytehostorder(&msg);
|
||||
if (msg.tsp_type == TSP_ACK) {
|
||||
printf("master timedaemon at %s is %s\n",
|
||||
tgtname, msg.tsp_name);
|
||||
} else {
|
||||
printf("received wrong ack: %s\n",
|
||||
tsptype[msg.tsp_type]);
|
||||
}
|
||||
} else {
|
||||
printf("communication error with %s\n", tgtname);
|
||||
}
|
||||
} while (++i < argc);
|
||||
}
|
||||
|
||||
/*
|
||||
* quits timedc
|
||||
*/
|
||||
|
||||
void
|
||||
quit()
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#define MAXH 4 /* max no. of hosts where election can occur */
|
||||
|
||||
/*
|
||||
* Causes the election timer to expire on the selected hosts
|
||||
* It sends just one udp message per machine, relying on
|
||||
* reliability of communication channel.
|
||||
*/
|
||||
|
||||
testing(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
void
|
||||
testing(int argc, char *argv[])
|
||||
{
|
||||
int length;
|
||||
int nhosts;
|
||||
struct servent *srvp;
|
||||
struct sockaddr_in sin[MAXH];
|
||||
struct sockaddr_in sin;
|
||||
struct tsp msg;
|
||||
|
||||
if(argc < 2) {
|
||||
printf("Usage: testing host ...\n");
|
||||
if (argc < 2) {
|
||||
printf("Usage: election host1 [host2 ...]\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -246,55 +375,48 @@ char *argv[];
|
|||
if (srvp == 0) {
|
||||
fprintf(stderr, "udp/timed: unknown service\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
nhosts = 0;
|
||||
while (argc > 1) {
|
||||
argc--; argv++;
|
||||
hp = gethostbyname(*argv);
|
||||
if (hp == NULL) {
|
||||
fprintf(stderr, "timed: %s: ", *argv);
|
||||
herror((char *)NULL);
|
||||
fprintf(stderr, "timedc: %s: ", *argv);
|
||||
herror(0);
|
||||
argc--; argv++;
|
||||
continue;
|
||||
}
|
||||
sin[nhosts].sin_port = srvp->s_port;
|
||||
sin[nhosts].sin_family = hp->h_addrtype;
|
||||
bcopy(hp->h_addr, &(sin[nhosts].sin_addr.s_addr), hp->h_length);
|
||||
if (++nhosts == MAXH)
|
||||
break;
|
||||
}
|
||||
sin.sin_port = srvp->s_port;
|
||||
sin.sin_family = hp->h_addrtype;
|
||||
bcopy(hp->h_addr, &sin.sin_addr.s_addr, hp->h_length);
|
||||
|
||||
msg.tsp_type = TSP_TEST;
|
||||
msg.tsp_vers = TSPVERSION;
|
||||
(void)gethostname(hostname, sizeof(hostname));
|
||||
(void)strcpy(msg.tsp_name, hostname);
|
||||
bytenetorder(&msg); /* it is not really necessary here */
|
||||
while (nhosts-- > 0) {
|
||||
length = sizeof(struct sockaddr_in);
|
||||
if (sendto(sock, (char *)&msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr *)&sin[nhosts], length) < 0) {
|
||||
msg.tsp_type = TSP_TEST;
|
||||
msg.tsp_vers = TSPVERSION;
|
||||
(void)gethostname(myname, sizeof(myname));
|
||||
(void)strncpy(msg.tsp_name, myname, sizeof(msg.tsp_name));
|
||||
bytenetorder(&msg);
|
||||
if (sendto(sock, &msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr*)&sin,
|
||||
sizeof(struct sockaddr)) < 0) {
|
||||
perror("sendto");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Enables or disables tracing on local timedaemon
|
||||
*/
|
||||
|
||||
tracing(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
void
|
||||
tracing(int argc, char *argv[])
|
||||
{
|
||||
int onflag;
|
||||
int length;
|
||||
int cc;
|
||||
fd_set ready;
|
||||
struct sockaddr_in dest;
|
||||
struct sockaddr from;
|
||||
struct timeval tout;
|
||||
struct sockaddr_in from;
|
||||
struct tsp msg;
|
||||
struct servent *srvp;
|
||||
|
||||
|
@ -307,12 +429,12 @@ char *argv[];
|
|||
if (srvp == 0) {
|
||||
fprintf(stderr, "udp/timed: unknown service\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
dest.sin_port = srvp->s_port;
|
||||
dest.sin_family = AF_INET;
|
||||
|
||||
(void)gethostname(hostname,sizeof(hostname));
|
||||
hp = gethostbyname(hostname);
|
||||
(void)gethostname(myname,sizeof(myname));
|
||||
hp = gethostbyname(myname);
|
||||
bcopy(hp->h_addr, &dest.sin_addr.s_addr, hp->h_length);
|
||||
|
||||
if (strcmp(argv[1], "on") == 0) {
|
||||
|
@ -323,12 +445,11 @@ char *argv[];
|
|||
onflag = OFF;
|
||||
}
|
||||
|
||||
(void)strcpy(msg.tsp_name, hostname);
|
||||
(void)strcpy(msg.tsp_name, myname);
|
||||
msg.tsp_vers = TSPVERSION;
|
||||
bytenetorder(&msg);
|
||||
length = sizeof(struct sockaddr_in);
|
||||
if (sendto(sock, (char *)&msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr *)&dest, length) < 0) {
|
||||
if (sendto(sock, &msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr*)&dest, sizeof(struct sockaddr)) < 0) {
|
||||
perror("sendto");
|
||||
return;
|
||||
}
|
||||
|
@ -338,9 +459,9 @@ char *argv[];
|
|||
FD_ZERO(&ready);
|
||||
FD_SET(sock, &ready);
|
||||
if (select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout)) {
|
||||
length = sizeof(struct sockaddr_in);
|
||||
cc = recvfrom(sock, (char *)&msg, sizeof(struct tsp), 0,
|
||||
(struct sockaddr *)&from, &length);
|
||||
length = sizeof(struct sockaddr);
|
||||
cc = recvfrom(sock, &msg, sizeof(struct tsp), 0,
|
||||
&from, &length);
|
||||
if (cc < 0) {
|
||||
perror("recvfrom");
|
||||
return;
|
||||
|
@ -352,12 +473,13 @@ char *argv[];
|
|||
else
|
||||
printf("timed tracing disabled\n");
|
||||
else
|
||||
printf("wrong ack received: %s\n",
|
||||
printf("wrong ack received: %s\n",
|
||||
tsptype[msg.tsp_type]);
|
||||
} else
|
||||
printf("communication error\n");
|
||||
}
|
||||
|
||||
int
|
||||
priv_resources()
|
||||
{
|
||||
int port;
|
||||
|
@ -373,7 +495,7 @@ priv_resources()
|
|||
sin.sin_addr.s_addr = 0;
|
||||
for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) {
|
||||
sin.sin_port = htons((u_short)port);
|
||||
if (bind(sock, (struct sockaddr *)&sin, sizeof (sin)) >= 0)
|
||||
if (bind(sock, (struct sockaddr*)&sin, sizeof (sin)) >= 0)
|
||||
break;
|
||||
if (errno != EADDRINUSE && errno != EADDRNOTAVAIL) {
|
||||
perror("bind");
|
||||
|
@ -387,10 +509,10 @@ priv_resources()
|
|||
return(-1);
|
||||
}
|
||||
|
||||
sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||
sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||
if (sock_raw < 0) {
|
||||
perror("opening raw socket");
|
||||
(void) close(sock_raw);
|
||||
(void) close(sock);
|
||||
return(-1);
|
||||
}
|
||||
return(1);
|
||||
|
|
|
@ -32,14 +32,11 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
/*static char sccsid[] = "from: @(#)cmdtab.c 2.6 (Berkeley) 6/1/90";*/
|
||||
static char rcsid[] = "$Id: cmdtab.c,v 1.2 1993/08/01 17:55:11 mycroft Exp $";
|
||||
static char sccsid[] = "@(#)cmdtab.c 2.7 (Berkeley) 5/11/93";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "timedc.h"
|
||||
|
||||
int clockdiff(), help(), msite(), quit(), testing(), tracing();
|
||||
|
||||
char clockdiffhelp[] = "measures clock differences between machines";
|
||||
char helphelp[] = "gets help on commands";
|
||||
char msitehelp[] = "finds location of master";
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
/*-
|
||||
* Copyright (c) 1993 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)extern.h 5.1 (Berkeley) 5/11/93
|
||||
*/
|
||||
|
||||
struct tsp;
|
||||
|
||||
void bytehostorder(struct tsp *);
|
||||
void bytenetorder(struct tsp *);
|
||||
void clockdiff(int, char *[]);
|
||||
void help(int, char *[]);
|
||||
void intr(int);
|
||||
void makeargv(void);
|
||||
void msite(int, char *[]);
|
||||
int priv_resources(void);
|
||||
void quit(void);
|
||||
void testing(int, char *[]);
|
||||
void tracing(int, char *[]);
|
|
@ -29,10 +29,9 @@
|
|||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" from: @(#)timedc.8 6.6 (Berkeley) 3/16/91
|
||||
.\" $Id: timedc.8,v 1.2 1993/08/01 07:23:20 mycroft Exp $
|
||||
.\" @(#)timedc.8 6.7 (Berkeley) 5/11/93
|
||||
.\"
|
||||
.Dd March 16, 1991
|
||||
.Dd May 11, 1993
|
||||
.Dt TIMEDC 8
|
||||
.Os BSD 4.3
|
||||
.ad
|
||||
|
@ -78,6 +77,7 @@ recognized commands are:
|
|||
.Pp
|
||||
.Bl -tag -width Ds -compact
|
||||
.It Ic \&? Op Ar command ...
|
||||
.Pp
|
||||
.It Ic help Op Ar command ...
|
||||
Print a short description of each command specified in the argument list,
|
||||
or, if no arguments are given, a list of the recognized commands.
|
||||
|
@ -86,6 +86,9 @@ or, if no arguments are given, a list of the recognized commands.
|
|||
Compute the differences between the clock of the host machine
|
||||
and the clocks of the machines given as arguments.
|
||||
.Pp
|
||||
.It Ic msite Op Ar host ...
|
||||
Show the master time server for specified host(s).
|
||||
.Pp
|
||||
.It Xo
|
||||
.Ic trace
|
||||
.Li \&{ Ar on Li \&|
|
||||
|
@ -96,6 +99,11 @@ Enable or disable the tracing of incoming messages to
|
|||
in the file
|
||||
.Pa /var/log/timed.log.
|
||||
.Pp
|
||||
.It Ic election Ar host
|
||||
Asks the daemon
|
||||
on the target host to reset its "election" timers and to ensure that
|
||||
a time master has been elected.
|
||||
.Pp
|
||||
.It Ic quit
|
||||
Exit from timedc.
|
||||
.El
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 1983 Regents of the University of California.
|
||||
/*-
|
||||
* Copyright (c) 1985, 1993 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -33,34 +33,38 @@
|
|||
|
||||
#ifndef lint
|
||||
char copyright[] =
|
||||
"@(#) Copyright (c) 1983 Regents of the University of California.\n\
|
||||
"@(#) Copyright (c) 1985, 1993 The Regents of the University of California.\n\
|
||||
All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
/*static char sccsid[] = "from: @(#)timedc.c 2.10 (Berkeley) 3/5/91";*/
|
||||
static char rcsid[] = "$Id: timedc.c,v 1.2 1993/08/01 17:55:09 mycroft Exp $";
|
||||
static char sccsid[] = "@(#)timedc.c 5.1 (Berkeley) 5/11/93";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifdef sgi
|
||||
#ident "$Revision: 1.3 $"
|
||||
#endif
|
||||
|
||||
#include "timedc.h"
|
||||
#include <strings.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
#include <setjmp.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
|
||||
int top;
|
||||
int trace = 0;
|
||||
FILE *fd = 0;
|
||||
int margc;
|
||||
int fromatty;
|
||||
char *margv[20];
|
||||
char cmdline[200];
|
||||
jmp_buf toplevel;
|
||||
void intr();
|
||||
int priv_resources();
|
||||
struct cmd *getcmd();
|
||||
static struct cmd *getcmd(char *);
|
||||
|
||||
|
||||
main(argc, argv)
|
||||
char *argv[];
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
register struct cmd *c;
|
||||
|
||||
|
@ -92,35 +96,11 @@ main(argc, argv)
|
|||
(*c->c_handler)(argc, argv);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
fromatty = isatty(fileno(stdin));
|
||||
top = setjmp(toplevel) == 0;
|
||||
if (top)
|
||||
(void) signal(SIGINT, intr);
|
||||
for (;;) {
|
||||
cmdscanner(top);
|
||||
top = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
intr()
|
||||
{
|
||||
if (!fromatty)
|
||||
exit(0);
|
||||
longjmp(toplevel, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Command parser.
|
||||
*/
|
||||
cmdscanner(top)
|
||||
int top;
|
||||
{
|
||||
register struct cmd *c;
|
||||
extern int help();
|
||||
|
||||
if (!top)
|
||||
if (setjmp(toplevel))
|
||||
putchar('\n');
|
||||
(void) signal(SIGINT, intr);
|
||||
for (;;) {
|
||||
if (fromatty) {
|
||||
printf("timedc> ");
|
||||
|
@ -131,6 +111,8 @@ cmdscanner(top)
|
|||
if (cmdline[0] == 0)
|
||||
break;
|
||||
makeargv();
|
||||
if (margv[0] == 0)
|
||||
continue;
|
||||
c = getcmd(margv[0]);
|
||||
if (c == (struct cmd *)-1) {
|
||||
printf("?Ambiguous command\n");
|
||||
|
@ -146,12 +128,21 @@ cmdscanner(top)
|
|||
}
|
||||
(*c->c_handler)(margc, margv);
|
||||
}
|
||||
longjmp(toplevel, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct cmd *
|
||||
getcmd(name)
|
||||
register char *name;
|
||||
void
|
||||
intr(signo)
|
||||
int signo;
|
||||
{
|
||||
if (!fromatty)
|
||||
exit(0);
|
||||
longjmp(toplevel, 1);
|
||||
}
|
||||
|
||||
|
||||
static struct cmd *
|
||||
getcmd(char *name)
|
||||
{
|
||||
register char *p, *q;
|
||||
register struct cmd *c, *found;
|
||||
|
@ -184,6 +175,7 @@ getcmd(name)
|
|||
/*
|
||||
* Slice a string up into argc/argv.
|
||||
*/
|
||||
void
|
||||
makeargv()
|
||||
{
|
||||
register char *cp;
|
||||
|
@ -211,6 +203,7 @@ makeargv()
|
|||
/*
|
||||
* Help command.
|
||||
*/
|
||||
void
|
||||
help(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
|
@ -261,7 +254,7 @@ help(argc, argv)
|
|||
else if (c == (struct cmd *)0)
|
||||
printf("?Invalid help command %s\n", arg);
|
||||
else
|
||||
printf("%-*s\t%s\n", HELPINDENT,
|
||||
printf("%-*s\t%s\n", (int)HELPINDENT,
|
||||
c->c_name, c->c_help);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 1983 Regents of the University of California.
|
||||
/*-
|
||||
* Copyright (c) 1985, 1993 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,27 +30,27 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)timedc.h 2.4 (Berkeley) 6/1/90
|
||||
* $Id: timedc.h,v 1.2 1993/08/01 17:55:07 mycroft Exp $
|
||||
* @(#)timedc.h 5.1 (Berkeley) 5/11/93
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
#ifdef sgi
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern int errno;
|
||||
|
||||
#define ON 1
|
||||
#define OFF 0
|
||||
|
||||
#define MSGS 6
|
||||
#define TRIALS 5
|
||||
|
||||
#define GOOD 1
|
||||
#define UNREACHABLE 2
|
||||
#define NONSTDTIME 3
|
||||
|
@ -59,6 +59,8 @@ extern int errno;
|
|||
struct cmd {
|
||||
char *c_name; /* command name */
|
||||
char *c_help; /* help message */
|
||||
int (*c_handler)(); /* routine to do the work */
|
||||
void (*c_handler)(); /* routine to do the work */
|
||||
int c_priv; /* privileged command */
|
||||
};
|
||||
|
||||
#include "timedc-extern.h"
|
||||
|
|
Loading…
Reference in New Issue