aboutsummaryrefslogtreecommitdiff
path: root/contrib/ntp/ntpq/ntpq.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ntp/ntpq/ntpq.c')
-rw-r--r--contrib/ntp/ntpq/ntpq.c67
1 files changed, 52 insertions, 15 deletions
diff --git a/contrib/ntp/ntpq/ntpq.c b/contrib/ntp/ntpq/ntpq.c
index 6e7a5c375175..0382c0f948d7 100644
--- a/contrib/ntp/ntpq/ntpq.c
+++ b/contrib/ntp/ntpq/ntpq.c
@@ -122,10 +122,12 @@ u_char pktversion = NTP_OLDVERSION + 1;
#define NA 2 /* network address */
#define LP 3 /* leap (print in binary) */
#define RF 4 /* refid (sometimes string, sometimes not) */
-#define AR 5 /* array of times */
+#define AU 5 /* array of unsigned times */
#define FX 6 /* test flags */
#define TS 7 /* l_fp timestamp in hex */
#define OC 8 /* integer, print in octal */
+#define AS 9 /* array of signed times */
+#define SN 10 /* signed number: must display +/- sign */
#define EOV 255 /* end of table */
/*
@@ -146,10 +148,12 @@ const var_format cookedvars[] = {
{ "srcadr", HA },
{ "peeradr", HA }, /* compat with others */
{ "dstadr", NA },
- { "filtdelay", AR },
- { "filtoffset", AR },
- { "filtdisp", AR },
- { "filterror", AR }, /* compat with others */
+ { "filtdelay", AU },
+ { "filtoffset", AS },
+ { "filtdisp", AU },
+ { "filterror", AU }, /* compat with others */
+ { "offset", SN },
+ { "frequency", SN }
};
@@ -225,7 +229,7 @@ static void rawprint (int, size_t, const char *, int, int, FILE *);
static void startoutput (void);
static void output (FILE *, const char *, const char *);
static void endoutput (FILE *);
-static void outputarr (FILE *, char *, int, l_fp *);
+static void outputarr (FILE *, char *, int, l_fp *, int);
static int assoccmp (const void *, const void *);
u_short varfmt (const char *);
void ntpq_custom_opt_handler(tOptions *, tOptDesc *);
@@ -3493,7 +3497,8 @@ outputarr(
FILE *fp,
char *name,
int narr,
- l_fp *lfp
+ l_fp *lfp,
+ int issigned
)
{
char *bp;
@@ -3512,7 +3517,7 @@ outputarr(
for (i = narr; i > 0; i--) {
if (i != (size_t)narr)
*bp++ = ' ';
- cp = lfptoms(lfp, 2);
+ cp = (issigned ? lfptoms(lfp, 2) : ulfptoms(lfp, 2));
len = strlen(cp);
if (len > 7) {
cp[7] = '\0';
@@ -3657,11 +3662,31 @@ cookedprint(
if (!value) {
output_raw = '?';
} else if (decodenetnum(value, &hval)) {
- if (ISREFCLOCKADR(&hval))
- output(fp, name,
- refnumtoa(&hval));
- else
- output(fp, name, stoa(&hval));
+ if (datatype == TYPE_CLOCK && IS_IPV4(&hval)) {
+ /*
+ * Workaround to override numeric refid formats
+ * for refclocks received from faulty nptd servers
+ * and output them as text.
+ */
+ int i;
+ unsigned char *str = (unsigned char *)&(hval.sa4).sin_addr;
+ char refid_buf[5];
+ for (i=0; i<4 && str[i]; i++)
+ refid_buf[i] = (isprint(str[i]) ? str[i] : '?');
+ refid_buf[i] = 0; /* Null terminator */
+ output(fp, name, refid_buf);
+ } else if (ISREFCLOCKADR(&hval)) {
+ output(fp, name, refnumtoa(&hval));
+ } else {
+ if (drefid == REFID_IPV4) {
+ output(fp, name, stoa(&hval));
+ } else {
+ char refid_buf[12];
+ snprintf (refid_buf, sizeof(refid_buf),
+ "0x%08x", ntohl(addr2refid(&hval)));
+ output(fp, name, refid_buf);
+ }
+ }
} else if (strlen(value) <= 4) {
output(fp, name, value);
} else {
@@ -3693,11 +3718,12 @@ cookedprint(
}
break;
- case AR:
+ case AU:
+ case AS:
if (!value || !decodearr(value, &narr, lfparr, 8))
output_raw = '?';
else
- outputarr(fp, name, narr, lfparr);
+ outputarr(fp, name, narr, lfparr, (fmt==AS));
break;
case FX:
@@ -3707,6 +3733,17 @@ cookedprint(
output(fp, name, tstflags(uval));
break;
+ case SN:
+ if (!value)
+ output_raw = '?';
+ else if (isdigit(*value)) { /* number without sign */
+ bv[0] = '+';
+ atoascii (value, MAXVALLEN, bv+1, sizeof(bv)-1);
+ output(fp, name, bv);
+ } else
+ output_raw = '*'; /* output as-is */
+ break;
+
default:
fprintf(stderr, "Internal error in cookedprint, %s=%s, fmt %d\n",
name, value, fmt);