Annotation of embedaddon/ntp/libntp/statestr.c, revision 1.1

1.1     ! misho       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>