summaryrefslogtreecommitdiff
path: root/ntpq/ntpq-subs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ntpq/ntpq-subs.c')
-rw-r--r--ntpq/ntpq-subs.c364
1 files changed, 213 insertions, 151 deletions
diff --git a/ntpq/ntpq-subs.c b/ntpq/ntpq-subs.c
index 8495e2059ef66..3020cc5c22a75 100644
--- a/ntpq/ntpq-subs.c
+++ b/ntpq/ntpq-subs.c
@@ -84,7 +84,7 @@ static void timerstats (struct parse *, FILE *);
*/
struct xcmd opcmds[] = {
{ "saveconfig", saveconfig, { NTP_STR, NO, NO, NO },
- { "filename", "", "", ""},
+ { "filename", "", "", ""},
"save ntpd configuration to file, . for current config file"},
{ "associations", associations, { NO, NO, NO, NO },
{ "", "", "", "" },
@@ -358,6 +358,10 @@ static void another_ifstats_field(int *, ifstats_row *, FILE *);
static void collect_display_vdc(associd_t as, vdc *table,
int decodestatus, FILE *fp);
+static int xprintf(FILE *, char const *, ...) NTP_PRINTF(2, 3);
+static int xputs(char const *, FILE *);
+static int xputc(int, FILE *);
+
/*
* static globals
*/
@@ -383,6 +387,43 @@ static const qsort_cmp mru_qcmp_table[MRUSORT_MAX] = {
};
/*
+ * NULL-pointer safe FILE I/O: use stderr if no file supplied.
+ */
+static int
+xprintf(
+ FILE * ofp,
+ char const * fmt,
+ ...
+ )
+{
+ va_list va;
+ int rc;
+
+ va_start(va, fmt);
+ rc = vfprintf((ofp ? ofp : stderr), fmt, va);
+ va_end(va);
+ return rc;
+}
+
+static int
+xputs(
+ char const * str,
+ FILE * ofp
+ )
+{
+ return fputs(str, (ofp ? ofp : stderr));
+}
+
+static int
+xputc(
+ int ch,
+ FILE * ofp
+ )
+{
+ return fputc(ch, (ofp ? ofp : stderr));
+}
+
+/*
* checkassocid - return the association ID, checking to see if it is valid
*/
static associd_t
@@ -396,7 +437,7 @@ checkassocid(
associd = (associd_t)value;
if (0 == associd || value != associd) {
ulvalue = value;
- fprintf(stderr,
+ xprintf(stderr,
"***Invalid association ID %lu specified\n",
ulvalue);
return 0;
@@ -449,7 +490,7 @@ doaddvlist(
INSIST(name && value);
vl = findlistvar(vlist, name);
if (NULL == vl) {
- fprintf(stderr, "Variable list full\n");
+ xprintf(stderr, "Variable list full\n");
return;
}
@@ -485,7 +526,7 @@ dormvlist(
INSIST(name && value);
vl = findlistvar(vlist, name);
if (vl == 0 || vl->name == 0) {
- (void) fprintf(stderr, "Variable `%s' not found\n",
+ (void) xprintf(stderr, "Variable `%s' not found\n",
name);
} else {
free((void *)(intptr_t)vl->name);
@@ -549,7 +590,7 @@ makequerydata(
valuelen = strlen(vl->value);
totallen = namelen + valuelen + (valuelen != 0) + (cp != data);
if (cp + totallen > cpend) {
- fprintf(stderr,
+ xprintf(stderr,
"***Ignoring variables starting with `%s'\n",
vl->name);
break;
@@ -606,14 +647,14 @@ doprintvlist(
size_t n;
if (NULL == vlist->name) {
- fprintf(fp, "No variables on list\n");
+ xprintf(fp, "No variables on list\n");
return;
}
for (n = 0; n < MAXLIST && vlist[n].name != NULL; n++) {
if (NULL == vlist[n].value)
- fprintf(fp, "%s\n", vlist[n].name);
+ xprintf(fp, "%s\n", vlist[n].name);
else
- fprintf(fp, "%s=%s\n", vlist[n].name,
+ xprintf(fp, "%s=%s\n", vlist[n].name,
vlist[n].value);
}
}
@@ -707,13 +748,13 @@ dolist(
return 0;
if (numhosts > 1)
- fprintf(fp, "server=%s ", currenthost);
+ xprintf(fp, "server=%s ", currenthost);
if (dsize == 0) {
if (associd == 0)
- fprintf(fp, "No system%s variables returned\n",
+ xprintf(fp, "No system%s variables returned\n",
(type == TYPE_CLOCK) ? " clock" : "");
else
- fprintf(fp,
+ xprintf(fp,
"No information returned for%s association %u\n",
(type == TYPE_CLOCK) ? " clock" : "",
associd);
@@ -721,7 +762,7 @@ dolist(
}
if (!quiet)
- fprintf(fp, "associd=%u ", associd);
+ xprintf(fp, "associd=%u ", associd);
printvars(dsize, datap, (int)rstatus, type, quiet, fp);
return 1;
}
@@ -788,11 +829,11 @@ writelist(
return;
if (numhosts > 1)
- (void) fprintf(fp, "server=%s ", currenthost);
+ (void) xprintf(fp, "server=%s ", currenthost);
if (dsize == 0)
- (void) fprintf(fp, "done! (no data returned)\n");
+ (void) xprintf(fp, "done! (no data returned)\n");
else {
- (void) fprintf(fp,"associd=%u ", associd);
+ (void) xprintf(fp,"associd=%u ", associd);
printvars(dsize, datap, (int)rstatus,
(associd != 0) ? TYPE_PEER : TYPE_SYS, 0, fp);
}
@@ -873,11 +914,11 @@ writevar(
return;
if (numhosts > 1)
- fprintf(fp, "server=%s ", currenthost);
+ xprintf(fp, "server=%s ", currenthost);
if (dsize == 0)
- fprintf(fp, "done! (no data returned)\n");
+ xprintf(fp, "done! (no data returned)\n");
else {
- fprintf(fp,"associd=%u ", associd);
+ xprintf(fp,"associd=%u ", associd);
type = (0 == associd)
? TYPE_SYS
: TYPE_PEER;
@@ -976,7 +1017,7 @@ findassidrange(
}
for (a = 0; a < COUNTOF(assids); a++)
if (-1 == ind[a]) {
- fprintf(stderr,
+ xprintf(stderr,
"***Association ID %u not found in list\n",
assids[a]);
return 0;
@@ -1013,7 +1054,7 @@ mreadlist(
for (i = from; i <= to; i++) {
if (i != from)
- fprintf(fp, "\n");
+ xprintf(fp, "\n");
if (!dolist(g_varlist, assoc_cache[i].assid,
CTL_OP_READVAR, TYPE_PEER, fp))
return;
@@ -1084,15 +1125,15 @@ dogetassoc(
if (dsize == 0) {
if (numhosts > 1)
- fprintf(fp, "server=%s ", currenthost);
- fprintf(fp, "No association ID's returned\n");
+ xprintf(fp, "server=%s ", currenthost);
+ xprintf(fp, "No association ID's returned\n");
return 0;
}
if (dsize & 0x3) {
if (numhosts > 1)
- fprintf(stderr, "server=%s ", currenthost);
- fprintf(stderr,
+ xprintf(stderr, "server=%s ", currenthost);
+ xprintf(stderr,
"***Server returned %zu octets, should be multiple of 4\n",
dsize);
return 0;
@@ -1112,13 +1153,13 @@ dogetassoc(
datap += sizeof(*pus);
dsize -= 2 * sizeof(*pus);
if (debug) {
- fprintf(stderr, "[%u] ",
+ xprintf(stderr, "[%u] ",
assoc_cache[numassoc].assid);
}
numassoc++;
}
if (debug) {
- fprintf(stderr, "\n%d associations total\n", numassoc);
+ xprintf(stderr, "\n%d associations total\n", numassoc);
}
sortassoc();
return 1;
@@ -1147,16 +1188,16 @@ printassoc(
char buf[128];
if (numassoc == 0) {
- (void) fprintf(fp, "No association ID's in list\n");
+ (void) xprintf(fp, "No association ID's in list\n");
return;
}
/*
* Output a header
*/
- (void) fprintf(fp,
+ (void) xprintf(fp,
"ind assid status conf reach auth condition last_event cnt\n");
- (void) fprintf(fp,
+ (void) xprintf(fp,
"===========================================================\n");
for (i = 0; i < numassoc; i++) {
statval = (u_char) CTL_PEER_STATVAL(assoc_cache[i].status);
@@ -1307,7 +1348,7 @@ printassoc(
while (bp > buf && ' ' == bp[-1])
--bp;
bp[0] = '\0';
- fprintf(fp, "%s\n", buf);
+ xprintf(fp, "%s\n", buf);
}
}
@@ -1386,7 +1427,7 @@ saveconfig(
if (0 == pcmd->nargs)
return;
-
+
res = doquery(CTL_OP_SAVECONFIG, 0, 1,
strlen(pcmd->argval[0].string),
pcmd->argval[0].string, &rstatus, &dsize,
@@ -1396,9 +1437,9 @@ saveconfig(
return;
if (0 == dsize)
- fprintf(fp, "(no response message, curiously)");
+ xprintf(fp, "(no response message, curiously)");
else
- fprintf(fp, "%.*s", (int)dsize, datap); /* cast is wobbly */
+ xprintf(fp, "%.*s", (int)dsize, datap); /* cast is wobbly */
}
@@ -1425,9 +1466,9 @@ radiostatus(
return;
if (numhosts > 1)
- (void) fprintf(fp, "server=%s ", currenthost);
+ (void) xprintf(fp, "server=%s ", currenthost);
if (dsize == 0) {
- (void) fprintf(fp, "No radio status string returned\n");
+ (void) xprintf(fp, "No radio status string returned\n");
return;
}
@@ -1654,7 +1695,7 @@ doprintpeers(
* data for it...
*/
get_systime(&ts);
-
+
have_srchost = FALSE;
have_dstadr = FALSE;
have_da_rid = FALSE;
@@ -1672,7 +1713,7 @@ doprintpeers(
if (!strcmp("srcadr", name) ||
!strcmp("peeradr", name)) {
if (!decodenetnum(value, &srcadr))
- fprintf(stderr, "malformed %s=%s\n",
+ xprintf(stderr, "malformed %s=%s\n",
name, value);
} else if (!strcmp("srchost", name)) {
if (pvl == peervarlist || pvl == apeervarlist) {
@@ -1733,7 +1774,7 @@ doprintpeers(
ZERO(u32);
memcpy(&u32, value, drlen);
dstadr_refid = refid_str(u32, 1);
- //fprintf(stderr, "apeervarlist S1 refid: value=<%s>\n", value);
+ //xprintf(stderr, "apeervarlist S1 refid: value=<%s>\n", value);
} else if (decodenetnum(value, &refidadr)) {
if (SOCK_UNSPEC(&refidadr))
dstadr_refid = "0.0.0.0";
@@ -1747,9 +1788,9 @@ doprintpeers(
snprintf(buf, 10,
"%0x", i);
dstadr_refid = buf;
- //fprintf(stderr, "apeervarlist refid: value=<%x>\n", i);
+ //xprintf(stderr, "apeervarlist refid: value=<%x>\n", i);
}
- //fprintf(stderr, "apeervarlist refid: value=<%s>\n", value);
+ //xprintf(stderr, "apeervarlist refid: value=<%s>\n", value);
} else {
have_da_rid = FALSE;
}
@@ -1786,7 +1827,7 @@ doprintpeers(
} else if (!strcmp("flash", name)) {
decodeuint(value, &flash);
} else {
- // fprintf(stderr, "UNRECOGNIZED name=%s ", name);
+ // xprintf(stderr, "UNRECOGNIZED name=%s ", name);
}
}
@@ -1850,7 +1891,7 @@ doprintpeers(
else
serverlocal = currenthost;
}
- fprintf(fp, "%-*s ", (int)maxhostlen, serverlocal);
+ xprintf(fp, "%-*s ", (int)maxhostlen, serverlocal);
}
if (AF_UNSPEC == af || AF(&srcadr) == af) {
if (!have_srchost)
@@ -1859,13 +1900,13 @@ doprintpeers(
/* wide and long source - space over on next line */
/* allow for host + sp if > 1 and regular tally + source + sp */
if (wideremote && 15 < strlen(clock_name))
- fprintf(fp, "%c%s\n%*s", c, clock_name,
+ xprintf(fp, "%c%s\n%*s", c, clock_name,
((numhosts > 1) ? (int)maxhostlen + 1 : 0)
+ 1 + 15 + 1, "");
else
- fprintf(fp, "%c%-15.15s ", c, clock_name);
+ xprintf(fp, "%c%-15.15s ", c, clock_name);
if ((flash & TEST12) && (pvl != opeervarlist)) {
- drlen = fprintf(fp, "(loop)");
+ drlen = xprintf(fp, "(loop)");
} else if (!have_da_rid) {
drlen = 0;
} else {
@@ -1874,24 +1915,24 @@ doprintpeers(
}
if (pvl == apeervarlist) {
while (drlen++ < 9)
- fputc(' ', fp);
- fprintf(fp, "%-6d", associd);
+ xputc(' ', fp);
+ xprintf(fp, "%-6d", associd);
} else {
while (drlen++ < 15)
- fputc(' ', fp);
+ xputc(' ', fp);
}
- fprintf(fp,
+ xprintf(fp,
" %2ld %c %4.4s %4.4s %3lo %7.7s %8.7s %7.7s\n",
stratum, type,
prettyinterval(whenbuf, sizeof(whenbuf),
when(&ts, &rec, &reftime)),
- prettyinterval(pollbuf, sizeof(pollbuf),
+ prettyinterval(pollbuf, sizeof(pollbuf),
(int)poll_sec),
- reach, lfptoms(&estdelay, 3),
+ reach, ulfptoms(&estdelay, 3),
lfptoms(&estoffset, 3),
(have_jitter)
- ? lfptoms(&estjitter, 3)
- : lfptoms(&estdisp, 3));
+ ? ulfptoms(&estjitter, 3)
+ : ulfptoms(&estdisp, 3));
return (1);
}
else
@@ -1932,8 +1973,8 @@ dogetpeers(
if (dsize == 0) {
if (numhosts > 1)
- fprintf(stderr, "server=%s ", currenthost);
- fprintf(stderr,
+ xprintf(stderr, "server=%s ", currenthost);
+ xprintf(stderr,
"***No information returned for association %u\n",
associd);
return 0;
@@ -1971,14 +2012,14 @@ dopeers(
}
}
if (numhosts > 1)
- fprintf(fp, "%-*.*s ", (int)maxhostlen, (int)maxhostlen,
+ xprintf(fp, "%-*.*s ", (int)maxhostlen, (int)maxhostlen,
"server (local)");
- fprintf(fp,
+ xprintf(fp,
" remote refid st t when poll reach delay offset jitter\n");
if (numhosts > 1)
for (u = 0; u <= maxhostlen; u++)
- fprintf(fp, "=");
- fprintf(fp,
+ xprintf(fp, "=");
+ xprintf(fp,
"==============================================================================\n");
for (u = 0; u < numassoc; u++) {
@@ -1986,7 +2027,7 @@ dopeers(
!(CTL_PEER_STATVAL(assoc_cache[u].status)
& (CTL_PST_CONFIG|CTL_PST_REACH))) {
if (debug)
- fprintf(stderr, "eliding [%d]\n",
+ xprintf(stderr, "eliding [%d]\n",
(int)assoc_cache[u].assid);
continue;
}
@@ -2025,14 +2066,14 @@ doapeers(
}
}
if (numhosts > 1)
- fprintf(fp, "%-*.*s ", (int)maxhostlen, (int)maxhostlen,
+ xprintf(fp, "%-*.*s ", (int)maxhostlen, (int)maxhostlen,
"server (local)");
- fprintf(fp,
+ xprintf(fp,
" remote refid assid st t when poll reach delay offset jitter\n");
if (numhosts > 1)
for (u = 0; u <= maxhostlen; u++)
- fprintf(fp, "=");
- fprintf(fp,
+ xprintf(fp, "=");
+ xprintf(fp,
"==============================================================================\n");
for (u = 0; u < numassoc; u++) {
@@ -2040,7 +2081,7 @@ doapeers(
!(CTL_PEER_STATVAL(assoc_cache[u].status)
& (CTL_PST_CONFIG|CTL_PST_REACH))) {
if (debug)
- fprintf(stderr, "eliding [%d]\n",
+ xprintf(stderr, "eliding [%d]\n",
(int)assoc_cache[u].assid);
continue;
}
@@ -2145,14 +2186,14 @@ doopeers(
maxhostlen = strlen(fullname);
}
if (numhosts > 1)
- fprintf(fp, "%-*.*s ", (int)maxhostlen, (int)maxhostlen,
+ xprintf(fp, "%-*.*s ", (int)maxhostlen, (int)maxhostlen,
"server");
- fprintf(fp,
+ xprintf(fp,
" remote local st t when poll reach delay offset disp\n");
if (numhosts > 1)
for (i = 0; i <= maxhostlen; ++i)
- fprintf(fp, "=");
- fprintf(fp,
+ xprintf(fp, "=");
+ xprintf(fp,
"==============================================================================\n");
for (i = 0; i < numassoc; i++) {
@@ -2211,10 +2252,10 @@ lopeers(
}
-/*
+/*
* config - send a configuration command to a remote host
*/
-static void
+static void
config (
struct parse *pcmd,
FILE *fp
@@ -2232,7 +2273,7 @@ config (
cfgcmd = pcmd->argval[0].string;
if (debug > 2)
- fprintf(stderr,
+ xprintf(stderr,
"In Config\n"
"Keyword = %s\n"
"Command = %s\n", pcmd->keyword, cfgcmd);
@@ -2255,27 +2296,27 @@ config (
if (1 == sscanf(resp, "column %d syntax error", &col)
&& col >= 0 && (size_t)col <= strlen(cfgcmd) + 1) {
if (interactive)
- fputs(" *", stdout); /* "ntpq> :config " */
+ xputs(" *", stdout); /* "ntpq> :config " */
else
printf("%s\n", cfgcmd);
for (i = 0; i < col; i++)
- fputc('_', stdout);
- fputs("^\n", stdout);
+ xputc('_', stdout);
+ xputs("^\n", stdout);
}
printf("%s\n", resp);
free(resp);
}
-/*
+/*
* config_from_file - remotely configure an ntpd daemon using the
* specified configuration file
* SK: This function is a kludge at best and is full of bad design
* bugs:
* 1. ntpq uses UDP, which means that there is no guarantee of in-order,
- * error-free delivery.
+ * error-free delivery.
* 2. The maximum length of a packet is constrained, and as a result, the
- * maximum length of a line in a configuration file is constrained.
+ * maximum length of a line in a configuration file is constrained.
* Longer lines will lead to unpredictable results.
* 3. Since this function is sending a line at a time, we can't update
* the control key through the configuration file (YUCK!!)
@@ -2284,7 +2325,7 @@ config (
* on the assumption that 'int' can hold the size of the involved
* buffers without overflow.
*/
-static void
+static void
config_from_file (
struct parse *pcmd,
FILE *fp
@@ -2302,7 +2343,7 @@ config_from_file (
int retry_limit;
if (debug > 2)
- fprintf(stderr,
+ xprintf(stderr,
"In Config\n"
"Keyword = %s\n"
"Filename = %s\n", pcmd->keyword,
@@ -2323,7 +2364,7 @@ config_from_file (
config_len = (NULL != cp)
? (size_t)(cp - config_cmd)
: strlen(config_cmd);
-
+
/* [Bug 3015] make sure there's no trailing whitespace;
* the fix for [Bug 2853] on the server side forbids
* those. And don't transmit empty lines, as this would
@@ -2339,7 +2380,7 @@ config_from_file (
continue;
retry_limit = 2;
- do
+ do
res = doquery(CTL_OP_CONFIGURE, 0, 1,
config_len, config_cmd,
&rstatus, &rsize, &rdata);
@@ -2386,13 +2427,13 @@ fetch_nonce(
qres = doquery(CTL_OP_REQ_NONCE, 0, 0, 0, NULL, &rstatus,
&rsize, &rdata);
if (qres) {
- fprintf(stderr, "nonce request failed\n");
+ xprintf(stderr, "nonce request failed\n");
return FALSE;
}
if ((size_t)rsize <= sizeof(nonce_eq) - 1 ||
strncmp(rdata, nonce_eq, sizeof(nonce_eq) - 1)) {
- fprintf(stderr, "unexpected nonce response format: %.*s\n",
+ xprintf(stderr, "unexpected nonce response format: %.*s\n",
(int)rsize, rdata); /* cast is wobbly */
return FALSE;
}
@@ -2406,7 +2447,7 @@ fetch_nonce(
chars--;
nonce[chars] = '\0';
}
-
+
return TRUE;
}
@@ -2433,7 +2474,7 @@ add_mru(
break;
if (mon != NULL) {
if (!L_ISGEQ(&add->first, &mon->first)) {
- fprintf(stderr,
+ xprintf(stderr,
"add_mru duplicate %s new first ts %08x.%08x precedes prior %08x.%08x\n",
sptoa(&add->addr), add->last.l_ui,
add->last.l_uf, mon->last.l_ui,
@@ -2523,7 +2564,7 @@ collect_mru_list(
l_fp last_older;
sockaddr_u addr_older;
int have_now;
- int have_addr_older;
+ int have_addr_older;
int have_last_older;
u_int restarted_count;
u_int nonce_uses;
@@ -2561,7 +2602,7 @@ collect_mru_list(
while (TRUE) {
if (debug)
- fprintf(stderr, "READ_MRU parms: %s\n", req_buf);
+ xprintf(stderr, "READ_MRU parms: %s\n", req_buf);
qres = doqueryex(CTL_OP_READ_MRU, 0, 0,
strlen(req_buf), req_buf,
@@ -2573,14 +2614,14 @@ collect_mru_list(
* toss them from our list and try again.
*/
if (debug)
- fprintf(stderr,
+ xprintf(stderr,
"no overlap between %d prior entries and server MRU list\n",
ri);
while (ri--) {
recent = HEAD_DLIST(mru_list, mlink);
INSIST(recent != NULL);
if (debug)
- fprintf(stderr,
+ xprintf(stderr,
"tossing prior entry %s to resync\n",
sptoa(&recent->addr));
UNLINK_DLIST(recent, mlink);
@@ -2594,7 +2635,7 @@ collect_mru_list(
if (NULL == HEAD_DLIST(mru_list, mlink)) {
restarted_count++;
if (restarted_count > 8) {
- fprintf(stderr,
+ xprintf(stderr,
"Giving up after 8 restarts from the beginning.\n"
"With high-traffic NTP servers, this can occur if the\n"
"MRU list is limited to less than about 16 seconds' of\n"
@@ -2602,26 +2643,26 @@ collect_mru_list(
goto cleanup_return;
}
if (debug)
- fprintf(stderr,
- "---> Restarting from the beginning, retry #%u\n",
+ xprintf(stderr,
+ "---> Restarting from the beginning, retry #%u\n",
restarted_count);
}
} else if (CERR_UNKNOWNVAR == qres) {
- fprintf(stderr,
+ xprintf(stderr,
"CERR_UNKNOWNVAR from ntpd but no priors given.\n");
goto cleanup_return;
} else if (CERR_BADVALUE == qres) {
if (cap_frags) {
cap_frags = FALSE;
if (debug)
- fprintf(stderr,
+ xprintf(stderr,
"Reverted to row limit from fragments limit.\n");
} else {
/* ntpd has lower cap on row limit */
ntpd_row_limit--;
limit = min(limit, ntpd_row_limit);
if (debug)
- fprintf(stderr,
+ xprintf(stderr,
"Row limit reduced to %d following CERR_BADVALUE.\n",
limit);
}
@@ -2634,13 +2675,13 @@ collect_mru_list(
if (cap_frags) {
frags = max(2, frags / 2);
if (debug)
- fprintf(stderr,
+ xprintf(stderr,
"Frag limit reduced to %d following incomplete response.\n",
frags);
} else {
limit = max(2, limit / 2);
if (debug)
- fprintf(stderr,
+ xprintf(stderr,
"Row limit reduced to %d following incomplete response.\n",
limit);
}
@@ -2654,7 +2695,7 @@ collect_mru_list(
* dump similar output after the list is collected by
* ntpq with a continuous sequence of indexes. This
* cheap approach has indexes resetting to zero for
- * each query/response, and duplicates are not
+ * each query/response, and duplicates are not
* coalesced.
*/
if (!qres && rawmode)
@@ -2665,20 +2706,20 @@ collect_mru_list(
while (!qres && nextvar(&rsize, &rdata, &tag, &val)) {
INSIST(tag && val);
if (debug > 1)
- fprintf(stderr, "nextvar gave: %s = %s\n",
+ xprintf(stderr, "nextvar gave: %s = %s\n",
tag, val);
switch(tag[0]) {
case 'a':
if (!strcmp(tag, "addr.older")) {
if (!have_last_older) {
- fprintf(stderr,
+ xprintf(stderr,
"addr.older %s before last.older\n",
val);
goto cleanup_return;
}
if (!decodenetnum(val, &addr_older)) {
- fprintf(stderr,
+ xprintf(stderr,
"addr.older %s garbled\n",
val);
goto cleanup_return;
@@ -2692,14 +2733,14 @@ collect_mru_list(
&recent->addr))
break;
if (NULL == recent) {
- fprintf(stderr,
+ xprintf(stderr,
"addr.older %s not in hash table\n",
val);
goto cleanup_return;
}
if (!L_ISEQU(&last_older,
&recent->last)) {
- fprintf(stderr,
+ xprintf(stderr,
"last.older %08x.%08x mismatches %08x.%08x expected.\n",
last_older.l_ui,
last_older.l_uf,
@@ -2720,7 +2761,7 @@ collect_mru_list(
if ('0' != val[0] ||
'x' != val[1] ||
!hextolfp(val + 2, &last_older)) {
- fprintf(stderr,
+ xprintf(stderr,
"last.older %s garbled\n",
val);
goto cleanup_return;
@@ -2728,13 +2769,13 @@ collect_mru_list(
have_last_older = TRUE;
} else if (!strcmp(tag, "last.newest")) {
if (0 != got) {
- fprintf(stderr,
+ xprintf(stderr,
"last.newest %s before complete row, got = 0x%x\n",
val, (u_int)got);
goto cleanup_return;
}
if (!have_now) {
- fprintf(stderr,
+ xprintf(stderr,
"last.newest %s before now=\n",
val);
goto cleanup_return;
@@ -2746,7 +2787,7 @@ collect_mru_list(
!hextolfp(val + 2, &newest) ||
!L_ISEQU(&newest,
&head->last)) {
- fprintf(stderr,
+ xprintf(stderr,
"last.newest %s mismatches %08x.%08x",
val,
head->last.l_ui,
@@ -2822,7 +2863,7 @@ collect_mru_list(
break;
default:
- nomatch:
+ nomatch:
/* empty stmt */ ;
/* ignore unknown tags */
}
@@ -2838,7 +2879,7 @@ collect_mru_list(
fflush(stdout);
}
if (list_complete || mrulist_interrupted) {
- fprintf(stderr,
+ xprintf(stderr,
"\rRetrieved %u unique MRU entries and %u updates.\n",
mru_count, mru_dupes);
fflush(stderr);
@@ -2846,7 +2887,7 @@ collect_mru_list(
}
if (time(NULL) >= next_report) {
next_report += MRU_REPORT_SECS;
- fprintf(stderr, "\r%u (%u updates) ", mru_count,
+ xprintf(stderr, "\r%u (%u updates) ", mru_count,
mru_dupes);
fflush(stderr);
}
@@ -2870,7 +2911,7 @@ collect_mru_list(
* If there were no errors, increase the number of rows
* to a maximum of 3 * MAXFRAGS (the most packets ntpq
* can handle in one response), on the assumption that
- * no less than 3 rows fit in each packet, capped at
+ * no less than 3 rows fit in each packet, capped at
* our best guess at the server's row limit.
*/
if (!qres) {
@@ -3007,7 +3048,7 @@ qcmp_mru_count(
pm1 = *ppm1;
pm2 = *ppm2;
-
+
return (pm1->count < pm2->count)
? -1
: ((pm1->count == pm2->count)
@@ -3102,7 +3143,7 @@ qcmp_mru_r_avgint(
* timestamps. mrulist shows 0 avgint, monlist shows a value identical
* to lstint.
*/
-static void
+static void
mrulist(
struct parse * pcmd,
FILE * fp
@@ -3134,7 +3175,7 @@ mrulist(
mrulist_interrupted = FALSE;
push_ctrl_c_handler(&mrulist_ctrl_c_hook);
- fprintf(stderr,
+ xprintf(stderr,
"Ctrl-C will stop MRU retrieval and display partial results.\n");
fflush(stderr);
@@ -3148,7 +3189,7 @@ mrulist(
if ((!strncmp(resall_eq, arg, sizeof(resall_eq)
- 1) || !strncmp(resany_eq, arg,
sizeof(resany_eq) - 1) || !strncmp(
- mincount_eq, arg, sizeof(mincount_eq) - 1)
+ mincount_eq, arg, sizeof(mincount_eq) - 1)
|| !strncmp(laddr_eq, arg, sizeof(laddr_eq)
- 1) || !strncmp(maxlstint_eq, arg,
sizeof(laddr_eq) - 1)) && parms + cb + 2 <=
@@ -3184,7 +3225,7 @@ mrulist(
parms += cb - 1;
}
} else
- fprintf(stderr,
+ xprintf(stderr,
"ignoring unrecognized mrulist parameter: %s\n",
arg);
}
@@ -3216,7 +3257,7 @@ mrulist(
}
if (ppentry - sorted != (int)mru_count) {
- fprintf(stderr,
+ xprintf(stderr,
"mru_count %u should match MRU list depth %ld.\n",
mru_count, (long)(ppentry - sorted));
free(sorted);
@@ -3243,7 +3284,7 @@ mrulist(
LFPTOD(&interval, favgint);
favgint /= recent->count;
avgint = (int)(favgint + 0.5);
- fprintf(fp, "%6d %6d %4hx %c %d %d %6d %5u %s\n",
+ xprintf(fp, "%6d %6d %4hx %c %d %d %6d %5u %s\n",
lstint, avgint, recent->rs,
(RES_KOD & recent->rs)
? 'K'
@@ -3256,14 +3297,14 @@ mrulist(
if (showhostnames)
fflush(fp);
if (mrulist_interrupted) {
- fputs("\n --interrupted--\n", fp);
+ xputs("\n --interrupted--\n", fp);
fflush(fp);
break;
}
}
fflush(fp);
if (debug) {
- fprintf(stderr,
+ xprintf(stderr,
"--- completed, freeing sorted[] pointers\n");
fflush(stderr);
}
@@ -3271,14 +3312,14 @@ mrulist(
cleanup_return:
if (debug) {
- fprintf(stderr, "... freeing MRU entries\n");
+ xprintf(stderr, "... freeing MRU entries\n");
fflush(stderr);
}
ITER_DLIST_BEGIN(mru_list, recent, mlink, mru)
free(recent);
ITER_DLIST_END()
if (debug) {
- fprintf(stderr, "... freeing hash_table[]\n");
+ xprintf(stderr, "... freeing hash_table[]\n");
fflush(stderr);
}
free(hash_table);
@@ -3306,13 +3347,13 @@ validate_ifnum(
return;
if (prow->ifnum + 1 <= ifnum) {
if (*pfields < IFSTATS_FIELDS)
- fprintf(fp, "Warning: incomplete row with %d (of %d) fields\n",
+ xprintf(fp, "Warning: incomplete row with %d (of %d) fields\n",
*pfields, IFSTATS_FIELDS);
*pfields = 0;
prow->ifnum = ifnum;
return;
}
- fprintf(stderr,
+ xprintf(stderr,
"received if index %u, have %d of %d fields for index %u, aborting.\n",
ifnum, *pfields, IFSTATS_FIELDS, prow->ifnum);
exit(1);
@@ -3335,14 +3376,14 @@ another_ifstats_field(
(*pfields)++;
/* we understand 12 tags */
- if (IFSTATS_FIELDS > *pfields)
+ if (IFSTATS_FIELDS > *pfields)
return;
/*
" interface name send\n"
" # address/broadcast drop flag ttl mc received sent failed peers uptime\n"
"==============================================================================\n");
*/
- fprintf(fp,
+ xprintf(fp,
"%3u %-24.24s %c %4x %3u %2u %6u %6u %6u %5u %8d\n"
" %s\n",
prow->ifnum, prow->name,
@@ -3353,7 +3394,7 @@ another_ifstats_field(
prow->received, prow->sent, prow->send_errors,
prow->peer_count, prow->uptime, sptoa(&prow->addr));
if (!SOCK_UNSPEC(&prow->bcast))
- fprintf(fp, " %s\n", sptoa(&prow->bcast));
+ xprintf(fp, " %s\n", sptoa(&prow->bcast));
ifnum = prow->ifnum;
ZERO(*prow);
prow->ifnum = ifnum;
@@ -3363,7 +3404,7 @@ another_ifstats_field(
/*
* ifstats - ntpq -c ifstats modeled on ntpdc -c ifstats.
*/
-static void
+static void
ifstats(
struct parse * pcmd,
FILE * fp
@@ -3398,7 +3439,7 @@ ifstats(
if (qres) /* message already displayed */
return;
- fprintf(fp,
+ xprintf(fp,
" interface name send\n"
" # address/broadcast drop flag ttl mc received sent failed peers uptime\n"
"==============================================================================\n");
@@ -3410,7 +3451,7 @@ ifstats(
while (nextvar(&dsize, &datap, &tag, &val)) {
INSIST(tag && val);
if (debug > 1)
- fprintf(stderr, "nextvar gave: %s = %s\n", tag, val);
+ xprintf(stderr, "nextvar gave: %s = %s\n", tag, val);
comprende = FALSE;
switch(tag[0]) {
@@ -3498,7 +3539,7 @@ ifstats(
}
}
if (fields != IFSTATS_FIELDS)
- fprintf(fp, "Warning: incomplete row with %d (of %d) fields\n",
+ xprintf(fp, "Warning: incomplete row with %d (of %d) fields\n",
fields, IFSTATS_FIELDS);
fflush(fp);
@@ -3522,13 +3563,13 @@ validate_reslist_idx(
return;
if (prow->idx + 1 == idx) {
if (*pfields < RESLIST_FIELDS)
- fprintf(fp, "Warning: incomplete row with %d (of %d) fields",
+ xprintf(fp, "Warning: incomplete row with %d (of %d) fields",
*pfields, RESLIST_FIELDS);
*pfields = 0;
prow->idx = idx;
return;
}
- fprintf(stderr,
+ xprintf(stderr,
"received reslist index %u, have %d of %d fields for index %u, aborting.\n",
idx, *pfields, RESLIST_FIELDS, prow->idx);
exit(1);
@@ -3569,7 +3610,7 @@ another_reslist_field(
" restrictions\n"
"==============================================================================\n");
*/
- fprintf(fp,
+ xprintf(fp,
"%10lu %s\n"
" %s\n",
prow->hits, addrmaskstr, prow->flagstr);
@@ -3582,7 +3623,7 @@ another_reslist_field(
/*
* reslist - ntpq -c reslist modeled on ntpdc -c reslist.
*/
-static void
+static void
reslist(
struct parse * pcmd,
FILE * fp
@@ -3611,7 +3652,7 @@ reslist(
if (qres) /* message already displayed */
return;
- fprintf(fp,
+ xprintf(fp,
" hits addr/prefix or addr mask\n"
" restrictions\n"
"==============================================================================\n");
@@ -3623,7 +3664,7 @@ reslist(
while (nextvar(&dsize, &datap, &tag, &val)) {
INSIST(tag && val);
if (debug > 1)
- fprintf(stderr, "nextvar gave: %s = %s\n", tag, val);
+ xprintf(stderr, "nextvar gave: %s = %s\n", tag, val);
comprende = FALSE;
switch(tag[0]) {
@@ -3670,7 +3711,7 @@ reslist(
}
}
if (fields != RESLIST_FIELDS)
- fprintf(fp, "Warning: incomplete row with %d (of %d) fields",
+ xprintf(fp, "Warning: incomplete row with %d (of %d) fields",
fields, RESLIST_FIELDS);
fflush(fp);
@@ -3680,7 +3721,7 @@ reslist(
/*
* collect_display_vdc
*/
-static void
+static void
collect_display_vdc(
associd_t as,
vdc * table,
@@ -3705,6 +3746,7 @@ collect_display_vdc(
int match;
u_long ul;
int vtype;
+ sockaddr_u sau;
ZERO(vl);
for (pvdc = table; pvdc->tag != NULL; pvdc++) {
@@ -3765,6 +3807,7 @@ collect_display_vdc(
}
}
/* fallthru */
+ case NTP_REFID: /* fallthru */
case NTP_MODE: /* fallthru */
case NTP_2BIT:
pvdc->v.str = estrdup(val);
@@ -3776,19 +3819,19 @@ collect_display_vdc(
case NTP_ADP:
if (!decodenetnum(val, &pvdc->v.sau))
- fprintf(stderr, "malformed %s=%s\n",
+ xprintf(stderr, "malformed %s=%s\n",
pvdc->tag, val);
break;
case NTP_ADD:
if (0 == n) { /* adr */
if (!decodenetnum(val, &pvdc->v.sau))
- fprintf(stderr,
+ xprintf(stderr,
"malformed %s=%s\n",
pvdc->tag, val);
} else { /* port */
if (atouint(val, &ul))
- SET_PORT(&pvdc->v.sau,
+ SET_PORT(&pvdc->v.sau,
(u_short)ul);
}
break;
@@ -3800,7 +3843,7 @@ collect_display_vdc(
vtype = (0 == as)
? TYPE_SYS
: TYPE_PEER;
- fprintf(fp, "associd=%u status=%04x %s,\n", as, rstatus,
+ xprintf(fp, "associd=%u status=%04x %s,\n", as, rstatus,
statustoa(vtype, rstatus));
}
@@ -3809,7 +3852,7 @@ collect_display_vdc(
case NTP_STR:
if (pvdc->v.str != NULL) {
- fprintf(fp, "%s %s\n", pvdc->display,
+ xprintf(fp, "%s %s\n", pvdc->display,
pvdc->v.str);
free(pvdc->v.str);
pvdc->v.str = NULL;
@@ -3818,29 +3861,48 @@ collect_display_vdc(
case NTP_ADD: /* fallthru */
case NTP_ADP:
- fprintf(fp, "%s %s\n", pvdc->display,
+ xprintf(fp, "%s %s\n", pvdc->display,
nntohostp(&pvdc->v.sau));
break;
case NTP_LFP:
- fprintf(fp, "%s %s\n", pvdc->display,
+ xprintf(fp, "%s %s\n", pvdc->display,
prettydate(&pvdc->v.lfp));
break;
case NTP_MODE:
atouint(pvdc->v.str, &ul);
- fprintf(fp, "%s %s\n", pvdc->display,
+ xprintf(fp, "%s %s\n", pvdc->display,
modetoa((int)ul));
+ free(pvdc->v.str);
+ pvdc->v.str = NULL;
break;
case NTP_2BIT:
atouint(pvdc->v.str, &ul);
- fprintf(fp, "%s %s\n", pvdc->display,
+ xprintf(fp, "%s %s\n", pvdc->display,
leapbits[ul & 0x3]);
+ free(pvdc->v.str);
+ pvdc->v.str = NULL;
+ break;
+
+ case NTP_REFID:
+ if (!decodenetnum(pvdc->v.str, &sau)) {
+ fprintf(fp, "%s %s\n", pvdc->display, /* Text fmt */
+ pvdc->v.str);
+ } else if (drefid == REFID_IPV4) {
+ fprintf(fp, "%s %s\n", pvdc->display, /* IPv4 fmt */
+ stoa(&sau));
+ } else {
+ fprintf (fp, "%s 0x%08x\n", pvdc->display, /* Hex / hash */
+ ntohl(addr2refid(&sau)));
+ }
+ free(pvdc->v.str);
+ pvdc->v.str = NULL;
break;
default:
- fprintf(stderr, "unexpected vdc type %d for %s\n",
+ xprintf(stderr, "unexpected vdc type %d for %s\n",
pvdc->type, pvdc->tag);
break;
}
@@ -3898,7 +3960,7 @@ sysinfo(
VDC_INIT("precision", "log2 precision: ", NTP_STR),
VDC_INIT("rootdelay", "root delay: ", NTP_STR),
VDC_INIT("rootdisp", "root dispersion: ", NTP_STR),
- VDC_INIT("refid", "reference ID: ", NTP_STR),
+ VDC_INIT("refid", "reference ID: ", NTP_REFID),
VDC_INIT("reftime", "reference time: ", NTP_LFP),
VDC_INIT("sys_jitter", "system jitter: ", NTP_STR),
VDC_INIT("clk_jitter", "clock jitter: ", NTP_STR),