static char *RCSid
= "$Header: /f/osi/others/ntp/RCS/ntpdc.c,v 7.1 91/02/22 09:34:02 mrose Interim $";
* NTP query program - useful fro debugging - no major changes yet
* Revision 7.1 91/02/22 09:34:02 mrose
* Revision 7.0 90/12/10 17:21:43 mrose
* *** empty log message ***
* Revision 1.2 89/12/19 08:33:09 jpo
* Updated for ISODE 6.0ish
* Revision 1.1 89/06/15 20:37:02 jpo
#define WTIME 10 /* Time to wait for all responses */
#define STIME 500000 /* usec to wait for another response */
#define MAXPACKETSIZE 1500
struct sockaddr_in isock
= {AF_INET
};
char packet
[MAXPACKETSIZE
];
#define MAXHOSTNAMELEN 64
char LocalHostName
[MAXHOSTNAMELEN
+1]; /* our hostname */
char *LocalDomain
; /* our local domain name */
(void) gethostname(LocalHostName
, sizeof LocalHostName
);
if (p
= index(LocalHostName
, '.')) {
printf("usage: %s [ -v ][ -n ] hosts...\n", argv
[0]);
printf("--- %s ---\n", *argv
);
* Get a new socket each time - this will cause us to ignore
* packets from the previously queried host.
s
= socket(AF_INET
, SOCK_DGRAM
, 0);
if (setsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, &on
, sizeof (on
)) < 0) {
fprintf(stderr
, "setsockopt SO_RCVBUF\n");
printf("--- %s ---\n", *argv
);
register struct ntpinfo
*msg
= (struct ntpinfo
*) packet
;
register struct clockinfo
*n
;
int fromlen
= sizeof(from
);
struct timeval shorttime
;
* Listen for returning packets; may be more than one packet per
shorttime
.tv_usec
= STIME
;
(void) signal(SIGALRM
, timeout
);
while ((first
|| replies
) &&
(!timedout
|| select(FD_SETSIZE
, &bits
, (fd_set
*) 0,
(fd_set
*) 0, &shorttime
) > 0)) {
if ((cc
= recvfrom(s
, packet
, sizeof(packet
), 0,
(struct sockaddr
*)&from
, &fromlen
)) <= 0) {
if (cc
== 0 || errno
== EINTR
)
if (msg
->type
!= INFO_REPLY
)
if (msg
->version
!= NTPDC_VERSION
) {
printf("ntpd(%d) - ntpdc(%d) version mismatch\n",
msg
->version
, NTPDC_VERSION
);
replies
= (1L << msg
->npkts
) - 1;
printf(" (rem) Address (lcl) Strat Poll Reach Delay Offset Disp\n");
printf("==========================================================================\n");
replies
&= ~(1L << msg
->seq
);
n
= (struct clockinfo
*)&msg
[1];
for (count
= msg
->count
; count
> 0; count
--) {
printf("Timed out waiting for replies\n");
struct sockaddr_in watcher
;
register struct ntpdata
*msg
= (struct ntpdata
*) packet
;
static struct servent
*sp
= NULL
;
bzero((char *) &watcher
, sizeof(watcher
));
watcher
.sin_family
= AF_INET
;
HostAddr
= inet_addr (host
);
watcher
.sin_addr
.s_addr
= (u_long
) HostAddr
;
hp
= gethostbyname(host
);
fprintf(stderr
,"%s: unknown\n", host
);
bcopy(hp
->h_addr
, (char *) &watcher
.sin_addr
, hp
->h_length
);
sp
= getservbyname("ntp", "udp");
fprintf(stderr
,"udp/ntp: service unknown, using default %d\n",
watcher
.sin_port
= htons(NTP_PORT
);
watcher
.sin_port
= sp
->s_port
;
msg
->status
= NTPVERSION_1
;
msg
->stratum
= INFO_QUERY
;
if (connect(s
, (struct sockaddr
*) &watcher
, sizeof(watcher
))) {
if (send(s
, packet
, sizeof(struct ntpdata
), 0) < 0) {
double offset
[PEER_SHIFT
], delay
[PEER_SHIFT
], dsp
,del
,off
;
isock
.sin_addr
.s_addr
= n
->net_address
;
for (i
= 0; i
< PEER_SHIFT
; i
++) {
delay
[i
] = (double) ((long) (ntohl(n
->info_filter
.delay
[i
])/1000.0));
offset
[i
] = (double) ((long) (ntohl(n
->info_filter
.offset
[i
])/1000.0));
dsp
= (long) ntohl(n
->estdisp
); /* leave in milliseconds */
del
= (long) ntohl(n
->estdelay
); /* leave in milliseconds */
off
= (long) ntohl(n
->estoffset
); /* leave in milliseconds */
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 */
isock
.sin_addr
.s_addr
= n
->net_address
;
printf("%c%-15.15s ", c
, cvthname(&isock
));
isock
.sin_addr
.s_addr
= n
->my_address
;
printf("%-16.16s %2d %4d %03o %8.1f %8.1f %8.1f\n",
isock
.sin_addr
.s_addr
? inet_ntoa(isock
.sin_addr
) : "wildcard",
n
->stratum
, (int)ntohl((u_long
)n
->timer
),
ntohs(n
->reach
) & SHIFT_MASK
, del
, off
, dsp
);
struct in_addr clock_host
;
double offset
[PEER_SHIFT
], delay
[PEER_SHIFT
], dsp
,del
,off
;
isock
.sin_addr
.s_addr
= n
->net_address
;
for (i
= 0; i
< PEER_SHIFT
; i
++) {
delay
[i
] = (double) (long) ntohl(n
->info_filter
.delay
[i
]);
offset
[i
] = (double) (long) ntohl(n
->info_filter
.offset
[i
]);
dsp
= (double) ((long) ntohl(n
->estdisp
)); /* in milliseconds */
del
= (double) ((long) ntohl(n
->estdelay
)); /* in milliseconds */
off
= (double) ((long) ntohl(n
->estoffset
)); /* in milliseconds */
printf("Neighbor address %s port:%d",
inet_ntoa(isock
.sin_addr
), (int)ntohs(n
->port
));
isock
.sin_addr
.s_addr
= n
->my_address
;
printf(" local address %s\n", inet_ntoa(isock
.sin_addr
));
printf("Reach: 0%o stratum: %d, precision: %d\n",
ntohs(n
->reach
) & SHIFT_MASK
, n
->stratum
, n
->precision
);
printf("dispersion: %f, flags: %x, leap: %x\n",
if (n
->stratum
== 1 || n
->stratum
== 0) {
printf("Reference clock ID: %.4s", (char *)&n
->refid
);
clock_host
.s_addr
= (u_long
) n
->refid
;
printf("Reference clock ID: [%s]", inet_ntoa(clock_host
));
printf(" timestamp: %08lx.%08lx\n", ntohl(n
->reftime
.int_part
),
ntohl(n
->reftime
.fraction
));
printf("hpoll: %d, ppoll: %d, timer: %d, sent: %d received: %d\n",
(int)ntohl((u_long
)n
->timer
),
(int)ntohl(n
->pkt_rcvd
));
for (i
= 0; i
< PEER_SHIFT
; i
++)
printf("%7.2f ", delay
[i
]);
for (i
= 0; i
< PEER_SHIFT
; i
++)
printf("%7.2f ", offset
[i
]);
printf("\n\tdelay: %f offset: %f dsp %f\n", del
, off
, dsp
);
* Return a printable representation of a host address.
extern char *inet_ntoa();
if (f
->sin_family
!= AF_INET
) {
printf("Malformed from address\n");
hp
= gethostbyaddr(&f
->sin_addr
, sizeof(struct in_addr
),
return (inet_ntoa(f
->sin_addr
));
return (inet_ntoa(f
->sin_addr
));
if ((p
= index(hp
->h_name
, '.')) && strcmp(p
+ 1, LocalDomain
) == 0)