1 /* 2 * numtoa - return asciized network numbers store in local array space 3 */ 4 #include <config.h> 5 6 #include <sys/types.h> 7 #ifdef HAVE_NETINET_IN_H 8 #include <netinet/in.h> /* ntohl */ 9 #endif 10 11 #include <stdio.h> 12 #include <ctype.h> 13 14 #include "ntp_fp.h" 15 #include "ntp_stdlib.h" 16 17 char * 18 numtoa( 19 u_int32 num 20 ) 21 { 22 register u_int32 netnum; 23 register char *buf; 24 25 netnum = ntohl(num); 26 LIB_GETBUF(buf); 27 snprintf(buf, LIB_BUFLENGTH, "%lu.%lu.%lu.%lu", 28 ((u_long)netnum >> 24) & 0xff, 29 ((u_long)netnum >> 16) & 0xff, 30 ((u_long)netnum >> 8) & 0xff, 31 (u_long)netnum & 0xff); 32 return buf; 33 } 34 35 36 /* 37 * Convert a refid & stratum to a string. If stratum is negative and the 38 * refid consists entirely of graphic chars, up to an optional 39 * terminating zero, display as text similar to stratum 0 & 1. 40 */ 41 const char * 42 refid_str( 43 u_int32 refid, 44 int stratum 45 ) 46 { 47 char * text; 48 size_t tlen; 49 char * cp; 50 int printable; 51 52 /* 53 * ntpd can have stratum = 0 and refid 127.0.0.1 in orphan mode. 54 * https://bugs.ntp.org/3854. Mirror the refid logic in timer(). 55 */ 56 if (0 == stratum && LOOPBACKADR_N == refid) { 57 return ".ORPH."; 58 } 59 printable = FALSE; 60 if (stratum < 2) { 61 text = lib_getbuf(); 62 text[0] = '.'; 63 memcpy(&text[1], &refid, sizeof(refid)); 64 text[1 + sizeof(refid)] = '\0'; 65 tlen = strlen(text); 66 text[tlen] = '.'; 67 text[tlen + 1] = '\0'; 68 /* 69 * Now make sure the contents are 'graphic'. 70 * 71 * This refid is expected to be up to 4 printable ASCII. 72 * isgraph() is similar to isprint() but excludes space. 73 * If any character is not graphic, replace it with a '?'. 74 * This will at least alert the viewer of a problem. 75 */ 76 for (cp = text + 1; '\0' != *cp; ++cp) { 77 if (!isgraph((int)*cp)) { 78 printable = FALSE; 79 *cp = '?'; 80 } 81 } 82 if ( (stratum < 0 && printable) 83 || stratum < 2) { 84 return text; 85 } 86 } 87 return numtoa(refid); 88 } 89 90