/* * statustoa - return a descriptive string for a peer status */ char * statustoa( int type, int st ) { char * cb; char * cc; u_char pst; LIB_GETBUF(cb); switch (type) { case TYPE_SYS: snprintf(cb, LIB_BUFLENGTH, "%s, %s, %s, %s", getcode(CTL_SYS_LI(st), leap_codes), getcode(CTL_SYS_SOURCE(st), sync_codes), getevents(CTL_SYS_NEVNT(st)), getcode(CTL_SYS_EVENT(st), sys_codes)); break; case TYPE_PEER: pst = (u_char)CTL_PEER_STATVAL(st); snprintf(cb, LIB_BUFLENGTH, "%s, %s, %s", peer_st_flags(pst), getcode(pst & 0x7, select_codes), getevents(CTL_PEER_NEVNT(st))); if (CTL_PEER_EVENT(st) != EVNT_UNSPEC) { cc = cb + strlen(cb); snprintf(cc, LIB_BUFLENGTH - (cc - cb), ", %s", getcode(CTL_PEER_EVENT(st), peer_codes)); } break; case TYPE_CLOCK: snprintf(cb, LIB_BUFLENGTH, "%s, %s", getevents(CTL_SYS_NEVNT(st)), getcode((st) & 0xf, clock_codes)); break; } return cb; }
/* * statustoa - return a descriptive string for a peer status */ char * statustoa( int type, int st ) { char *cb; u_char pst; LIB_GETBUF(cb); switch (type) { case TYPE_SYS: strcpy(cb, getcode(CTL_SYS_LI(st), leap_codes)); strcat(cb, ", "); strcat(cb, getcode(CTL_SYS_SOURCE(st), sync_codes)); strcat(cb, ", "); strcat(cb, getevents(CTL_SYS_NEVNT(st))); strcat(cb, ", "); strcat(cb, getcode(CTL_SYS_EVENT(st), sys_codes)); break; case TYPE_PEER: /* * Handcraft the bits */ pst = (u_char) CTL_PEER_STATVAL(st); if (pst & CTL_PST_CONFIG) strcpy(cb, "conf"); if (pst & CTL_PST_AUTHENABLE) { if (pst & CTL_PST_CONFIG) strcat(cb, ", authenb"); else strcat(cb, "authenb"); } if (pst & CTL_PST_AUTHENTIC) { if (pst & (CTL_PST_CONFIG | CTL_PST_AUTHENABLE)) strcat(cb, ", auth"); else strcat(cb, "auth"); } if (pst & CTL_PST_REACH) { if (pst & (CTL_PST_CONFIG | CTL_PST_AUTHENABLE | CTL_PST_AUTHENTIC)) strcat(cb, ", reach"); else strcat(cb, "reach"); } if (pst & CTL_PST_BCAST) { if (pst & (CTL_PST_CONFIG | CTL_PST_AUTHENABLE | CTL_PST_AUTHENTIC | CTL_PST_REACH)) strcat(cb, ", bcst"); else strcat(cb, "bcst"); } /* * Now the codes */ strcat(cb, ", "); strcat(cb, getcode(pst & 0x7, select_codes)); strcat(cb, ", "); strcat(cb, getevents(CTL_PEER_NEVNT(st))); if (CTL_PEER_EVENT(st) != EVNT_UNSPEC) { strcat(cb, ", "); strcat(cb, getcode(CTL_PEER_EVENT(st), peer_codes)); } break; case TYPE_CLOCK: strcat(cb, ", "); strcat(cb, getevents(CTL_SYS_NEVNT(st))); strcat(cb, ", "); strcat(cb, getcode((st) & 0xf, clock_codes)); break; } return cb; }
/* * printassoc - print the current list of associations */ static void printassoc( int showall, FILE *fp ) { register char *bp; int i; u_char statval; int event; u_long event_count; const char *conf; const char *reach; const char *auth; const char *condition = ""; const char *last_event; const char *cnt; char buf[128]; if (numassoc == 0) { (void) fprintf(fp, "No association ID's in list\n"); return; } /* * Output a header */ (void) fprintf(fp, "\nind assid status conf reach auth condition last_event cnt\n"); (void) fprintf(fp, "===========================================================\n"); for (i = 0; i < numassoc; i++) { statval = (u_char) CTL_PEER_STATVAL(assoc_cache[i].status); if (!showall && !(statval & (CTL_PST_CONFIG|CTL_PST_REACH))) continue; event = CTL_PEER_EVENT(assoc_cache[i].status); event_count = CTL_PEER_NEVNT(assoc_cache[i].status); if (statval & CTL_PST_CONFIG) conf = "yes"; else conf = "no"; if (statval & CTL_PST_BCAST) { reach = "none"; if (statval & CTL_PST_AUTHENABLE) auth = "yes"; else auth = "none"; } else { if (statval & CTL_PST_REACH) reach = "yes"; else reach = "no"; if (statval & CTL_PST_AUTHENABLE) { if (statval & CTL_PST_AUTHENTIC) auth = "ok "; else auth = "bad"; } else { auth = "none"; } } if (pktversion > NTP_OLDVERSION) { switch (statval & 0x7) { case CTL_PST_SEL_REJECT: condition = "reject"; break; case CTL_PST_SEL_SANE: condition = "falsetick"; break; case CTL_PST_SEL_CORRECT: condition = "excess"; break; case CTL_PST_SEL_SELCAND: condition = "outlyer"; break; case CTL_PST_SEL_SYNCCAND: condition = "candidate"; break; case CTL_PST_SEL_EXCESS: condition = "backup"; break; case CTL_PST_SEL_SYSPEER: condition = "sys.peer"; break; case CTL_PST_SEL_PPS: condition = "pps.peer"; break; } } else { switch (statval & 0x3) { case OLD_CTL_PST_SEL_REJECT: if (!(statval & OLD_CTL_PST_SANE)) condition = "insane"; else if (!(statval & OLD_CTL_PST_DISP)) condition = "hi_disp"; else condition = ""; break; case OLD_CTL_PST_SEL_SELCAND: condition = "sel_cand"; break; case OLD_CTL_PST_SEL_SYNCCAND: condition = "sync_cand"; break; case OLD_CTL_PST_SEL_SYSPEER: condition = "sys_peer"; break; } } switch (PEER_EVENT|event) { case PEVNT_MOBIL: last_event = "mobilize"; break; case PEVNT_DEMOBIL: last_event = "demobilize"; break; case PEVNT_REACH: last_event = "reachable"; break; case PEVNT_UNREACH: last_event = "unreachable"; break; case PEVNT_RESTART: last_event = "restart"; break; case PEVNT_REPLY: last_event = "no_reply"; break; case PEVNT_RATE: last_event = "rate_exceeded"; break; case PEVNT_DENY: last_event = "access_denied"; break; case PEVNT_ARMED: last_event = "leap_armed"; break; case PEVNT_NEWPEER: last_event = "sys_peer"; break; case PEVNT_CLOCK: last_event = "clock_alarm"; break; default: last_event = ""; break; } cnt = uinttoa(event_count); snprintf(buf, sizeof(buf), "%3d %5u %04x %3.3s %4s %4.4s %9.9s %11s %2s", i + 1, assoc_cache[i].assid, assoc_cache[i].status, conf, reach, auth, condition, last_event, cnt); bp = buf + strlen(buf); while (bp > buf && ' ' == bp[-1]) --bp; bp[0] = '\0'; fprintf(fp, "%s\n", buf); } }