[Bug 1990] sntp output should include stratum.
bk: 4e485582OhAYfWIeUUzpFnhX6xCVVw
+* [Bug 1988] Better sntp send failed error message needed.
+* [Bug 1990] sntp output should include stratum.
(4.2.7p203) 2011/08/13 Released by Harlan Stenn <stenn@ntp.org>
* [Bug 1986] Require Visual C++ 2005 or later compilers in Windows port.
* Actually use long long for (u_)int64 by correcting spelling of
extern int syslogit;
extern int msyslog_term; /* duplicate to stdout/err */
+extern int msyslog_term_pid;
+extern int msyslog_include_timestamp;
extern FILE * syslog_file; /* if syslogit is FALSE, log to
this file and not syslog */
extern char * syslog_fname;
#endif
-int syslogit = 1;
+int syslogit = TRUE;
int msyslog_term = FALSE; /* duplicate to stdout/err */
+int msyslog_term_pid = TRUE;
+int msyslog_include_timestamp = TRUE;
FILE * syslog_file;
char * syslog_fname;
char * syslog_abs_fname;
FILE * term_file;
int log_to_term;
int log_to_file;
+ int pid;
const char * nl_or_empty;
const char * human_time;
return;
/* syslog() adds the timestamp, name, and pid */
- human_time = humanlogtime();
+ if (msyslog_include_timestamp)
+ human_time = humanlogtime();
+ else /* suppress gcc pot. uninit. warning */
+ human_time = NULL;
+ if (msyslog_term_pid || log_to_file)
+ pid = getpid();
+ else /* suppress gcc pot. uninit. warning */
+ pid = -1;
/* syslog() adds trailing \n if not present */
if ('\n' != msg[strlen(msg) - 1])
term_file = (level <= LOG_ERR)
? stderr
: stdout;
- fprintf(term_file, "%s %s[%d]: %s%s", human_time, prog,
- (int)getpid(), msg, nl_or_empty);
+ if (msyslog_include_timestamp)
+ fprintf(term_file, "%s ", human_time);
+ if (msyslog_term_pid)
+ fprintf(term_file, "%s[%d]: ", prog, pid);
+ fprintf(term_file, "%s%s", msg, nl_or_empty);
fflush(term_file);
}
if (log_to_file) {
- fprintf(syslog_file, "%s %s[%d]: %s%s", human_time,
- prog, (int)getpid(), msg, nl_or_empty);
+ if (msyslog_include_timestamp)
+ fprintf(syslog_file, "%s ", human_time);
+ fprintf(syslog_file, "%s[%d]: %s%s", prog, pid, msg,
+ nl_or_empty);
fflush(syslog_file);
}
}
const sockaddr_u *sock
)
{
+ int saved_errno;
char * res;
char * addr;
u_long scope;
+ saved_errno = socket_errno();
LIB_GETBUF(res);
- if (NULL == sock)
+ if (NULL == sock) {
strlcpy(res, "(null)", LIB_BUFLENGTH);
- else {
+ } else {
switch(AF(sock)) {
case AF_INET:
AF(sock));
}
}
+ errno = saved_errno;
+
return res;
}
const sockaddr_u *sock
)
{
+ int saved_errno;
const char * atext;
char * buf;
+ saved_errno = socket_errno();
atext = socktoa(sock);
LIB_GETBUF(buf);
snprintf(buf, LIB_BUFLENGTH,
? "[%s]:%hu"
: "%s:%hu",
atext, SRCPORT(sock));
+ errno = saved_errno;
return buf;
}
{
msyslog_term = TRUE;
init_logging(prog, 0, FALSE);
+ msyslog_term_pid = FALSE;
+ msyslog_include_timestamp = FALSE;
}
)
{
change_logfile(logfile, FALSE);
- msyslog(LOG_NOTICE, "%s\n", Version);
atexit(cleanup_log);
}
argv += optct;
debug = DESC(DEBUG_LEVEL).optOccCt;
- TRACE(1, ("%s\n", Version));
TRACE(2, ("init_lib() done, %s%s\n",
(ipv4_works)
if (HAVE_OPT(LOGFILE))
open_logfile(OPT_ARG(LOGFILE));
+ msyslog(LOG_INFO, "%s\n", Version);
+
if (0 == argc && !HAVE_OPT(BROADCAST) && !HAVE_OPT(CONCURRENT)) {
printf("%s: Must supply at least one of -b hostname, -c hostname, or hostname.\n",
progname);
struct timeval tv_xmt;
struct pkt x_pkt;
int pkt_len;
+ int sent;
if (0 != gettimeofday(&tv_xmt, NULL)) {
msyslog(LOG_ERR,
pkt_len = generate_pkt(&x_pkt, &tv_xmt, dctx->key_id,
dctx->key);
- /* The current sendpkt does not return status */
- sendpkt(sock, dst, &x_pkt, pkt_len);
- /* Save the packet we sent... */
- memcpy(&spkt->x_pkt, &x_pkt, min(sizeof(spkt->x_pkt), pkt_len));
- spkt->stime = tv_xmt.tv_sec - JAN_1970;
-
- TRACE(2, ("xmt: %lx.%6.6u %s %s\n", (u_long)tv_xmt.tv_sec,
- (u_int)tv_xmt.tv_usec, dctx->name, stoa(dst)));
+ sent = sendpkt(sock, dst, &x_pkt, pkt_len);
+ if (sent) {
+ /* Save the packet we sent... */
+ memcpy(&spkt->x_pkt, &x_pkt, min(sizeof(spkt->x_pkt),
+ pkt_len));
+ spkt->stime = tv_xmt.tv_sec - JAN_1970;
- /*
- ** If the send fails:
- ** - decrement n_pending_ntp
- ** - restart the loop
- */
+ TRACE(2, ("xmt: %lx.%6.6u %s %s\n", (u_long)tv_xmt.tv_sec,
+ (u_int)tv_xmt.tv_usec, dctx->name, stoa(dst)));
+ } else {
+ dec_pending_ntp(dctx->name, dst);
+ }
return;
}
check_exit_conditions();
} else {
INSIST(0 == n_pending_ntp);
- TRACE(1, ("n_pending_ntp reached zero before dec for %s %s\n",
- name, stoa(server)));
+ TRACE(1, ("n_pending_ntp reached zero before dec for %s\n",
+ hostnameaddr(name, server)));
}
}
spkt->done = TRUE;
server = &spkt->addr;
- msyslog(LOG_NOTICE, "%s %s no response after %d seconds",
- spkt->dctx->name, stoa(server), ucst_timeout);
+ msyslog(LOG_INFO, "%s no response after %d seconds",
+ hostnameaddr(spkt->dctx->name, server), ucst_timeout);
dec_pending_ntp(spkt->dctx->name, server);
}
const char * hostname
)
{
+ char disptxt[32];
const char * addrtxt;
struct timeval tv_dst;
+ int cnt;
int sw_case;
int digits;
+ int stratum;
char * ref;
char * ts_str;
double offset;
digits = 6;
ts_str = tv_to_str(&tv_dst);
- printf("%s %+.*f", ts_str, digits, offset);
- if (root_dispersion > 0.)
- printf(" +/- %f ", root_dispersion);
- printf(" %s %s%s\n", hostname, stoa(host),
- (time_adjusted)
- ? " [excess]"
- : "");
+ stratum = rpkt->stratum;
+ if (0 == stratum)
+ stratum = 16;
+
+ if (root_dispersion > 0) {
+ cnt = snprintf(disptxt, sizeof(disptxt),
+ " +/- %f", root_dispersion);
+ if (cnt >= sizeof(disptxt))
+ snprintf(disptxt, sizeof(disptxt),
+ "ERROR %d >= %d", cnt,
+ (int)sizeof(disptxt));
+ } else {
+ disptxt[0] = '\0';
+ }
+
+ msyslog(LOG_INFO, "%s %+.*f%s %s s%d%s\n", ts_str,
+ digits, offset, disptxt,
+ hostnameaddr(hostname, host), stratum,
+ (time_adjusted)
+ ? " [excess]"
+ : "");
free(ts_str);
if (p_SNTP_PRETEND_TIME)
/* Send a packet */
-void
+int
sendpkt (
SOCKET rsock,
sockaddr_u *dest,
printf("sntp sendpkt: Packet data:\n");
pkt_output(pkt, len, stdout);
}
-
- if (debug) {
- printf("sntp sendpkt: Sending packet to %s ...\n", sptoa(dest));
- }
#endif
+ TRACE(1, ("sntp sendpkt: Sending packet to %s ...\n",
+ sptoa(dest)));
- cc = sendto(rsock, (void *)pkt, len, 0, &dest->sa, SOCKLEN(dest));
+ cc = sendto(rsock, (void *)pkt, len, 0, &dest->sa,
+ SOCKLEN(dest));
if (cc == SOCKET_ERROR) {
-#ifdef DEBUG
- printf("sntp sendpkt: Socket error: %i. Couldn't send packet!\n", cc);
-#endif
- if (errno != EWOULDBLOCK && errno != ENOBUFS) {
- /* oh well */
- }
- } else {
- TRACE(3, ("Packet sent.\n"));
+ msyslog(LOG_ERR, "Send to %s failed, %m\n",
+ sptoa(dest));
+ return FALSE;
}
+ TRACE(1, ("Packet sent.\n"));
+
+ return TRUE;
}
#define KOD_RATE -5 /* KOD packet with code RATE, reduce poll intervall */
#define BROADCAST_FAILED -6
-
-/* From ntpdate.c */
-void sendpkt(SOCKET rsock, sockaddr_u *dest, struct pkt *pkt, int len);
+/* prototypes */
+int sendpkt(SOCKET rsock, sockaddr_u *dest, struct pkt *pkt, int len);
int recvdata(SOCKET rsock, sockaddr_u *sender, void *rdata,
int rdata_len);
int recvpkt(SOCKET rsock, struct pkt *rpkt, unsigned int rsize,
return buf;
}
+
+/*
+ *
+ * hostnameaddr()
+ *
+ * Formats the hostname and resulting numeric IP address into a string,
+ * avoiding duplication if the "hostname" was in fact a numeric address.
+ *
+ */
+const char *
+hostnameaddr(
+ const char * hostname,
+ const sockaddr_u * addr
+ )
+{
+ const char * addrtxt;
+ char * result;
+ int cnt;
+
+ addrtxt = stoa(addr);
+ LIB_GETBUF(result);
+ if (strcmp(hostname, addrtxt))
+ cnt = snprintf(result, LIB_BUFLENGTH, "%s %s",
+ hostname, addrtxt);
+ else
+ cnt = snprintf(result, LIB_BUFLENGTH, "%s", addrtxt);
+ if (cnt >= LIB_BUFLENGTH)
+ snprintf(result, LIB_BUFLENGTH,
+ "hostnameaddr ERROR have %d (%d needed)",
+ LIB_BUFLENGTH, cnt + 1);
+
+ return result;
+}
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
-#include <ntp_stdlib.h>
-#include <ntp_fp.h>
-#include <ntp.h>
+
+#include "ntp.h"
+#include "ntp_stdlib.h"
+#include "lib_strbuf.h"
#define HLINE "--------------------------------------------------------------------------------\n"
#define PHLINE fprintf(output, HLINE);
#define STDLINE printf(HLINE);
-void pkt_output (struct pkt *dpkg, int pkt_length, FILE *output);
-void l_fp_output (l_fp *ts, FILE *output);
-void l_fp_output_bin (l_fp *ts, FILE *output);
-void l_fp_output_dec (l_fp *ts, FILE *output);
+void pkt_output(struct pkt *dpkg, int pkt_length, FILE *output);
+void l_fp_output(l_fp *ts, FILE *output);
+void l_fp_output_bin(l_fp *ts, FILE *output);
+void l_fp_output_dec(l_fp *ts, FILE *output);
-char *addrinfo_to_str (const struct addrinfo *addr);
-char *ss_to_str (sockaddr_u *saddr);
-char *tv_to_str (const struct timeval *tv);
+char *addrinfo_to_str(const struct addrinfo *addr);
+char *ss_to_str(sockaddr_u *saddr);
+char *tv_to_str(const struct timeval *tv);
+const char * hostnameaddr(const char *, const sockaddr_u *);
-#endif
+#endif /* UTILITIES_H */