File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libntp / statestr.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: /*
    2:  * pretty printing of status information
    3:  */
    4: #ifdef HAVE_CONFIG_H
    5: #include <config.h>
    6: #endif
    7: #include <stdio.h>
    8: #include "ntp_stdlib.h"
    9: #include "ntp_fp.h"
   10: #include "ntp.h"
   11: #include "lib_strbuf.h"
   12: #include "ntp_refclock.h"
   13: #include "ntp_control.h"
   14: #include "ntp_string.h"
   15: 
   16: /*
   17:  * Structure for turning various constants into a readable string.
   18:  */
   19: struct codestring {
   20: 	int code;
   21: 	const char *string;
   22: };
   23: 
   24: /*
   25:  * Leap status (leap)
   26:  */
   27: static
   28: struct codestring leap_codes[] = {
   29: 	{ LEAP_NOWARNING,	"leap_none" },
   30: 	{ LEAP_ADDSECOND,	"leap_add_sec" },
   31: 	{ LEAP_DELSECOND,	"leap_del_sec" },
   32: 	{ LEAP_NOTINSYNC,	"leap_alarm" },
   33: 	{ -1,			"leap" }
   34: };
   35: 
   36: /*
   37:  * Clock source status (sync)
   38:  */
   39: static
   40: struct codestring sync_codes[] = {
   41: 	{ CTL_SST_TS_UNSPEC,	"sync_unspec" },
   42: 	{ CTL_SST_TS_ATOM,	"sync_pps" },
   43: 	{ CTL_SST_TS_LF,	"sync_lf_radio" },
   44: 	{ CTL_SST_TS_HF,	"sync_hf_radio" },
   45: 	{ CTL_SST_TS_UHF,	"sync_uhf_radio" },
   46: 	{ CTL_SST_TS_LOCAL,	"sync_local" },
   47: 	{ CTL_SST_TS_NTP,	"sync_ntp" },
   48: 	{ CTL_SST_TS_UDPTIME,	"sync_other" },
   49: 	{ CTL_SST_TS_WRSTWTCH,	"sync_wristwatch" },
   50: 	{ CTL_SST_TS_TELEPHONE,	"sync_telephone" },
   51: 	{ -1,			"sync" }
   52: };
   53: 
   54: /*
   55:  * Peer selection status (sel)
   56:  */
   57: static
   58: struct codestring select_codes[] = {
   59: 	{ CTL_PST_SEL_REJECT,	"sel_reject" },
   60: 	{ CTL_PST_SEL_SANE,	"sel_falsetick" },
   61: 	{ CTL_PST_SEL_CORRECT,	"sel_excess" },
   62: 	{ CTL_PST_SEL_SELCAND,	"sel_outlyer" },
   63: 	{ CTL_PST_SEL_SYNCCAND,	"sel_candidate" },
   64: 	{ CTL_PST_SEL_EXCESS,	"sel_backup" },
   65: 	{ CTL_PST_SEL_SYSPEER,	"sel_sys.peer" },
   66: 	{ CTL_PST_SEL_PPS,	"sel_pps.peer" },
   67: 	{ -1,			"sel" }
   68: };
   69: 
   70: /*
   71:  * Clock status (clk)
   72:  */
   73: static
   74: struct codestring clock_codes[] = {
   75: 	{ CTL_CLK_OKAY,		"clk_unspec" },
   76: 	{ CTL_CLK_NOREPLY,	"clk_no_reply" },
   77: 	{ CTL_CLK_BADFORMAT,	"clk_bad_format" },
   78: 	{ CTL_CLK_FAULT,	"clk_fault" },
   79: 	{ CTL_CLK_PROPAGATION,	"clk_bad_signal" },
   80: 	{ CTL_CLK_BADDATE,	"clk_bad_date" },
   81: 	{ CTL_CLK_BADTIME,	"clk_bad_time" },
   82: 	{ -1,			"clk" }
   83: };
   84: 
   85: 
   86: #ifdef FLASH_CODES_UNUSED
   87: /*
   88:  * Flash bits -- see ntpq.c tstflags & tstflagnames
   89:  */
   90: static
   91: struct codestring flash_codes[] = {
   92: 	{ TEST1,		"pkt_dup" },
   93: 	{ TEST2,		"pkt_bogus" },
   94: 	{ TEST3,		"pkt_unsync" },
   95: 	{ TEST4,		"pkt_denied" },
   96: 	{ TEST5,		"pkt_auth" },
   97: 	{ TEST6,		"pkt_stratum" },
   98: 	{ TEST7,		"pkt_header" },
   99: 	{ TEST8,		"pkt_autokey" },
  100: 	{ TEST9,		"pkt_crypto" },
  101: 	{ TEST10,		"peer_stratum" },
  102: 	{ TEST11,		"peer_dist" },
  103: 	{ TEST12,		"peer_loop" },
  104: 	{ TEST13,		"peer_unreach" },
  105: 	{ -1,			"flash" }
  106: };
  107: #endif
  108: 
  109: 
  110: /*
  111:  * System events (sys)
  112:  */
  113: static
  114: struct codestring sys_codes[] = {
  115: 	{ EVNT_UNSPEC,		"unspecified" },
  116: 	{ EVNT_NSET,		"freq_not_set" },
  117: 	{ EVNT_FSET,		"freq_set" },
  118: 	{ EVNT_SPIK,		"spike_detect" },
  119: 	{ EVNT_FREQ,		"freq_mode" },
  120: 	{ EVNT_SYNC,		"clock_sync" },
  121: 	{ EVNT_SYSRESTART,	"restart" },
  122: 	{ EVNT_SYSFAULT,	"panic_stop" },
  123: 	{ EVNT_NOPEER,		"no_sys_peer" },
  124: 	{ EVNT_ARMED,		"leap_armed" },
  125: 	{ EVNT_DISARMED,	"leap_disarmed" },
  126: 	{ EVNT_LEAP,		"leap_event" },
  127: 	{ EVNT_CLOCKRESET,	"clock_step" },
  128: 	{ EVNT_KERN,		"kern" },
  129: 	{ EVNT_TAI,		"TAI" },
  130: 	{ EVNT_LEAPVAL,		"stale_leapsecond_values" },
  131: 	{ EVNT_CLKHOP,		"clockhop" },
  132: 	{ -1,			"" }
  133: };
  134: 
  135: /*
  136:  * Peer events (peer)
  137:  */
  138: static
  139: struct codestring peer_codes[] = {
  140: 	{ PEVNT_MOBIL & ~PEER_EVENT,	"mobilize" },
  141: 	{ PEVNT_DEMOBIL & ~PEER_EVENT,	"demobilize" },
  142: 	{ PEVNT_UNREACH & ~PEER_EVENT,	"unreachable" },
  143: 	{ PEVNT_REACH & ~PEER_EVENT,	"reachable" },
  144: 	{ PEVNT_RESTART & ~PEER_EVENT,	"restart" },
  145: 	{ PEVNT_REPLY & ~PEER_EVENT,	"no_reply" },
  146: 	{ PEVNT_RATE & ~PEER_EVENT,	"rate_exceeded" },
  147: 	{ PEVNT_DENY & ~PEER_EVENT,	"access_denied" },
  148: 	{ PEVNT_ARMED & ~PEER_EVENT,	"leap_armed" },
  149: 	{ PEVNT_NEWPEER & ~PEER_EVENT,	"sys_peer" },
  150: 	{ PEVNT_CLOCK & ~PEER_EVENT,	"clock_event" },
  151: 	{ PEVNT_AUTH & ~PEER_EVENT,	"bad_auth" },
  152: 	{ PEVNT_POPCORN & ~PEER_EVENT,	"popcorn" },
  153: 	{ PEVNT_XLEAVE & ~PEER_EVENT,	"interleave_mode" },
  154: 	{ PEVNT_XERR & ~PEER_EVENT,	"interleave_error" },
  155: 	{ PEVNT_TAI & ~PEER_EVENT,	"TAI" },
  156: 	{ -1,				"" }
  157: };
  158: 
  159: #ifdef OPENSSL
  160: /*
  161:  * Crypto events (cryp)
  162:  */
  163: static
  164: struct codestring crypto_codes[] = {
  165: 	{ XEVNT_OK & ~CRPT_EVENT,	"success" },
  166: 	{ XEVNT_LEN & ~CRPT_EVENT,	"bad_field_format_or_length" },
  167: 	{ XEVNT_TSP & ~CRPT_EVENT,	"bad_timestamp" },
  168: 	{ XEVNT_FSP & ~CRPT_EVENT,	"bad_filestamp" },
  169: 	{ XEVNT_PUB & ~CRPT_EVENT,	"bad_or_missing_public_key" },
  170: 	{ XEVNT_MD & ~CRPT_EVENT,	"unsupported_digest_type" },
  171: 	{ XEVNT_KEY & ~CRPT_EVENT,	"unsupported_identity_type" },
  172: 	{ XEVNT_SGL & ~CRPT_EVENT,	"bad_signature_length" },
  173: 	{ XEVNT_SIG & ~CRPT_EVENT,	"signature_not_verified" },
  174: 	{ XEVNT_VFY & ~CRPT_EVENT,	"certificate_not_verified" },
  175: 	{ XEVNT_PER & ~CRPT_EVENT,	"host_certificate_expired" },
  176: 	{ XEVNT_CKY & ~CRPT_EVENT,	"bad_or_missing_cookie" },
  177: 	{ XEVNT_DAT & ~CRPT_EVENT,	"bad_or_missing_leapseconds" },
  178: 	{ XEVNT_CRT & ~CRPT_EVENT,	"bad_or_missing_certificate" },	
  179: 	{ XEVNT_ID & ~CRPT_EVENT,	"bad_or_missing_group key" },
  180: 	{ XEVNT_ERR & ~CRPT_EVENT,	"protocol_error" },
  181: 	{ -1,				"" }
  182: };
  183: #endif /* OPENSSL */
  184: 
  185: /* Forwards */
  186: static const char *getcode (int, struct codestring *);
  187: static const char *getevents (int);
  188: 
  189: /*
  190:  * getcode - return string corresponding to code
  191:  */
  192: static const char *
  193: getcode(
  194: 	int code,
  195: 	struct codestring *codetab
  196: 	)
  197: {
  198: 	static char buf[30];
  199: 
  200: 	while (codetab->code != -1) {
  201: 		if (codetab->code == code)
  202: 			return codetab->string;
  203: 		codetab++;
  204: 	}
  205: 	snprintf(buf, sizeof(buf), "%s_%d", codetab->string, code);
  206: 	return buf;
  207: }
  208: 
  209: /*
  210:  * getevents - return a descriptive string for the event count
  211:  */
  212: static const char *
  213: getevents(
  214: 	int cnt
  215: 	)
  216: {
  217: 	static char buf[20];
  218: 
  219: 	if (cnt == 0)
  220: 		return "no events";
  221: 	snprintf(buf, sizeof(buf), "%d event%s", cnt, (cnt==1) ? "" : 
  222: 	    "s");
  223: 	return buf;
  224: }
  225: 
  226: /*
  227:  * statustoa - return a descriptive string for a peer status
  228:  */
  229: char *
  230: statustoa(
  231: 	int type,
  232: 	int st
  233: 	)
  234: {
  235: 	char *cb;
  236: 	u_char pst;
  237: 
  238: 	LIB_GETBUF(cb);
  239: 
  240: 	switch (type) {
  241: 	    case TYPE_SYS:
  242: 		strcpy(cb, getcode(CTL_SYS_LI(st), leap_codes));
  243: 		strcat(cb, ", ");
  244: 		strcat(cb, getcode(CTL_SYS_SOURCE(st), sync_codes));
  245: 		strcat(cb, ", ");
  246: 		strcat(cb, getevents(CTL_SYS_NEVNT(st)));
  247: 		strcat(cb, ", ");
  248: 		strcat(cb, getcode(CTL_SYS_EVENT(st), sys_codes));
  249: 		break;
  250: 	
  251: 	    case TYPE_PEER:
  252: 
  253: 		/*
  254: 		 * Handcraft the bits
  255: 		 */
  256: 		pst = (u_char) CTL_PEER_STATVAL(st);
  257: 		if (pst & CTL_PST_CONFIG)
  258: 			strcpy(cb, "conf");
  259: 		if (pst & CTL_PST_AUTHENABLE) {
  260: 			if (pst & CTL_PST_CONFIG)
  261: 				strcat(cb, ", authenb");
  262: 			else
  263: 				strcat(cb, "authenb");
  264: 		}
  265: 		if (pst & CTL_PST_AUTHENTIC) {
  266: 			if (pst & (CTL_PST_CONFIG | CTL_PST_AUTHENABLE))
  267: 				strcat(cb, ", auth");
  268: 			else
  269: 				strcat(cb, "auth");
  270: 		}
  271: 		if (pst & CTL_PST_REACH) {
  272: 			if (pst & (CTL_PST_CONFIG | CTL_PST_AUTHENABLE |
  273: 			    CTL_PST_AUTHENTIC))
  274: 				strcat(cb, ", reach");
  275: 			else
  276: 				strcat(cb, "reach");
  277: 		}
  278: 		if (pst & CTL_PST_BCAST) {
  279: 			if (pst & (CTL_PST_CONFIG | CTL_PST_AUTHENABLE |
  280: 			    CTL_PST_AUTHENTIC | CTL_PST_REACH))
  281: 				strcat(cb, ", bcst");
  282: 			else
  283: 				strcat(cb, "bcst");
  284: 		}
  285: 
  286: 		/*
  287: 		 * Now the codes
  288: 		 */
  289: 		strcat(cb, ", ");
  290: 		strcat(cb, getcode(pst & 0x7, select_codes));
  291: 		strcat(cb, ", ");
  292: 		strcat(cb, getevents(CTL_PEER_NEVNT(st)));
  293: 		if (CTL_PEER_EVENT(st) != EVNT_UNSPEC) {
  294: 			strcat(cb, ", ");
  295: 			strcat(cb, getcode(CTL_PEER_EVENT(st),
  296: 			    peer_codes));
  297: 		}
  298: 		break;
  299: 	
  300: 	    case TYPE_CLOCK:
  301: 		strcat(cb, ", ");
  302: 		strcat(cb, getevents(CTL_SYS_NEVNT(st)));
  303: 		strcat(cb, ", ");
  304: 		strcat(cb, getcode((st) & 0xf, clock_codes));
  305: 		break;
  306: 	}
  307: 	return cb;
  308: }
  309: 
  310: const char *
  311: eventstr(
  312: 	int num
  313: 	)
  314: {
  315: 	if (num & PEER_EVENT)
  316: 		return (getcode(num & ~PEER_EVENT, peer_codes));
  317: #ifdef OPENSSL
  318: 	else if (num & CRPT_EVENT)
  319: 		return (getcode(num & ~CRPT_EVENT, crypto_codes));
  320: #endif /* OPENSSL */
  321: 	else
  322: 		return (getcode(num, sys_codes));
  323: }
  324: 
  325: const char *
  326: ceventstr(
  327: 	int num
  328: 	)
  329: {
  330: 	return getcode(num, clock_codes);
  331: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>