1c0b746e5SOllivier Robert /* 2c0b746e5SOllivier Robert * ntpdc_ops.c - subroutines which are called to perform operations by ntpdc 3c0b746e5SOllivier Robert */ 4c0b746e5SOllivier Robert 5c0b746e5SOllivier Robert #ifdef HAVE_CONFIG_H 6c0b746e5SOllivier Robert # include <config.h> 7c0b746e5SOllivier Robert #endif 8c0b746e5SOllivier Robert 9c0b746e5SOllivier Robert #include <stdio.h> 10c0b746e5SOllivier Robert #include <ctype.h> 11c0b746e5SOllivier Robert #include <sys/types.h> 12c0b746e5SOllivier Robert #include <sys/time.h> 13c0b746e5SOllivier Robert #ifdef HAVE_SYS_TIMEX_H 14c0b746e5SOllivier Robert # include <sys/timex.h> 15c0b746e5SOllivier Robert #endif 16c0b746e5SOllivier Robert #include <netdb.h> 17c0b746e5SOllivier Robert #if !defined(__bsdi__) && !defined(apollo) 18c0b746e5SOllivier Robert #include <netinet/in.h> 19c0b746e5SOllivier Robert #endif 20c0b746e5SOllivier Robert 21c0b746e5SOllivier Robert #include "ntpdc.h" 22c0b746e5SOllivier Robert #include "ntp_control.h" 23c0b746e5SOllivier Robert #include "ntp_refclock.h" 24c0b746e5SOllivier Robert #include "ntp_stdlib.h" 25c0b746e5SOllivier Robert 26c0b746e5SOllivier Robert #include <arpa/inet.h> 27c0b746e5SOllivier Robert 28c0b746e5SOllivier Robert /* 29c0b746e5SOllivier Robert * Declarations for command handlers in here 30c0b746e5SOllivier Robert */ 31c0b746e5SOllivier Robert static int checkitems P((int, FILE *)); 32c0b746e5SOllivier Robert static int checkitemsize P((int, int)); 33c0b746e5SOllivier Robert static int check1item P((int, FILE *)); 34c0b746e5SOllivier Robert static void peerlist P((struct parse *, FILE *)); 35c0b746e5SOllivier Robert static void peers P((struct parse *, FILE *)); 36c0b746e5SOllivier Robert static void doconfig P((struct parse *pcmd, FILE *fp, int mode, int refc)); 37c0b746e5SOllivier Robert static void dmpeers P((struct parse *, FILE *)); 38c0b746e5SOllivier Robert static void dopeers P((struct parse *, FILE *, int)); 39c0b746e5SOllivier Robert static void printpeer P((struct info_peer *, FILE *)); 40c0b746e5SOllivier Robert static void showpeer P((struct parse *, FILE *)); 41c0b746e5SOllivier Robert static void peerstats P((struct parse *, FILE *)); 42c0b746e5SOllivier Robert static void loopinfo P((struct parse *, FILE *)); 43c0b746e5SOllivier Robert static void sysinfo P((struct parse *, FILE *)); 44c0b746e5SOllivier Robert static void sysstats P((struct parse *, FILE *)); 45c0b746e5SOllivier Robert static void iostats P((struct parse *, FILE *)); 46c0b746e5SOllivier Robert static void memstats P((struct parse *, FILE *)); 47c0b746e5SOllivier Robert static void timerstats P((struct parse *, FILE *)); 48c0b746e5SOllivier Robert static void addpeer P((struct parse *, FILE *)); 49c0b746e5SOllivier Robert static void addserver P((struct parse *, FILE *)); 50c0b746e5SOllivier Robert static void addrefclock P((struct parse *, FILE *)); 51c0b746e5SOllivier Robert static void broadcast P((struct parse *, FILE *)); 52c0b746e5SOllivier Robert static void doconfig P((struct parse *, FILE *, int, int)); 53c0b746e5SOllivier Robert static void unconfig P((struct parse *, FILE *)); 54c0b746e5SOllivier Robert static void set P((struct parse *, FILE *)); 55c0b746e5SOllivier Robert static void sys_clear P((struct parse *, FILE *)); 56c0b746e5SOllivier Robert static void doset P((struct parse *, FILE *, int)); 57c0b746e5SOllivier Robert static void reslist P((struct parse *, FILE *)); 58c0b746e5SOllivier Robert static void new_restrict P((struct parse *, FILE *)); 59c0b746e5SOllivier Robert static void unrestrict P((struct parse *, FILE *)); 60c0b746e5SOllivier Robert static void delrestrict P((struct parse *, FILE *)); 61c0b746e5SOllivier Robert static void do_restrict P((struct parse *, FILE *, int)); 62c0b746e5SOllivier Robert static void monlist P((struct parse *, FILE *)); 63c0b746e5SOllivier Robert static void reset P((struct parse *, FILE *)); 64c0b746e5SOllivier Robert static void preset P((struct parse *, FILE *)); 65c0b746e5SOllivier Robert static void readkeys P((struct parse *, FILE *)); 66c0b746e5SOllivier Robert static void trustkey P((struct parse *, FILE *)); 67c0b746e5SOllivier Robert static void untrustkey P((struct parse *, FILE *)); 68c0b746e5SOllivier Robert static void do_trustkey P((struct parse *, FILE *, int)); 69c0b746e5SOllivier Robert static void authinfo P((struct parse *, FILE *)); 70c0b746e5SOllivier Robert static void traps P((struct parse *, FILE *)); 71c0b746e5SOllivier Robert static void addtrap P((struct parse *, FILE *)); 72c0b746e5SOllivier Robert static void clrtrap P((struct parse *, FILE *)); 73c0b746e5SOllivier Robert static void do_addclr_trap P((struct parse *, FILE *, int)); 74c0b746e5SOllivier Robert static void requestkey P((struct parse *, FILE *)); 75c0b746e5SOllivier Robert static void controlkey P((struct parse *, FILE *)); 76c0b746e5SOllivier Robert static void do_changekey P((struct parse *, FILE *, int)); 77c0b746e5SOllivier Robert static void ctlstats P((struct parse *, FILE *)); 78c0b746e5SOllivier Robert static void clockstat P((struct parse *, FILE *)); 79c0b746e5SOllivier Robert static void fudge P((struct parse *, FILE *)); 80c0b746e5SOllivier Robert static void clkbug P((struct parse *, FILE *)); 81c0b746e5SOllivier Robert static void kerninfo P((struct parse *, FILE *)); 82c0b746e5SOllivier Robert 83c0b746e5SOllivier Robert /* 84c0b746e5SOllivier Robert * Commands we understand. Ntpdc imports this. 85c0b746e5SOllivier Robert */ 86c0b746e5SOllivier Robert struct xcmd opcmds[] = { 87c0b746e5SOllivier Robert { "listpeers", peerlist, { NO, NO, NO, NO }, 88c0b746e5SOllivier Robert { "", "", "", "" }, 89c0b746e5SOllivier Robert "display list of peers the server knows about" }, 90c0b746e5SOllivier Robert { "peers", peers, { NO, NO, NO, NO }, 91c0b746e5SOllivier Robert { "", "", "", "" }, 92c0b746e5SOllivier Robert "display peer summary information" }, 93c0b746e5SOllivier Robert { "dmpeers", dmpeers, { NO, NO, NO, NO }, 94c0b746e5SOllivier Robert { "", "", "", "" }, 95c0b746e5SOllivier Robert "display peer summary info the way Dave Mills likes it" }, 96c0b746e5SOllivier Robert { "showpeer", showpeer, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, 97c0b746e5SOllivier Robert { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, 98c0b746e5SOllivier Robert "display detailed information for one or more peers" }, 99c0b746e5SOllivier Robert { "pstats", peerstats, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, 100c0b746e5SOllivier Robert { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, 101c0b746e5SOllivier Robert "display statistical information for one or more peers" }, 102c0b746e5SOllivier Robert { "loopinfo", loopinfo, { OPT|NTP_STR, NO, NO, NO }, 103c0b746e5SOllivier Robert { "oneline|multiline", "", "", "" }, 104c0b746e5SOllivier Robert "display loop filter information" }, 105c0b746e5SOllivier Robert { "sysinfo", sysinfo, { NO, NO, NO, NO }, 106c0b746e5SOllivier Robert { "", "", "", "" }, 107c0b746e5SOllivier Robert "display local server information" }, 108c0b746e5SOllivier Robert { "sysstats", sysstats, { NO, NO, NO, NO }, 109c0b746e5SOllivier Robert { "", "", "", "" }, 110c0b746e5SOllivier Robert "display local server statistics" }, 111c0b746e5SOllivier Robert { "memstats", memstats, { NO, NO, NO, NO }, 112c0b746e5SOllivier Robert { "", "", "", "" }, 113c0b746e5SOllivier Robert "display peer memory usage statistics" }, 114c0b746e5SOllivier Robert { "iostats", iostats, { NO, NO, NO, NO }, 115c0b746e5SOllivier Robert { "", "", "", "" }, 116c0b746e5SOllivier Robert "display I/O subsystem statistics" }, 117c0b746e5SOllivier Robert { "timerstats", timerstats, { NO, NO, NO, NO }, 118c0b746e5SOllivier Robert { "", "", "", "" }, 119c0b746e5SOllivier Robert "display event timer subsystem statistics" }, 120c0b746e5SOllivier Robert { "addpeer", addpeer, { ADD, OPT|UINT, OPT|UINT, OPT|NTP_STR }, 121c0b746e5SOllivier Robert { "addr", "keyid", "version", "minpoll|prefer" }, 122c0b746e5SOllivier Robert "configure a new peer association" }, 123c0b746e5SOllivier Robert { "addserver", addserver, { ADD, OPT|UINT, OPT|UINT, OPT|NTP_STR }, 124c0b746e5SOllivier Robert { "addr", "keyid", "version", "minpoll|prefer" }, 125c0b746e5SOllivier Robert "configure a new server" }, 126c0b746e5SOllivier Robert { "addrefclock",addrefclock, { ADD, OPT|UINT, OPT|NTP_STR, OPT|NTP_STR }, 127c0b746e5SOllivier Robert { "addr", "mode", "minpoll|prefer", "minpoll|prefer" }, 128c0b746e5SOllivier Robert "configure a new server" }, 129c0b746e5SOllivier Robert { "broadcast", broadcast, { ADD, OPT|UINT, OPT|UINT, OPT|NTP_STR }, 130c0b746e5SOllivier Robert { "addr", "keyid", "version", "minpoll" }, 131c0b746e5SOllivier Robert "configure broadcasting time service" }, 132c0b746e5SOllivier Robert { "unconfig", unconfig, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, 133c0b746e5SOllivier Robert { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, 134c0b746e5SOllivier Robert "unconfigure existing peer assocations" }, 135c0b746e5SOllivier Robert { "enable", set, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, 136c0b746e5SOllivier Robert { "auth|bclient|monitor|pll|kernel|stats", "...", "...", "..." }, 137c0b746e5SOllivier Robert "set a system flag (auth, bclient, monitor, pll, kernel, stats)" }, 138c0b746e5SOllivier Robert { "disable", sys_clear, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, 139c0b746e5SOllivier Robert { "auth|bclient|monitor|pll|kernel|stats", "...", "...", "..." }, 140c0b746e5SOllivier Robert "clear a system flag (auth, bclient, monitor, pll, kernel, stats)" }, 141c0b746e5SOllivier Robert { "reslist", reslist, { NO, NO, NO, NO }, 142c0b746e5SOllivier Robert { "", "", "", "" }, 143c0b746e5SOllivier Robert "display the server's restrict list" }, 144c0b746e5SOllivier Robert { "restrict", new_restrict, { ADD, ADD, NTP_STR, OPT|NTP_STR }, 145c0b746e5SOllivier Robert { "address", "mask", 146c0b746e5SOllivier Robert "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer", 147c0b746e5SOllivier Robert "..." }, 148c0b746e5SOllivier Robert "create restrict entry/add flags to entry" }, 149c0b746e5SOllivier Robert { "unrestrict", unrestrict, { ADD, ADD, NTP_STR, OPT|NTP_STR }, 150c0b746e5SOllivier Robert { "address", "mask", 151c0b746e5SOllivier Robert "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer", 152c0b746e5SOllivier Robert "..." }, 153c0b746e5SOllivier Robert "remove flags from a restrict entry" }, 154c0b746e5SOllivier Robert { "delrestrict", delrestrict, { ADD, ADD, OPT|NTP_STR, NO }, 155c0b746e5SOllivier Robert { "address", "mask", "ntpport", "" }, 156c0b746e5SOllivier Robert "delete a restrict entry" }, 157c0b746e5SOllivier Robert { "monlist", monlist, { OPT|INT, NO, NO, NO }, 158c0b746e5SOllivier Robert { "version", "", "", "" }, 159c0b746e5SOllivier Robert "display data the server's monitor routines have collected" }, 160c0b746e5SOllivier Robert { "reset", reset, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, 161c0b746e5SOllivier Robert { "io|sys|mem|timer|auth|allpeers", "...", "...", "..." }, 162c0b746e5SOllivier Robert "reset various subsystem statistics counters" }, 163c0b746e5SOllivier Robert { "preset", preset, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, 164c0b746e5SOllivier Robert { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, 165c0b746e5SOllivier Robert "reset stat counters associated with particular peer(s)" }, 166c0b746e5SOllivier Robert { "readkeys", readkeys, { NO, NO, NO, NO }, 167c0b746e5SOllivier Robert { "", "", "", "" }, 168c0b746e5SOllivier Robert "request a reread of the keys file and re-init of system keys" }, 169c0b746e5SOllivier Robert { "trustedkey", trustkey, { UINT, OPT|UINT, OPT|UINT, OPT|UINT }, 170c0b746e5SOllivier Robert { "keyid", "keyid", "keyid", "keyid" }, 171c0b746e5SOllivier Robert "add one or more key ID's to the trusted list" }, 172c0b746e5SOllivier Robert { "untrustedkey", untrustkey, { UINT, OPT|UINT, OPT|UINT, OPT|UINT }, 173c0b746e5SOllivier Robert { "keyid", "keyid", "keyid", "keyid" }, 174c0b746e5SOllivier Robert "remove one or more key ID's from the trusted list" }, 175c0b746e5SOllivier Robert { "authinfo", authinfo, { NO, NO, NO, NO }, 176c0b746e5SOllivier Robert { "", "", "", "" }, 177c0b746e5SOllivier Robert "display the state of the authentication code" }, 178c0b746e5SOllivier Robert { "traps", traps, { NO, NO, NO, NO }, 179c0b746e5SOllivier Robert { "", "", "", "" }, 180c0b746e5SOllivier Robert "display the traps set in the server" }, 181c0b746e5SOllivier Robert { "addtrap", addtrap, { ADD, OPT|UINT, OPT|ADD, NO }, 182c0b746e5SOllivier Robert { "address", "port", "interface", "" }, 183c0b746e5SOllivier Robert "configure a trap in the server" }, 184c0b746e5SOllivier Robert { "clrtrap", clrtrap, { ADD, OPT|UINT, OPT|ADD, NO }, 185c0b746e5SOllivier Robert { "address", "port", "interface", "" }, 186c0b746e5SOllivier Robert "remove a trap (configured or otherwise) from the server" }, 187c0b746e5SOllivier Robert { "requestkey", requestkey, { UINT, NO, NO, NO }, 188c0b746e5SOllivier Robert { "keyid", "", "", "" }, 189c0b746e5SOllivier Robert "change the keyid the server uses to authenticate requests" }, 190c0b746e5SOllivier Robert { "controlkey", controlkey, { UINT, NO, NO, NO }, 191c0b746e5SOllivier Robert { "keyid", "", "", "" }, 192c0b746e5SOllivier Robert "change the keyid the server uses to authenticate control messages" }, 193c0b746e5SOllivier Robert { "ctlstats", ctlstats, { NO, NO, NO, NO }, 194c0b746e5SOllivier Robert { "", "", "", "" }, 195c0b746e5SOllivier Robert "display packet count statistics from the control module" }, 196c0b746e5SOllivier Robert { "clockstat", clockstat, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, 197c0b746e5SOllivier Robert { "address", "address", "address", "address" }, 198c0b746e5SOllivier Robert "display clock status information" }, 199c0b746e5SOllivier Robert { "fudge", fudge, { ADD, NTP_STR, NTP_STR, NO }, 200c0b746e5SOllivier Robert { "address", "time1|time2|val1|val2|flags", "value", "" }, 201c0b746e5SOllivier Robert "set/change one of a clock's fudge factors" }, 202c0b746e5SOllivier Robert { "clkbug", clkbug, { ADD, OPT|ADD, OPT|ADD, OPT|ADD }, 203c0b746e5SOllivier Robert { "address", "address", "address", "address" }, 204c0b746e5SOllivier Robert "display clock debugging information" }, 205c0b746e5SOllivier Robert { "kerninfo", kerninfo, { NO, NO, NO, NO }, 206c0b746e5SOllivier Robert { "", "", "", "" }, 207c0b746e5SOllivier Robert "display the kernel pll/pps variables" }, 208c0b746e5SOllivier Robert 209c0b746e5SOllivier Robert { 0, 0, { NO, NO, NO, NO }, 210c0b746e5SOllivier Robert { "", "", "", "" }, "" } 211c0b746e5SOllivier Robert }; 212c0b746e5SOllivier Robert 213c0b746e5SOllivier Robert 214c0b746e5SOllivier Robert /* 215c0b746e5SOllivier Robert * Imported from ntpdc.c 216c0b746e5SOllivier Robert */ 217c0b746e5SOllivier Robert extern int showhostnames; 218c0b746e5SOllivier Robert extern struct servent *server_entry; 219c0b746e5SOllivier Robert 220c0b746e5SOllivier Robert /* 221c0b746e5SOllivier Robert * For quick string comparisons 222c0b746e5SOllivier Robert */ 223c0b746e5SOllivier Robert #define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) 224c0b746e5SOllivier Robert 225c0b746e5SOllivier Robert 226c0b746e5SOllivier Robert /* 227c0b746e5SOllivier Robert * checkitems - utility to print a message if no items were returned 228c0b746e5SOllivier Robert */ 229c0b746e5SOllivier Robert static int 230c0b746e5SOllivier Robert checkitems( 231c0b746e5SOllivier Robert int items, 232c0b746e5SOllivier Robert FILE *fp 233c0b746e5SOllivier Robert ) 234c0b746e5SOllivier Robert { 235c0b746e5SOllivier Robert if (items == 0) { 236c0b746e5SOllivier Robert (void) fprintf(fp, "No data returned in response to query\n"); 237c0b746e5SOllivier Robert return 0; 238c0b746e5SOllivier Robert } 239c0b746e5SOllivier Robert return 1; 240c0b746e5SOllivier Robert } 241c0b746e5SOllivier Robert 242c0b746e5SOllivier Robert 243c0b746e5SOllivier Robert /* 244c0b746e5SOllivier Robert * checkitemsize - utility to print a message if the item size is wrong 245c0b746e5SOllivier Robert */ 246c0b746e5SOllivier Robert static int 247c0b746e5SOllivier Robert checkitemsize( 248c0b746e5SOllivier Robert int itemsize, 249c0b746e5SOllivier Robert int expected 250c0b746e5SOllivier Robert ) 251c0b746e5SOllivier Robert { 252c0b746e5SOllivier Robert if (itemsize != expected) { 253c0b746e5SOllivier Robert (void) fprintf(stderr, 254c0b746e5SOllivier Robert "***Incorrect item size returned by remote host (%d should be %d)\n", 255c0b746e5SOllivier Robert itemsize, expected); 256c0b746e5SOllivier Robert return 0; 257c0b746e5SOllivier Robert } 258c0b746e5SOllivier Robert return 1; 259c0b746e5SOllivier Robert } 260c0b746e5SOllivier Robert 261c0b746e5SOllivier Robert 262c0b746e5SOllivier Robert /* 263c0b746e5SOllivier Robert * check1item - check to make sure we have exactly one item 264c0b746e5SOllivier Robert */ 265c0b746e5SOllivier Robert static int 266c0b746e5SOllivier Robert check1item( 267c0b746e5SOllivier Robert int items, 268c0b746e5SOllivier Robert FILE *fp 269c0b746e5SOllivier Robert ) 270c0b746e5SOllivier Robert { 271c0b746e5SOllivier Robert if (items == 0) { 272c0b746e5SOllivier Robert (void) fprintf(fp, "No data returned in response to query\n"); 273c0b746e5SOllivier Robert return 0; 274c0b746e5SOllivier Robert } 275c0b746e5SOllivier Robert if (items > 1) { 276c0b746e5SOllivier Robert (void) fprintf(fp, "Expected one item in response, got %d\n", 277c0b746e5SOllivier Robert items); 278c0b746e5SOllivier Robert return 0; 279c0b746e5SOllivier Robert } 280c0b746e5SOllivier Robert return 1; 281c0b746e5SOllivier Robert } 282c0b746e5SOllivier Robert 283c0b746e5SOllivier Robert 284c0b746e5SOllivier Robert 285c0b746e5SOllivier Robert /* 286c0b746e5SOllivier Robert * peerlist - get a short list of peers 287c0b746e5SOllivier Robert */ 288c0b746e5SOllivier Robert /*ARGSUSED*/ 289c0b746e5SOllivier Robert static void 290c0b746e5SOllivier Robert peerlist( 291c0b746e5SOllivier Robert struct parse *pcmd, 292c0b746e5SOllivier Robert FILE *fp 293c0b746e5SOllivier Robert ) 294c0b746e5SOllivier Robert { 295c0b746e5SOllivier Robert struct info_peer_list *plist; 296c0b746e5SOllivier Robert int items; 297c0b746e5SOllivier Robert int itemsize; 298c0b746e5SOllivier Robert int res; 299c0b746e5SOllivier Robert 300c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_PEER_LIST, 0, 0, 0, (char *)NULL, &items, 301c0b746e5SOllivier Robert &itemsize, (char **)&plist, 0); 302c0b746e5SOllivier Robert 303c0b746e5SOllivier Robert if (res != 0 && items == 0) 304c0b746e5SOllivier Robert return; 305c0b746e5SOllivier Robert 306c0b746e5SOllivier Robert if (!checkitems(items, fp)) 307c0b746e5SOllivier Robert return; 308c0b746e5SOllivier Robert 309c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_peer_list))) 310c0b746e5SOllivier Robert return; 311c0b746e5SOllivier Robert 312c0b746e5SOllivier Robert while (items > 0) { 313c0b746e5SOllivier Robert (void) fprintf(fp, "%-9s %s\n", modetoa(plist->hmode), 314c0b746e5SOllivier Robert nntohost(plist->address)); 315c0b746e5SOllivier Robert plist++; 316c0b746e5SOllivier Robert items--; 317c0b746e5SOllivier Robert } 318c0b746e5SOllivier Robert } 319c0b746e5SOllivier Robert 320c0b746e5SOllivier Robert 321c0b746e5SOllivier Robert /* 322c0b746e5SOllivier Robert * peers - show peer summary 323c0b746e5SOllivier Robert */ 324c0b746e5SOllivier Robert static void 325c0b746e5SOllivier Robert peers( 326c0b746e5SOllivier Robert struct parse *pcmd, 327c0b746e5SOllivier Robert FILE *fp 328c0b746e5SOllivier Robert ) 329c0b746e5SOllivier Robert { 330c0b746e5SOllivier Robert dopeers(pcmd, fp, 0); 331c0b746e5SOllivier Robert } 332c0b746e5SOllivier Robert 333c0b746e5SOllivier Robert /* 334c0b746e5SOllivier Robert * dmpeers - show peer summary, Dave Mills style 335c0b746e5SOllivier Robert */ 336c0b746e5SOllivier Robert static void 337c0b746e5SOllivier Robert dmpeers( 338c0b746e5SOllivier Robert struct parse *pcmd, 339c0b746e5SOllivier Robert FILE *fp 340c0b746e5SOllivier Robert ) 341c0b746e5SOllivier Robert { 342c0b746e5SOllivier Robert dopeers(pcmd, fp, 1); 343c0b746e5SOllivier Robert } 344c0b746e5SOllivier Robert 345c0b746e5SOllivier Robert 346c0b746e5SOllivier Robert /* 347c0b746e5SOllivier Robert * peers - show peer summary 348c0b746e5SOllivier Robert */ 349c0b746e5SOllivier Robert /*ARGSUSED*/ 350c0b746e5SOllivier Robert static void 351c0b746e5SOllivier Robert dopeers( 352c0b746e5SOllivier Robert struct parse *pcmd, 353c0b746e5SOllivier Robert FILE *fp, 354c0b746e5SOllivier Robert int dmstyle 355c0b746e5SOllivier Robert ) 356c0b746e5SOllivier Robert { 357c0b746e5SOllivier Robert struct info_peer_summary *plist; 358c0b746e5SOllivier Robert int items; 359c0b746e5SOllivier Robert int itemsize; 360c0b746e5SOllivier Robert int ntp_poll; 361c0b746e5SOllivier Robert int res; 362c0b746e5SOllivier Robert int c; 363c0b746e5SOllivier Robert l_fp tempts; 364c0b746e5SOllivier Robert 365c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_PEER_LIST_SUM, 0, 0, 0, (char *)NULL, 366c0b746e5SOllivier Robert &items, &itemsize, (char **)&plist, 0); 367c0b746e5SOllivier Robert 368c0b746e5SOllivier Robert if (res != 0 && items == 0) 369c0b746e5SOllivier Robert return; 370c0b746e5SOllivier Robert 371c0b746e5SOllivier Robert if (!checkitems(items, fp)) 372c0b746e5SOllivier Robert return; 373c0b746e5SOllivier Robert 374c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_peer_summary))) 375c0b746e5SOllivier Robert return; 376c0b746e5SOllivier Robert 377c0b746e5SOllivier Robert (void) fprintf(fp, 378c0b746e5SOllivier Robert " remote local st poll reach delay offset disp\n"); 379c0b746e5SOllivier Robert (void) fprintf(fp, 380c0b746e5SOllivier Robert "=======================================================================\n"); 381c0b746e5SOllivier Robert while (items > 0) { 382c0b746e5SOllivier Robert if (!dmstyle) { 383c0b746e5SOllivier Robert if (plist->flags & INFO_FLAG_SYSPEER) 384c0b746e5SOllivier Robert c = '*'; 385c0b746e5SOllivier Robert else if (plist->hmode == MODE_ACTIVE) 386c0b746e5SOllivier Robert c = '+'; 387c0b746e5SOllivier Robert else if (plist->hmode == MODE_PASSIVE) 388c0b746e5SOllivier Robert c = '-'; 389c0b746e5SOllivier Robert else if (plist->hmode == MODE_CLIENT) 390c0b746e5SOllivier Robert c = '='; 391c0b746e5SOllivier Robert else if (plist->hmode == MODE_BROADCAST) 392c0b746e5SOllivier Robert c = '^'; 393c0b746e5SOllivier Robert else if (plist->hmode == MODE_BCLIENT) 394c0b746e5SOllivier Robert c = '~'; 395c0b746e5SOllivier Robert else 396c0b746e5SOllivier Robert c = ' '; 397c0b746e5SOllivier Robert } else { 398c0b746e5SOllivier Robert if (plist->flags & INFO_FLAG_SYSPEER) 399c0b746e5SOllivier Robert c = '*'; 400c0b746e5SOllivier Robert else if (plist->flags & INFO_FLAG_SHORTLIST) 401c0b746e5SOllivier Robert c = '+'; 402c0b746e5SOllivier Robert else if (plist->flags & INFO_FLAG_SEL_CANDIDATE) 403c0b746e5SOllivier Robert c = '.'; 404c0b746e5SOllivier Robert else 405c0b746e5SOllivier Robert c = ' '; 406c0b746e5SOllivier Robert } 407c0b746e5SOllivier Robert NTOHL_FP(&(plist->offset), &tempts); 408c0b746e5SOllivier Robert ntp_poll = 1<<max(min3(plist->ppoll, plist->hpoll, NTP_MAXPOLL), 409c0b746e5SOllivier Robert NTP_MINPOLL); 410c0b746e5SOllivier Robert (void) fprintf(fp, 411c0b746e5SOllivier Robert "%c%-15.15s %-15.15s %2d %4d %3o %7.7s %9.9s %7.7s\n", 412c0b746e5SOllivier Robert c, nntohost(plist->srcadr), 413c0b746e5SOllivier Robert numtoa(plist->dstadr), 414c0b746e5SOllivier Robert plist->stratum, ntp_poll, plist->reach, 415c0b746e5SOllivier Robert fptoa(NTOHS_FP(plist->delay), 5), 416c0b746e5SOllivier Robert lfptoa(&tempts, 6), 417c0b746e5SOllivier Robert ufptoa(NTOHS_FP(plist->dispersion), 5)); 418c0b746e5SOllivier Robert 419c0b746e5SOllivier Robert plist++; 420c0b746e5SOllivier Robert items--; 421c0b746e5SOllivier Robert } 422c0b746e5SOllivier Robert } 423c0b746e5SOllivier Robert 424c0b746e5SOllivier Robert /* Convert a refid & stratum (in host order) to a string */ 425c0b746e5SOllivier Robert static char* 426c0b746e5SOllivier Robert refid_string( 427c0b746e5SOllivier Robert u_int32 refid, 428c0b746e5SOllivier Robert int stratum 429c0b746e5SOllivier Robert ) 430c0b746e5SOllivier Robert { 431c0b746e5SOllivier Robert if (stratum <= 1) { 432c0b746e5SOllivier Robert static char junk[5]; 433c0b746e5SOllivier Robert junk[4] = 0; 434c0b746e5SOllivier Robert memmove(junk, (char *)&refid, 4); 435c0b746e5SOllivier Robert return junk; 436c0b746e5SOllivier Robert } 437c0b746e5SOllivier Robert 438c0b746e5SOllivier Robert return numtoa(refid); 439c0b746e5SOllivier Robert } 440c0b746e5SOllivier Robert 441c0b746e5SOllivier Robert /* 442c0b746e5SOllivier Robert * printpeer - print detail information for a peer 443c0b746e5SOllivier Robert */ 444c0b746e5SOllivier Robert static void 445c0b746e5SOllivier Robert printpeer( 446c0b746e5SOllivier Robert register struct info_peer *pp, 447c0b746e5SOllivier Robert FILE *fp 448c0b746e5SOllivier Robert ) 449c0b746e5SOllivier Robert { 450c0b746e5SOllivier Robert register int i; 451c0b746e5SOllivier Robert const char *str; 452c0b746e5SOllivier Robert l_fp tempts; 453c0b746e5SOllivier Robert 454c0b746e5SOllivier Robert (void) fprintf(fp, "remote %s, local %s\n", 455c0b746e5SOllivier Robert numtoa(pp->srcadr), numtoa(pp->dstadr)); 456c0b746e5SOllivier Robert 457c0b746e5SOllivier Robert (void) fprintf(fp, "hmode %s, pmode %s, stratum %d, precision %d\n", 458c0b746e5SOllivier Robert modetoa(pp->hmode), modetoa(pp->pmode), 459c0b746e5SOllivier Robert pp->stratum, pp->precision); 460c0b746e5SOllivier Robert 461c0b746e5SOllivier Robert (void) fprintf(fp, 462c0b746e5SOllivier Robert "leap %c%c, refid [%s], rootdistance %s, rootdispersion %s\n", 463c0b746e5SOllivier Robert pp->leap & 0x2 ? '1' : '0', 464c0b746e5SOllivier Robert pp->leap & 0x1 ? '1' : '0', 465c0b746e5SOllivier Robert refid_string(pp->refid, pp->stratum), fptoa(NTOHS_FP(pp->rootdelay), 5), 466c0b746e5SOllivier Robert ufptoa(NTOHS_FP(pp->rootdispersion), 5)); 467c0b746e5SOllivier Robert 468c0b746e5SOllivier Robert (void) fprintf(fp, 469c0b746e5SOllivier Robert "ppoll %d, hpoll %d, keyid %lu, version %d, association %u\n", 470c0b746e5SOllivier Robert pp->ppoll, pp->hpoll, (u_long)pp->keyid, pp->version, ntohs(pp->associd)); 471c0b746e5SOllivier Robert 472c0b746e5SOllivier Robert (void) fprintf(fp, 473c0b746e5SOllivier Robert "valid %d, reach %03o, unreach %d, flash 0x%04x, ", 474c0b746e5SOllivier Robert pp->valid, pp->reach, pp->unreach, pp->flash2); 475c0b746e5SOllivier Robert 476c0b746e5SOllivier Robert (void) fprintf(fp, "boffset %s, ttl/mode %d\n", 477c0b746e5SOllivier Robert fptoa(NTOHS_FP(pp->estbdelay), 5), pp->ttl); 478c0b746e5SOllivier Robert 479c0b746e5SOllivier Robert (void) fprintf(fp, "timer %lds, flags", (long)ntohl(pp->timer)); 480c0b746e5SOllivier Robert if (pp->flags == 0) { 481c0b746e5SOllivier Robert (void) fprintf(fp, " none\n"); 482c0b746e5SOllivier Robert } else { 483c0b746e5SOllivier Robert str = ""; 484c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_SYSPEER) { 485c0b746e5SOllivier Robert (void) fprintf(fp, " system_peer"); 486c0b746e5SOllivier Robert str = ","; 487c0b746e5SOllivier Robert } 488c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_CONFIG) { 489c0b746e5SOllivier Robert (void) fprintf(fp, "%s config", str); 490c0b746e5SOllivier Robert str = ","; 491c0b746e5SOllivier Robert } 492c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_REFCLOCK) { 493c0b746e5SOllivier Robert (void) fprintf(fp, "%s refclock", str); 494c0b746e5SOllivier Robert str = ","; 495c0b746e5SOllivier Robert } 496c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_AUTHENABLE) { 497c0b746e5SOllivier Robert (void) fprintf(fp, "%s auth", str); 498c0b746e5SOllivier Robert str = ","; 499c0b746e5SOllivier Robert } 500c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_BCLIENT) { 501c0b746e5SOllivier Robert (void) fprintf(fp, "%s bclient", str); 502c0b746e5SOllivier Robert str = ","; 503c0b746e5SOllivier Robert } 504c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_PREFER) { 505c0b746e5SOllivier Robert (void) fprintf(fp, "%s prefer", str); 506c0b746e5SOllivier Robert str = ","; 507c0b746e5SOllivier Robert } 508c0b746e5SOllivier Robert if (pp->flags & INFO_FLAG_BURST) { 509c0b746e5SOllivier Robert (void) fprintf(fp, "%s burst", str); 510c0b746e5SOllivier Robert } 511c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 512c0b746e5SOllivier Robert } 513c0b746e5SOllivier Robert 514c0b746e5SOllivier Robert NTOHL_FP(&pp->reftime, &tempts); 515c0b746e5SOllivier Robert (void) fprintf(fp, "reference time: %s\n", 516c0b746e5SOllivier Robert prettydate(&tempts)); 517c0b746e5SOllivier Robert NTOHL_FP(&pp->org, &tempts); 518c0b746e5SOllivier Robert (void) fprintf(fp, "originate timestamp: %s\n", 519c0b746e5SOllivier Robert prettydate(&tempts)); 520c0b746e5SOllivier Robert NTOHL_FP(&pp->rec, &tempts); 521c0b746e5SOllivier Robert (void) fprintf(fp, "receive timestamp: %s\n", 522c0b746e5SOllivier Robert prettydate(&tempts)); 523c0b746e5SOllivier Robert NTOHL_FP(&pp->xmt, &tempts); 524c0b746e5SOllivier Robert (void) fprintf(fp, "transmit timestamp: %s\n", 525c0b746e5SOllivier Robert prettydate(&tempts)); 526c0b746e5SOllivier Robert 527c0b746e5SOllivier Robert (void) fprintf(fp, "filter delay: "); 528c0b746e5SOllivier Robert for (i = 0; i < NTP_SHIFT; i++) { 529c0b746e5SOllivier Robert (void) fprintf(fp, " %-8.8s", 530c0b746e5SOllivier Robert fptoa(NTOHS_FP(pp->filtdelay[i]), 5)); 531c0b746e5SOllivier Robert if (i == (NTP_SHIFT>>1)-1) 532c0b746e5SOllivier Robert (void) fprintf(fp, "\n "); 533c0b746e5SOllivier Robert } 534c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 535c0b746e5SOllivier Robert 536c0b746e5SOllivier Robert (void) fprintf(fp, "filter offset:"); 537c0b746e5SOllivier Robert for (i = 0; i < NTP_SHIFT; i++) { 538c0b746e5SOllivier Robert NTOHL_FP(&pp->filtoffset[i], &tempts); 539c0b746e5SOllivier Robert (void) fprintf(fp, " %-8.8s", lfptoa(&tempts, 6)); 540c0b746e5SOllivier Robert if (i == (NTP_SHIFT>>1)-1) 541c0b746e5SOllivier Robert (void) fprintf(fp, "\n "); 542c0b746e5SOllivier Robert } 543c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 544c0b746e5SOllivier Robert 545c0b746e5SOllivier Robert (void) fprintf(fp, "filter order: "); 546c0b746e5SOllivier Robert for (i = 0; i < NTP_SHIFT; i++) { 547c0b746e5SOllivier Robert (void) fprintf(fp, " %-8d", pp->order[i]); 548c0b746e5SOllivier Robert if (i == (NTP_SHIFT>>1)-1) 549c0b746e5SOllivier Robert (void) fprintf(fp, "\n "); 550c0b746e5SOllivier Robert } 551c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 552c0b746e5SOllivier Robert 553c0b746e5SOllivier Robert 554c0b746e5SOllivier Robert NTOHL_FP(&pp->offset, &tempts); 555c0b746e5SOllivier Robert (void) fprintf(fp, 556c0b746e5SOllivier Robert "offset %s, delay %s, error bound %s, filter error %s\n", 557c0b746e5SOllivier Robert lfptoa(&tempts, 6), fptoa(NTOHS_FP(pp->delay), 5), 558c0b746e5SOllivier Robert ufptoa(NTOHS_FP(pp->dispersion), 5), 559c0b746e5SOllivier Robert ufptoa(NTOHS_FP(pp->selectdisp), 5)); 560c0b746e5SOllivier Robert } 561c0b746e5SOllivier Robert 562c0b746e5SOllivier Robert 563c0b746e5SOllivier Robert /* 564c0b746e5SOllivier Robert * showpeer - show detailed information for a peer 565c0b746e5SOllivier Robert */ 566c0b746e5SOllivier Robert static void 567c0b746e5SOllivier Robert showpeer( 568c0b746e5SOllivier Robert struct parse *pcmd, 569c0b746e5SOllivier Robert FILE *fp 570c0b746e5SOllivier Robert ) 571c0b746e5SOllivier Robert { 572c0b746e5SOllivier Robert struct info_peer *pp; 573c0b746e5SOllivier Robert /* 4 is the maximum number of peers which will fit in a packet */ 574c0b746e5SOllivier Robert struct info_peer_list plist[min(MAXARGS, 4)]; 575c0b746e5SOllivier Robert int qitems; 576c0b746e5SOllivier Robert int items; 577c0b746e5SOllivier Robert int itemsize; 578c0b746e5SOllivier Robert int res; 579c0b746e5SOllivier Robert 580c0b746e5SOllivier Robert for (qitems = 0; qitems < min(pcmd->nargs, 4); qitems++) { 581c0b746e5SOllivier Robert plist[qitems].address = pcmd->argval[qitems].netnum; 582c0b746e5SOllivier Robert plist[qitems].port = server_entry->s_port; 583c0b746e5SOllivier Robert plist[qitems].hmode = plist[qitems].flags = 0; 584c0b746e5SOllivier Robert } 585c0b746e5SOllivier Robert 586c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_PEER_INFO, 0, qitems, 587c0b746e5SOllivier Robert sizeof(struct info_peer_list), (char *)plist, &items, 588c0b746e5SOllivier Robert &itemsize, (char **)&pp, 0); 589c0b746e5SOllivier Robert 590c0b746e5SOllivier Robert if (res != 0 && items == 0) 591c0b746e5SOllivier Robert return; 592c0b746e5SOllivier Robert 593c0b746e5SOllivier Robert if (!checkitems(items, fp)) 594c0b746e5SOllivier Robert return; 595c0b746e5SOllivier Robert 596c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_peer))) 597c0b746e5SOllivier Robert return; 598c0b746e5SOllivier Robert 599c0b746e5SOllivier Robert while (items-- > 0) { 600c0b746e5SOllivier Robert printpeer(pp, fp); 601c0b746e5SOllivier Robert if (items > 0) 602c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 603c0b746e5SOllivier Robert pp++; 604c0b746e5SOllivier Robert } 605c0b746e5SOllivier Robert } 606c0b746e5SOllivier Robert 607c0b746e5SOllivier Robert 608c0b746e5SOllivier Robert /* 609c0b746e5SOllivier Robert * peerstats - return statistics for a peer 610c0b746e5SOllivier Robert */ 611c0b746e5SOllivier Robert static void 612c0b746e5SOllivier Robert peerstats( 613c0b746e5SOllivier Robert struct parse *pcmd, 614c0b746e5SOllivier Robert FILE *fp 615c0b746e5SOllivier Robert ) 616c0b746e5SOllivier Robert { 617c0b746e5SOllivier Robert struct info_peer_stats *pp; 618c0b746e5SOllivier Robert /* 4 is the maximum number of peers which will fit in a packet */ 619c0b746e5SOllivier Robert struct info_peer_list plist[min(MAXARGS, 4)]; 620c0b746e5SOllivier Robert int qitems; 621c0b746e5SOllivier Robert int items; 622c0b746e5SOllivier Robert int itemsize; 623c0b746e5SOllivier Robert int res; 624c0b746e5SOllivier Robert 625c0b746e5SOllivier Robert for (qitems = 0; qitems < min(pcmd->nargs, 4); qitems++) { 626c0b746e5SOllivier Robert plist[qitems].address = pcmd->argval[qitems].netnum; 627c0b746e5SOllivier Robert plist[qitems].port = server_entry->s_port; 628c0b746e5SOllivier Robert plist[qitems].hmode = plist[qitems].flags = 0; 629c0b746e5SOllivier Robert } 630c0b746e5SOllivier Robert 631c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_PEER_STATS, 0, qitems, 632c0b746e5SOllivier Robert sizeof(struct info_peer_list), (char *)plist, &items, 633c0b746e5SOllivier Robert &itemsize, (char **)&pp, 0); 634c0b746e5SOllivier Robert 635c0b746e5SOllivier Robert if (res != 0 && items == 0) 636c0b746e5SOllivier Robert return; 637c0b746e5SOllivier Robert 638c0b746e5SOllivier Robert if (!checkitems(items, fp)) 639c0b746e5SOllivier Robert return; 640c0b746e5SOllivier Robert 641c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_peer_stats))) 642c0b746e5SOllivier Robert return; 643c0b746e5SOllivier Robert 644c0b746e5SOllivier Robert while (items-- > 0) { 645c0b746e5SOllivier Robert (void) fprintf(fp, "remote host: %s\n", 646c0b746e5SOllivier Robert nntohost(pp->srcadr)); 647c0b746e5SOllivier Robert (void) fprintf(fp, "local interface: %s\n", 648c0b746e5SOllivier Robert numtoa(pp->dstadr)); 649c0b746e5SOllivier Robert (void) fprintf(fp, "time last received: %lds\n", 650c0b746e5SOllivier Robert (long)ntohl(pp->timereceived)); 651c0b746e5SOllivier Robert (void) fprintf(fp, "time until next send: %lds\n", 652c0b746e5SOllivier Robert (long)ntohl(pp->timetosend)); 653c0b746e5SOllivier Robert (void) fprintf(fp, "reachability change: %lds\n", 654c0b746e5SOllivier Robert (long)ntohl(pp->timereachable)); 655c0b746e5SOllivier Robert (void) fprintf(fp, "packets sent: %ld\n", 656c0b746e5SOllivier Robert (long)ntohl(pp->sent)); 657c0b746e5SOllivier Robert (void) fprintf(fp, "packets received: %ld\n", 658c0b746e5SOllivier Robert (long)ntohl(pp->processed)); 659c0b746e5SOllivier Robert (void) fprintf(fp, "bad authentication: %ld\n", 660c0b746e5SOllivier Robert (long)ntohl(pp->badauth)); 661c0b746e5SOllivier Robert (void) fprintf(fp, "bogus origin: %ld\n", 662c0b746e5SOllivier Robert (long)ntohl(pp->bogusorg)); 663c0b746e5SOllivier Robert (void) fprintf(fp, "duplicate: %ld\n", 664c0b746e5SOllivier Robert (long)ntohl(pp->oldpkt)); 665c0b746e5SOllivier Robert (void) fprintf(fp, "bad dispersion: %ld\n", 666c0b746e5SOllivier Robert (long)ntohl(pp->seldisp)); 667c0b746e5SOllivier Robert (void) fprintf(fp, "bad reference time: %ld\n", 668c0b746e5SOllivier Robert (long)ntohl(pp->selbroken)); 669c0b746e5SOllivier Robert (void) fprintf(fp, "candidate order: %d\n", 670c0b746e5SOllivier Robert (int)pp->candidate); 671c0b746e5SOllivier Robert if (items > 0) 672c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 673c0b746e5SOllivier Robert pp++; 674c0b746e5SOllivier Robert } 675c0b746e5SOllivier Robert } 676c0b746e5SOllivier Robert 677c0b746e5SOllivier Robert 678c0b746e5SOllivier Robert /* 679c0b746e5SOllivier Robert * loopinfo - show loop filter information 680c0b746e5SOllivier Robert */ 681c0b746e5SOllivier Robert static void 682c0b746e5SOllivier Robert loopinfo( 683c0b746e5SOllivier Robert struct parse *pcmd, 684c0b746e5SOllivier Robert FILE *fp 685c0b746e5SOllivier Robert ) 686c0b746e5SOllivier Robert { 687c0b746e5SOllivier Robert struct info_loop *il; 688c0b746e5SOllivier Robert int items; 689c0b746e5SOllivier Robert int itemsize; 690c0b746e5SOllivier Robert int oneline = 0; 691c0b746e5SOllivier Robert int res; 692c0b746e5SOllivier Robert l_fp tempts; 693c0b746e5SOllivier Robert 694c0b746e5SOllivier Robert if (pcmd->nargs > 0) { 695c0b746e5SOllivier Robert if (STREQ(pcmd->argval[0].string, "oneline")) 696c0b746e5SOllivier Robert oneline = 1; 697c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[0].string, "multiline")) 698c0b746e5SOllivier Robert oneline = 0; 699c0b746e5SOllivier Robert else { 700c0b746e5SOllivier Robert (void) fprintf(stderr, "How many lines?\n"); 701c0b746e5SOllivier Robert return; 702c0b746e5SOllivier Robert } 703c0b746e5SOllivier Robert } 704c0b746e5SOllivier Robert 705c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_LOOP_INFO, 0, 0, 0, (char *)NULL, 706c0b746e5SOllivier Robert &items, &itemsize, (char **)&il, 0); 707c0b746e5SOllivier Robert 708c0b746e5SOllivier Robert if (res != 0 && items == 0) 709c0b746e5SOllivier Robert return; 710c0b746e5SOllivier Robert 711c0b746e5SOllivier Robert if (!check1item(items, fp)) 712c0b746e5SOllivier Robert return; 713c0b746e5SOllivier Robert 714c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_loop))) 715c0b746e5SOllivier Robert return; 716c0b746e5SOllivier Robert 717c0b746e5SOllivier Robert if (oneline) { 718c0b746e5SOllivier Robert l_fp temp2ts; 719c0b746e5SOllivier Robert 720c0b746e5SOllivier Robert NTOHL_FP(&il->last_offset, &tempts); 721c0b746e5SOllivier Robert NTOHL_FP(&il->drift_comp, &temp2ts); 722c0b746e5SOllivier Robert 723c0b746e5SOllivier Robert (void) fprintf(fp, 724c0b746e5SOllivier Robert "offset %s, frequency %s, time_const %ld, watchdog %ld\n", 725c0b746e5SOllivier Robert lfptoa(&tempts, 6), 726c0b746e5SOllivier Robert lfptoa(&temp2ts, 3), 727c0b746e5SOllivier Robert (u_long)ntohl(il->compliance), 728c0b746e5SOllivier Robert (u_long)ntohl(il->watchdog_timer)); 729c0b746e5SOllivier Robert } else { 730c0b746e5SOllivier Robert NTOHL_FP(&il->last_offset, &tempts); 731c0b746e5SOllivier Robert (void) fprintf(fp, "offset: %s s\n", 732c0b746e5SOllivier Robert lfptoa(&tempts, 6)); 733c0b746e5SOllivier Robert NTOHL_FP(&il->drift_comp, &tempts); 734c0b746e5SOllivier Robert (void) fprintf(fp, "frequency: %s ppm\n", 735c0b746e5SOllivier Robert lfptoa(&tempts, 3)); 736c0b746e5SOllivier Robert (void) fprintf(fp, "poll adjust: %ld\n", 737c0b746e5SOllivier Robert (u_long)ntohl(il->compliance)); 738c0b746e5SOllivier Robert (void) fprintf(fp, "watchdog timer: %ld s\n", 739c0b746e5SOllivier Robert (u_long)ntohl(il->watchdog_timer)); 740c0b746e5SOllivier Robert } 741c0b746e5SOllivier Robert } 742c0b746e5SOllivier Robert 743c0b746e5SOllivier Robert 744c0b746e5SOllivier Robert /* 745c0b746e5SOllivier Robert * sysinfo - show current system state 746c0b746e5SOllivier Robert */ 747c0b746e5SOllivier Robert /*ARGSUSED*/ 748c0b746e5SOllivier Robert static void 749c0b746e5SOllivier Robert sysinfo( 750c0b746e5SOllivier Robert struct parse *pcmd, 751c0b746e5SOllivier Robert FILE *fp 752c0b746e5SOllivier Robert ) 753c0b746e5SOllivier Robert { 754c0b746e5SOllivier Robert struct info_sys *is; 755c0b746e5SOllivier Robert int items; 756c0b746e5SOllivier Robert int itemsize; 757c0b746e5SOllivier Robert int res; 758c0b746e5SOllivier Robert l_fp tempts; 759c0b746e5SOllivier Robert 760c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_SYS_INFO, 0, 0, 0, (char *)NULL, 761c0b746e5SOllivier Robert &items, &itemsize, (char **)&is, 0); 762c0b746e5SOllivier Robert 763c0b746e5SOllivier Robert if (res != 0 && items == 0) 764c0b746e5SOllivier Robert return; 765c0b746e5SOllivier Robert 766c0b746e5SOllivier Robert if (!check1item(items, fp)) 767c0b746e5SOllivier Robert return; 768c0b746e5SOllivier Robert 769c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_sys))) 770c0b746e5SOllivier Robert return; 771c0b746e5SOllivier Robert 772c0b746e5SOllivier Robert (void) fprintf(fp, "system peer: %s\n", nntohost(is->peer)); 773c0b746e5SOllivier Robert (void) fprintf(fp, "system peer mode: %s\n", modetoa(is->peer_mode)); 774c0b746e5SOllivier Robert (void) fprintf(fp, "leap indicator: %c%c\n", 775c0b746e5SOllivier Robert is->leap & 0x2 ? '1' : '0', 776c0b746e5SOllivier Robert is->leap & 0x1 ? '1' : '0'); 777c0b746e5SOllivier Robert (void) fprintf(fp, "stratum: %d\n", (int)is->stratum); 778c0b746e5SOllivier Robert (void) fprintf(fp, "precision: %d\n", (int)is->precision); 779c0b746e5SOllivier Robert (void) fprintf(fp, "root distance: %s s\n", 780c0b746e5SOllivier Robert fptoa(NTOHS_FP(is->rootdelay), 5)); 781c0b746e5SOllivier Robert (void) fprintf(fp, "root dispersion: %s s\n", 782c0b746e5SOllivier Robert ufptoa(NTOHS_FP(is->rootdispersion), 5)); 783c0b746e5SOllivier Robert (void) fprintf(fp, "reference ID: [%s]\n", 784c0b746e5SOllivier Robert refid_string(is->refid, is->stratum)); 785c0b746e5SOllivier Robert NTOHL_FP(&is->reftime, &tempts); 786c0b746e5SOllivier Robert (void) fprintf(fp, "reference time: %s\n", prettydate(&tempts)); 787c0b746e5SOllivier Robert 788c0b746e5SOllivier Robert (void) fprintf(fp, "system flags: "); 789c0b746e5SOllivier Robert if ((is->flags & (INFO_FLAG_BCLIENT | INFO_FLAG_AUTHENABLE | 790c0b746e5SOllivier Robert INFO_FLAG_NTP | INFO_FLAG_KERNEL| INFO_FLAG_PLL_SYNC | 791c0b746e5SOllivier Robert INFO_FLAG_PPS_SYNC | INFO_FLAG_MONITOR | INFO_FLAG_FILEGEN)) == 0) { 792c0b746e5SOllivier Robert (void) fprintf(fp, "none\n"); 793c0b746e5SOllivier Robert } else { 794c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_BCLIENT) 795c0b746e5SOllivier Robert (void) fprintf(fp, "bclient "); 796c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_AUTHENTICATE) 797c0b746e5SOllivier Robert (void) fprintf(fp, "auth "); 798c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_MONITOR) 799c0b746e5SOllivier Robert (void) fprintf(fp, "monitor "); 800c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_NTP) 801c0b746e5SOllivier Robert (void) fprintf(fp, "ntp "); 802c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_KERNEL) 803c0b746e5SOllivier Robert (void) fprintf(fp, "kernel "); 804c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_FILEGEN) 805c0b746e5SOllivier Robert (void) fprintf(fp, "stats "); 806c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_PLL_SYNC) 807c0b746e5SOllivier Robert (void) fprintf(fp, "kernel_sync "); 808c0b746e5SOllivier Robert if (is->flags & INFO_FLAG_PPS_SYNC) 809c0b746e5SOllivier Robert (void) fprintf(fp, "pps_sync "); 810c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 811c0b746e5SOllivier Robert } 812c0b746e5SOllivier Robert (void) fprintf(fp, "jitter: %s s\n", 813c0b746e5SOllivier Robert fptoa(ntohl(is->frequency), 6)); 814c0b746e5SOllivier Robert (void) fprintf(fp, "stability: %s ppm\n", 815c0b746e5SOllivier Robert ufptoa(ntohl(is->stability), 3)); 816c0b746e5SOllivier Robert (void) fprintf(fp, "broadcastdelay: %s s\n", 817c0b746e5SOllivier Robert fptoa(NTOHS_FP(is->bdelay), 6)); 818c0b746e5SOllivier Robert NTOHL_FP(&is->authdelay, &tempts); 819c0b746e5SOllivier Robert (void) fprintf(fp, "authdelay: %s s\n", lfptoa(&tempts, 6)); 820c0b746e5SOllivier Robert } 821c0b746e5SOllivier Robert 822c0b746e5SOllivier Robert 823c0b746e5SOllivier Robert /* 824c0b746e5SOllivier Robert * sysstats - print system statistics 825c0b746e5SOllivier Robert */ 826c0b746e5SOllivier Robert /*ARGSUSED*/ 827c0b746e5SOllivier Robert static void 828c0b746e5SOllivier Robert sysstats( 829c0b746e5SOllivier Robert struct parse *pcmd, 830c0b746e5SOllivier Robert FILE *fp 831c0b746e5SOllivier Robert ) 832c0b746e5SOllivier Robert { 833c0b746e5SOllivier Robert struct info_sys_stats *ss; 834c0b746e5SOllivier Robert int items; 835c0b746e5SOllivier Robert int itemsize; 836c0b746e5SOllivier Robert int res; 837c0b746e5SOllivier Robert 838c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_SYS_STATS, 0, 0, 0, (char *)NULL, 839c0b746e5SOllivier Robert &items, &itemsize, (char **)&ss, 0); 840c0b746e5SOllivier Robert 841c0b746e5SOllivier Robert if (res != 0 && items == 0) 842c0b746e5SOllivier Robert return; 843c0b746e5SOllivier Robert 844c0b746e5SOllivier Robert if (!check1item(items, fp)) 845c0b746e5SOllivier Robert return; 846c0b746e5SOllivier Robert 847c0b746e5SOllivier Robert if (itemsize != sizeof(struct info_sys_stats) && 848c0b746e5SOllivier Robert itemsize != sizeof(struct old_info_sys_stats)) { 849c0b746e5SOllivier Robert /* issue warning according to new structure size */ 850c0b746e5SOllivier Robert checkitemsize(itemsize, sizeof(struct info_sys_stats)); 851c0b746e5SOllivier Robert return; 852c0b746e5SOllivier Robert } 853c0b746e5SOllivier Robert 854c0b746e5SOllivier Robert (void) fprintf(fp, "system uptime: %ld\n", 855c0b746e5SOllivier Robert (u_long)ntohl(ss->timeup)); 856c0b746e5SOllivier Robert (void) fprintf(fp, "time since reset: %ld\n", 857c0b746e5SOllivier Robert (u_long)ntohl(ss->timereset)); 858c0b746e5SOllivier Robert (void) fprintf(fp, "bad stratum in packet: %ld\n", 859c0b746e5SOllivier Robert (u_long)ntohl(ss->badstratum)); 860c0b746e5SOllivier Robert (void) fprintf(fp, "old version packets: %ld\n", 861c0b746e5SOllivier Robert (u_long)ntohl(ss->oldversionpkt)); 862c0b746e5SOllivier Robert (void) fprintf(fp, "new version packets: %ld\n", 863c0b746e5SOllivier Robert (u_long)ntohl(ss->newversionpkt)); 864c0b746e5SOllivier Robert (void) fprintf(fp, "unknown version number: %ld\n", 865c0b746e5SOllivier Robert (u_long)ntohl(ss->unknownversion)); 866c0b746e5SOllivier Robert (void) fprintf(fp, "bad packet length: %ld\n", 867c0b746e5SOllivier Robert (u_long)ntohl(ss->badlength)); 868c0b746e5SOllivier Robert (void) fprintf(fp, "packets processed: %ld\n", 869c0b746e5SOllivier Robert (u_long)ntohl(ss->processed)); 870c0b746e5SOllivier Robert (void) fprintf(fp, "bad authentication: %ld\n", 871c0b746e5SOllivier Robert (u_long)ntohl(ss->badauth)); 872c0b746e5SOllivier Robert if (itemsize != sizeof(struct info_sys_stats)) 873c0b746e5SOllivier Robert return; 874c0b746e5SOllivier Robert 875c0b746e5SOllivier Robert (void) fprintf(fp, "limitation rejects: %ld\n", 876c0b746e5SOllivier Robert (u_long)ntohl(ss->limitrejected)); 877c0b746e5SOllivier Robert } 878c0b746e5SOllivier Robert 879c0b746e5SOllivier Robert 880c0b746e5SOllivier Robert 881c0b746e5SOllivier Robert /* 882c0b746e5SOllivier Robert * iostats - print I/O statistics 883c0b746e5SOllivier Robert */ 884c0b746e5SOllivier Robert /*ARGSUSED*/ 885c0b746e5SOllivier Robert static void 886c0b746e5SOllivier Robert iostats( 887c0b746e5SOllivier Robert struct parse *pcmd, 888c0b746e5SOllivier Robert FILE *fp 889c0b746e5SOllivier Robert ) 890c0b746e5SOllivier Robert { 891c0b746e5SOllivier Robert struct info_io_stats *io; 892c0b746e5SOllivier Robert int items; 893c0b746e5SOllivier Robert int itemsize; 894c0b746e5SOllivier Robert int res; 895c0b746e5SOllivier Robert 896c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_IO_STATS, 0, 0, 0, (char *)NULL, 897c0b746e5SOllivier Robert &items, &itemsize, (char **)&io, 0); 898c0b746e5SOllivier Robert 899c0b746e5SOllivier Robert if (res != 0 && items == 0) 900c0b746e5SOllivier Robert return; 901c0b746e5SOllivier Robert 902c0b746e5SOllivier Robert if (!check1item(items, fp)) 903c0b746e5SOllivier Robert return; 904c0b746e5SOllivier Robert 905c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_io_stats))) 906c0b746e5SOllivier Robert return; 907c0b746e5SOllivier Robert 908c0b746e5SOllivier Robert (void) fprintf(fp, "time since reset: %ld\n", 909c0b746e5SOllivier Robert (u_long)ntohl(io->timereset)); 910c0b746e5SOllivier Robert (void) fprintf(fp, "receive buffers: %d\n", 911c0b746e5SOllivier Robert ntohs(io->totalrecvbufs)); 912c0b746e5SOllivier Robert (void) fprintf(fp, "free receive buffers: %d\n", 913c0b746e5SOllivier Robert ntohs(io->freerecvbufs)); 914c0b746e5SOllivier Robert (void) fprintf(fp, "used receive buffers: %d\n", 915c0b746e5SOllivier Robert ntohs(io->fullrecvbufs)); 916c0b746e5SOllivier Robert (void) fprintf(fp, "low water refills: %d\n", 917c0b746e5SOllivier Robert ntohs(io->lowwater)); 918c0b746e5SOllivier Robert (void) fprintf(fp, "dropped packets: %ld\n", 919c0b746e5SOllivier Robert (u_long)ntohl(io->dropped)); 920c0b746e5SOllivier Robert (void) fprintf(fp, "ignored packets: %ld\n", 921c0b746e5SOllivier Robert (u_long)ntohl(io->ignored)); 922c0b746e5SOllivier Robert (void) fprintf(fp, "received packets: %ld\n", 923c0b746e5SOllivier Robert (u_long)ntohl(io->received)); 924c0b746e5SOllivier Robert (void) fprintf(fp, "packets sent: %ld\n", 925c0b746e5SOllivier Robert (u_long)ntohl(io->sent)); 926c0b746e5SOllivier Robert (void) fprintf(fp, "packets not sent: %ld\n", 927c0b746e5SOllivier Robert (u_long)ntohl(io->notsent)); 928c0b746e5SOllivier Robert (void) fprintf(fp, "interrupts handled: %ld\n", 929c0b746e5SOllivier Robert (u_long)ntohl(io->interrupts)); 930c0b746e5SOllivier Robert (void) fprintf(fp, "received by int: %ld\n", 931c0b746e5SOllivier Robert (u_long)ntohl(io->int_received)); 932c0b746e5SOllivier Robert } 933c0b746e5SOllivier Robert 934c0b746e5SOllivier Robert 935c0b746e5SOllivier Robert /* 936c0b746e5SOllivier Robert * memstats - print peer memory statistics 937c0b746e5SOllivier Robert */ 938c0b746e5SOllivier Robert /*ARGSUSED*/ 939c0b746e5SOllivier Robert static void 940c0b746e5SOllivier Robert memstats( 941c0b746e5SOllivier Robert struct parse *pcmd, 942c0b746e5SOllivier Robert FILE *fp 943c0b746e5SOllivier Robert ) 944c0b746e5SOllivier Robert { 945c0b746e5SOllivier Robert struct info_mem_stats *mem; 946c0b746e5SOllivier Robert int i; 947c0b746e5SOllivier Robert int items; 948c0b746e5SOllivier Robert int itemsize; 949c0b746e5SOllivier Robert int res; 950c0b746e5SOllivier Robert 951c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_MEM_STATS, 0, 0, 0, (char *)NULL, 952c0b746e5SOllivier Robert &items, &itemsize, (char **)&mem, 0); 953c0b746e5SOllivier Robert 954c0b746e5SOllivier Robert if (res != 0 && items == 0) 955c0b746e5SOllivier Robert return; 956c0b746e5SOllivier Robert 957c0b746e5SOllivier Robert if (!check1item(items, fp)) 958c0b746e5SOllivier Robert return; 959c0b746e5SOllivier Robert 960c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_mem_stats))) 961c0b746e5SOllivier Robert return; 962c0b746e5SOllivier Robert 963c0b746e5SOllivier Robert (void) fprintf(fp, "time since reset: %ld\n", 964c0b746e5SOllivier Robert (u_long)ntohl(mem->timereset)); 965c0b746e5SOllivier Robert (void) fprintf(fp, "total peer memory: %d\n", 966c0b746e5SOllivier Robert ntohs(mem->totalpeermem)); 967c0b746e5SOllivier Robert (void) fprintf(fp, "free peer memory: %d\n", 968c0b746e5SOllivier Robert ntohs(mem->freepeermem)); 969c0b746e5SOllivier Robert (void) fprintf(fp, "calls to findpeer: %ld\n", 970c0b746e5SOllivier Robert (u_long)ntohl(mem->findpeer_calls)); 971c0b746e5SOllivier Robert (void) fprintf(fp, "new peer allocations: %ld\n", 972c0b746e5SOllivier Robert (u_long)ntohl(mem->allocations)); 973c0b746e5SOllivier Robert (void) fprintf(fp, "peer demobilizations: %ld\n", 974c0b746e5SOllivier Robert (u_long)ntohl(mem->demobilizations)); 975c0b746e5SOllivier Robert 976c0b746e5SOllivier Robert (void) fprintf(fp, "hash table counts: "); 977c0b746e5SOllivier Robert for (i = 0; i < HASH_SIZE; i++) { 978c0b746e5SOllivier Robert (void) fprintf(fp, "%4d", (int)mem->hashcount[i]); 979c0b746e5SOllivier Robert if ((i % 8) == 7 && i != (HASH_SIZE-1)) { 980c0b746e5SOllivier Robert (void) fprintf(fp, "\n "); 981c0b746e5SOllivier Robert } 982c0b746e5SOllivier Robert } 983c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 984c0b746e5SOllivier Robert } 985c0b746e5SOllivier Robert 986c0b746e5SOllivier Robert 987c0b746e5SOllivier Robert 988c0b746e5SOllivier Robert /* 989c0b746e5SOllivier Robert * timerstats - print timer statistics 990c0b746e5SOllivier Robert */ 991c0b746e5SOllivier Robert /*ARGSUSED*/ 992c0b746e5SOllivier Robert static void 993c0b746e5SOllivier Robert timerstats( 994c0b746e5SOllivier Robert struct parse *pcmd, 995c0b746e5SOllivier Robert FILE *fp 996c0b746e5SOllivier Robert ) 997c0b746e5SOllivier Robert { 998c0b746e5SOllivier Robert struct info_timer_stats *tim; 999c0b746e5SOllivier Robert int items; 1000c0b746e5SOllivier Robert int itemsize; 1001c0b746e5SOllivier Robert int res; 1002c0b746e5SOllivier Robert 1003c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_TIMER_STATS, 0, 0, 0, (char *)NULL, 1004c0b746e5SOllivier Robert &items, &itemsize, (char **)&tim, 0); 1005c0b746e5SOllivier Robert 1006c0b746e5SOllivier Robert if (res != 0 && items == 0) 1007c0b746e5SOllivier Robert return; 1008c0b746e5SOllivier Robert 1009c0b746e5SOllivier Robert if (!check1item(items, fp)) 1010c0b746e5SOllivier Robert return; 1011c0b746e5SOllivier Robert 1012c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_timer_stats))) 1013c0b746e5SOllivier Robert return; 1014c0b746e5SOllivier Robert 1015c0b746e5SOllivier Robert (void) fprintf(fp, "time since reset: %ld\n", 1016c0b746e5SOllivier Robert (u_long)ntohl(tim->timereset)); 1017c0b746e5SOllivier Robert (void) fprintf(fp, "alarms handled: %ld\n", 1018c0b746e5SOllivier Robert (u_long)ntohl(tim->alarms)); 1019c0b746e5SOllivier Robert (void) fprintf(fp, "alarm overruns: %ld\n", 1020c0b746e5SOllivier Robert (u_long)ntohl(tim->overflows)); 1021c0b746e5SOllivier Robert (void) fprintf(fp, "calls to transmit: %ld\n", 1022c0b746e5SOllivier Robert (u_long)ntohl(tim->xmtcalls)); 1023c0b746e5SOllivier Robert } 1024c0b746e5SOllivier Robert 1025c0b746e5SOllivier Robert 1026c0b746e5SOllivier Robert /* 1027c0b746e5SOllivier Robert * addpeer - configure an active mode association 1028c0b746e5SOllivier Robert */ 1029c0b746e5SOllivier Robert static void 1030c0b746e5SOllivier Robert addpeer( 1031c0b746e5SOllivier Robert struct parse *pcmd, 1032c0b746e5SOllivier Robert FILE *fp 1033c0b746e5SOllivier Robert ) 1034c0b746e5SOllivier Robert { 1035c0b746e5SOllivier Robert doconfig(pcmd, fp, MODE_ACTIVE, 0); 1036c0b746e5SOllivier Robert } 1037c0b746e5SOllivier Robert 1038c0b746e5SOllivier Robert 1039c0b746e5SOllivier Robert /* 1040c0b746e5SOllivier Robert * addserver - configure a client mode association 1041c0b746e5SOllivier Robert */ 1042c0b746e5SOllivier Robert static void 1043c0b746e5SOllivier Robert addserver( 1044c0b746e5SOllivier Robert struct parse *pcmd, 1045c0b746e5SOllivier Robert FILE *fp 1046c0b746e5SOllivier Robert ) 1047c0b746e5SOllivier Robert { 1048c0b746e5SOllivier Robert doconfig(pcmd, fp, MODE_CLIENT, 0); 1049c0b746e5SOllivier Robert } 1050c0b746e5SOllivier Robert 1051c0b746e5SOllivier Robert /* 1052c0b746e5SOllivier Robert * addrefclock - configure a reference clock association 1053c0b746e5SOllivier Robert */ 1054c0b746e5SOllivier Robert static void 1055c0b746e5SOllivier Robert addrefclock( 1056c0b746e5SOllivier Robert struct parse *pcmd, 1057c0b746e5SOllivier Robert FILE *fp 1058c0b746e5SOllivier Robert ) 1059c0b746e5SOllivier Robert { 1060c0b746e5SOllivier Robert doconfig(pcmd, fp, MODE_CLIENT, 1); 1061c0b746e5SOllivier Robert } 1062c0b746e5SOllivier Robert 1063c0b746e5SOllivier Robert /* 1064c0b746e5SOllivier Robert * broadcast - configure a broadcast mode association 1065c0b746e5SOllivier Robert */ 1066c0b746e5SOllivier Robert static void 1067c0b746e5SOllivier Robert broadcast( 1068c0b746e5SOllivier Robert struct parse *pcmd, 1069c0b746e5SOllivier Robert FILE *fp 1070c0b746e5SOllivier Robert ) 1071c0b746e5SOllivier Robert { 1072c0b746e5SOllivier Robert doconfig(pcmd, fp, MODE_BROADCAST, 0); 1073c0b746e5SOllivier Robert } 1074c0b746e5SOllivier Robert 1075c0b746e5SOllivier Robert 1076c0b746e5SOllivier Robert /* 1077c0b746e5SOllivier Robert * config - configure a new peer association 1078c0b746e5SOllivier Robert */ 1079c0b746e5SOllivier Robert static void 1080c0b746e5SOllivier Robert doconfig( 1081c0b746e5SOllivier Robert struct parse *pcmd, 1082c0b746e5SOllivier Robert FILE *fp, 1083c0b746e5SOllivier Robert int mode, 1084c0b746e5SOllivier Robert int refc 1085c0b746e5SOllivier Robert ) 1086c0b746e5SOllivier Robert { 1087c0b746e5SOllivier Robert struct conf_peer cpeer; 1088c0b746e5SOllivier Robert int items; 1089c0b746e5SOllivier Robert int itemsize; 1090c0b746e5SOllivier Robert char *dummy; 1091c0b746e5SOllivier Robert u_long keyid; 1092c0b746e5SOllivier Robert u_int version; 1093c0b746e5SOllivier Robert u_char minpoll; 1094c0b746e5SOllivier Robert u_int flags; 1095c0b746e5SOllivier Robert u_char cmode; 1096c0b746e5SOllivier Robert int res; 1097c0b746e5SOllivier Robert 1098c0b746e5SOllivier Robert keyid = 0; 1099c0b746e5SOllivier Robert version = NTP_OLDVERSION + 1; 1100c0b746e5SOllivier Robert flags = 0; 1101c0b746e5SOllivier Robert res = 0; 1102c0b746e5SOllivier Robert cmode = 0; 1103c0b746e5SOllivier Robert minpoll = NTP_MINDPOLL; 1104c0b746e5SOllivier Robert 1105c0b746e5SOllivier Robert items = pcmd->nargs; 1106c0b746e5SOllivier Robert 1107c0b746e5SOllivier Robert if (refc) { 1108c0b746e5SOllivier Robert if (pcmd->nargs > 1) { 1109c0b746e5SOllivier Robert cmode = (u_char) pcmd->argval[1].uval; 1110c0b746e5SOllivier Robert items = 2; 1111c0b746e5SOllivier Robert } 1112c0b746e5SOllivier Robert } else { 1113c0b746e5SOllivier Robert if (pcmd->nargs > 1) { 1114c0b746e5SOllivier Robert keyid = pcmd->argval[1].uval; 1115c0b746e5SOllivier Robert if (keyid > 0) { 1116c0b746e5SOllivier Robert flags |= CONF_FLAG_AUTHENABLE; 1117c0b746e5SOllivier Robert } 1118c0b746e5SOllivier Robert if (pcmd->nargs > 2) { 1119c0b746e5SOllivier Robert version = (u_int)pcmd->argval[2].uval; 1120c0b746e5SOllivier Robert if (version > NTP_VERSION || 1121c0b746e5SOllivier Robert version < NTP_OLDVERSION) { 1122c0b746e5SOllivier Robert (void)fprintf(fp, 1123c0b746e5SOllivier Robert "invalid version number %u\n", 1124c0b746e5SOllivier Robert version); 1125c0b746e5SOllivier Robert res++; 1126c0b746e5SOllivier Robert } 1127c0b746e5SOllivier Robert items = 3; 1128c0b746e5SOllivier Robert } 1129c0b746e5SOllivier Robert } 1130c0b746e5SOllivier Robert } 1131c0b746e5SOllivier Robert 1132c0b746e5SOllivier Robert while (pcmd->nargs > items) { 1133c0b746e5SOllivier Robert if (STREQ(pcmd->argval[items].string, "prefer")) 1134c0b746e5SOllivier Robert flags |= CONF_FLAG_PREFER; 1135c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[items].string, "burst")) 1136c0b746e5SOllivier Robert flags |= CONF_FLAG_BURST; 1137c0b746e5SOllivier Robert else { 1138c0b746e5SOllivier Robert long val; 1139c0b746e5SOllivier Robert if (!atoint(pcmd->argval[items].string, &val)) { 1140c0b746e5SOllivier Robert (void) fprintf(fp, 1141c0b746e5SOllivier Robert "%s not understood\n", 1142c0b746e5SOllivier Robert pcmd->argval[items].string); 1143c0b746e5SOllivier Robert res++; 1144c0b746e5SOllivier Robert break; 1145c0b746e5SOllivier Robert } else { 1146c0b746e5SOllivier Robert if (val >= NTP_MINPOLL && val <= NTP_MAXPOLL) { 1147c0b746e5SOllivier Robert minpoll = (u_char)val; 1148c0b746e5SOllivier Robert } else { 1149c0b746e5SOllivier Robert (void) fprintf(fp, 1150c0b746e5SOllivier Robert "minpol must be within %d..%d\n", 1151c0b746e5SOllivier Robert NTP_MINPOLL, NTP_MAXPOLL); 1152c0b746e5SOllivier Robert res++; 1153c0b746e5SOllivier Robert break; 1154c0b746e5SOllivier Robert } 1155c0b746e5SOllivier Robert } 1156c0b746e5SOllivier Robert } 1157c0b746e5SOllivier Robert items++; 1158c0b746e5SOllivier Robert } 1159c0b746e5SOllivier Robert 1160c0b746e5SOllivier Robert if (res) 1161c0b746e5SOllivier Robert return; 1162c0b746e5SOllivier Robert 1163c0b746e5SOllivier Robert memset((void *)&cpeer, 0, sizeof cpeer); 1164c0b746e5SOllivier Robert 1165c0b746e5SOllivier Robert cpeer.peeraddr = pcmd->argval[0].netnum; 1166c0b746e5SOllivier Robert cpeer.hmode = (u_char) mode; 1167c0b746e5SOllivier Robert cpeer.keyid = keyid; 1168c0b746e5SOllivier Robert cpeer.version = (u_char) version; 1169c0b746e5SOllivier Robert cpeer.minpoll = minpoll; 1170c0b746e5SOllivier Robert cpeer.maxpoll = NTP_MAXDPOLL; 1171c0b746e5SOllivier Robert cpeer.flags = (u_char)flags; 1172c0b746e5SOllivier Robert cpeer.ttl = cmode; 1173c0b746e5SOllivier Robert 1174c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_CONFIG, 1, 1, 1175c0b746e5SOllivier Robert sizeof(struct conf_peer), (char *)&cpeer, &items, 1176c0b746e5SOllivier Robert &itemsize, &dummy, 0); 1177c0b746e5SOllivier Robert 1178c0b746e5SOllivier Robert if (res == 0) 1179c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1180c0b746e5SOllivier Robert return; 1181c0b746e5SOllivier Robert } 1182c0b746e5SOllivier Robert 1183c0b746e5SOllivier Robert 1184c0b746e5SOllivier Robert /* 1185c0b746e5SOllivier Robert * unconfig - unconfigure some associations 1186c0b746e5SOllivier Robert */ 1187c0b746e5SOllivier Robert static void 1188c0b746e5SOllivier Robert unconfig( 1189c0b746e5SOllivier Robert struct parse *pcmd, 1190c0b746e5SOllivier Robert FILE *fp 1191c0b746e5SOllivier Robert ) 1192c0b746e5SOllivier Robert { 1193c0b746e5SOllivier Robert /* 8 is the maximum number of peers which will fit in a packet */ 1194c0b746e5SOllivier Robert struct conf_unpeer plist[min(MAXARGS, 8)]; 1195c0b746e5SOllivier Robert int qitems; 1196c0b746e5SOllivier Robert int items; 1197c0b746e5SOllivier Robert int itemsize; 1198c0b746e5SOllivier Robert char *dummy; 1199c0b746e5SOllivier Robert int res; 1200c0b746e5SOllivier Robert 1201c0b746e5SOllivier Robert for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) { 1202c0b746e5SOllivier Robert plist[qitems].peeraddr = pcmd->argval[qitems].netnum; 1203c0b746e5SOllivier Robert } 1204c0b746e5SOllivier Robert 1205c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_UNCONFIG, 1, qitems, 1206c0b746e5SOllivier Robert sizeof(struct conf_unpeer), (char *)plist, &items, 1207c0b746e5SOllivier Robert &itemsize, &dummy, 0); 1208c0b746e5SOllivier Robert 1209c0b746e5SOllivier Robert if (res == 0) 1210c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1211c0b746e5SOllivier Robert } 1212c0b746e5SOllivier Robert 1213c0b746e5SOllivier Robert 1214c0b746e5SOllivier Robert /* 1215c0b746e5SOllivier Robert * set - set some system flags 1216c0b746e5SOllivier Robert */ 1217c0b746e5SOllivier Robert static void 1218c0b746e5SOllivier Robert set( 1219c0b746e5SOllivier Robert struct parse *pcmd, 1220c0b746e5SOllivier Robert FILE *fp 1221c0b746e5SOllivier Robert ) 1222c0b746e5SOllivier Robert { 1223c0b746e5SOllivier Robert doset(pcmd, fp, REQ_SET_SYS_FLAG); 1224c0b746e5SOllivier Robert } 1225c0b746e5SOllivier Robert 1226c0b746e5SOllivier Robert 1227c0b746e5SOllivier Robert /* 1228c0b746e5SOllivier Robert * clear - clear some system flags 1229c0b746e5SOllivier Robert */ 1230c0b746e5SOllivier Robert static void 1231c0b746e5SOllivier Robert sys_clear( 1232c0b746e5SOllivier Robert struct parse *pcmd, 1233c0b746e5SOllivier Robert FILE *fp 1234c0b746e5SOllivier Robert ) 1235c0b746e5SOllivier Robert { 1236c0b746e5SOllivier Robert doset(pcmd, fp, REQ_CLR_SYS_FLAG); 1237c0b746e5SOllivier Robert } 1238c0b746e5SOllivier Robert 1239c0b746e5SOllivier Robert 1240c0b746e5SOllivier Robert /* 1241c0b746e5SOllivier Robert * doset - set/clear system flags 1242c0b746e5SOllivier Robert */ 1243c0b746e5SOllivier Robert static void 1244c0b746e5SOllivier Robert doset( 1245c0b746e5SOllivier Robert struct parse *pcmd, 1246c0b746e5SOllivier Robert FILE *fp, 1247c0b746e5SOllivier Robert int req 1248c0b746e5SOllivier Robert ) 1249c0b746e5SOllivier Robert { 1250c0b746e5SOllivier Robert /* 8 is the maximum number of peers which will fit in a packet */ 1251c0b746e5SOllivier Robert struct conf_sys_flags sys; 1252c0b746e5SOllivier Robert int items; 1253c0b746e5SOllivier Robert int itemsize; 1254c0b746e5SOllivier Robert char *dummy; 1255c0b746e5SOllivier Robert int res; 1256c0b746e5SOllivier Robert 1257c0b746e5SOllivier Robert sys.flags = 0; 1258c0b746e5SOllivier Robert res = 0; 1259c0b746e5SOllivier Robert for (items = 0; items < pcmd->nargs; items++) { 1260c0b746e5SOllivier Robert if (STREQ(pcmd->argval[items].string, "auth")) 1261c0b746e5SOllivier Robert sys.flags |= SYS_FLAG_AUTHENTICATE; 1262c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[items].string, "bclient")) 1263c0b746e5SOllivier Robert sys.flags |= SYS_FLAG_BCLIENT; 1264c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[items].string, "monitor")) 1265c0b746e5SOllivier Robert sys.flags |= SYS_FLAG_MONITOR; 1266c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[items].string, "ntp")) 1267c0b746e5SOllivier Robert sys.flags |= SYS_FLAG_NTP; 1268c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[items].string, "kernel")) 1269c0b746e5SOllivier Robert sys.flags |= SYS_FLAG_KERNEL; 1270c0b746e5SOllivier Robert else if (STREQ(pcmd->argval[items].string, "stats")) 1271c0b746e5SOllivier Robert sys.flags |= SYS_FLAG_FILEGEN; 1272c0b746e5SOllivier Robert else { 1273c0b746e5SOllivier Robert (void) fprintf(fp, "Unknown flag %s\n", 1274c0b746e5SOllivier Robert pcmd->argval[items].string); 1275c0b746e5SOllivier Robert res = 1; 1276c0b746e5SOllivier Robert } 1277c0b746e5SOllivier Robert } 1278c0b746e5SOllivier Robert 1279c0b746e5SOllivier Robert if (res || sys.flags == 0) 1280c0b746e5SOllivier Robert return; 1281c0b746e5SOllivier Robert 1282c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, req, 1, 1, 1283c0b746e5SOllivier Robert sizeof(struct conf_sys_flags), (char *)&sys, &items, 1284c0b746e5SOllivier Robert &itemsize, &dummy, 0); 1285c0b746e5SOllivier Robert 1286c0b746e5SOllivier Robert if (res == 0) 1287c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1288c0b746e5SOllivier Robert } 1289c0b746e5SOllivier Robert 1290c0b746e5SOllivier Robert 1291c0b746e5SOllivier Robert /* 1292c0b746e5SOllivier Robert * data for printing/interrpreting the restrict flags 1293c0b746e5SOllivier Robert */ 1294c0b746e5SOllivier Robert struct resflags { 1295c0b746e5SOllivier Robert const char *str; 1296c0b746e5SOllivier Robert int bit; 1297c0b746e5SOllivier Robert }; 1298c0b746e5SOllivier Robert 1299c0b746e5SOllivier Robert static struct resflags resflags[] = { 1300c0b746e5SOllivier Robert { "ignore", RES_IGNORE }, 1301c0b746e5SOllivier Robert { "noserve", RES_DONTSERVE }, 1302c0b746e5SOllivier Robert { "notrust", RES_DONTTRUST }, 1303c0b746e5SOllivier Robert { "noquery", RES_NOQUERY }, 1304c0b746e5SOllivier Robert { "nomodify", RES_NOMODIFY }, 1305c0b746e5SOllivier Robert { "nopeer", RES_NOPEER }, 1306c0b746e5SOllivier Robert { "notrap", RES_NOTRAP }, 1307c0b746e5SOllivier Robert { "lptrap", RES_LPTRAP }, 1308c0b746e5SOllivier Robert { "limited", RES_LIMITED }, 1309c0b746e5SOllivier Robert { "", 0 } 1310c0b746e5SOllivier Robert }; 1311c0b746e5SOllivier Robert 1312c0b746e5SOllivier Robert static struct resflags resmflags[] = { 1313c0b746e5SOllivier Robert { "ntpport", RESM_NTPONLY }, 1314c0b746e5SOllivier Robert { "interface", RESM_INTERFACE }, 1315c0b746e5SOllivier Robert { "", 0 } 1316c0b746e5SOllivier Robert }; 1317c0b746e5SOllivier Robert 1318c0b746e5SOllivier Robert 1319c0b746e5SOllivier Robert /* 1320c0b746e5SOllivier Robert * reslist - obtain and print the server's restrict list 1321c0b746e5SOllivier Robert */ 1322c0b746e5SOllivier Robert /*ARGSUSED*/ 1323c0b746e5SOllivier Robert static void 1324c0b746e5SOllivier Robert reslist( 1325c0b746e5SOllivier Robert struct parse *pcmd, 1326c0b746e5SOllivier Robert FILE *fp 1327c0b746e5SOllivier Robert ) 1328c0b746e5SOllivier Robert { 1329c0b746e5SOllivier Robert struct info_restrict *rl; 1330c0b746e5SOllivier Robert int items; 1331c0b746e5SOllivier Robert int itemsize; 1332c0b746e5SOllivier Robert int res; 1333c0b746e5SOllivier Robert char *addr; 1334c0b746e5SOllivier Robert char *mask; 1335c0b746e5SOllivier Robert struct resflags *rf; 1336c0b746e5SOllivier Robert u_int32 count; 1337c0b746e5SOllivier Robert u_short flags; 1338c0b746e5SOllivier Robert u_short mflags; 1339c0b746e5SOllivier Robert char flagstr[300]; 1340c0b746e5SOllivier Robert static const char *comma = ", "; 1341c0b746e5SOllivier Robert 1342c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_GET_RESTRICT, 0, 0, 0, (char *)NULL, 1343c0b746e5SOllivier Robert &items, &itemsize, (char **)&rl, 0); 1344c0b746e5SOllivier Robert 1345c0b746e5SOllivier Robert if (res != 0 && items == 0) 1346c0b746e5SOllivier Robert return; 1347c0b746e5SOllivier Robert 1348c0b746e5SOllivier Robert if (!checkitems(items, fp)) 1349c0b746e5SOllivier Robert return; 1350c0b746e5SOllivier Robert 1351c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_restrict))) 1352c0b746e5SOllivier Robert return; 1353c0b746e5SOllivier Robert 1354c0b746e5SOllivier Robert (void) fprintf(fp, 1355c0b746e5SOllivier Robert " address mask count flags\n"); 1356c0b746e5SOllivier Robert (void) fprintf(fp, 1357c0b746e5SOllivier Robert "=====================================================================\n"); 1358c0b746e5SOllivier Robert while (items > 0) { 1359c0b746e5SOllivier Robert if ((rl->mask == (u_int32)0xffffffff)) 1360c0b746e5SOllivier Robert addr = nntohost(rl->addr); 1361c0b746e5SOllivier Robert else 1362c0b746e5SOllivier Robert addr = numtoa( rl->addr ); 1363c0b746e5SOllivier Robert mask = numtoa(rl->mask); 1364c0b746e5SOllivier Robert count = ntohl(rl->count); 1365c0b746e5SOllivier Robert flags = ntohs(rl->flags); 1366c0b746e5SOllivier Robert mflags = ntohs(rl->mflags); 1367c0b746e5SOllivier Robert flagstr[0] = '\0'; 1368c0b746e5SOllivier Robert 1369c0b746e5SOllivier Robert res = 1; 1370c0b746e5SOllivier Robert rf = &resmflags[0]; 1371c0b746e5SOllivier Robert while (rf->bit != 0) { 1372c0b746e5SOllivier Robert if (mflags & rf->bit) { 1373c0b746e5SOllivier Robert if (!res) 1374c0b746e5SOllivier Robert (void) strcat(flagstr, comma); 1375c0b746e5SOllivier Robert res = 0; 1376c0b746e5SOllivier Robert (void) strcat(flagstr, rf->str); 1377c0b746e5SOllivier Robert } 1378c0b746e5SOllivier Robert rf++; 1379c0b746e5SOllivier Robert } 1380c0b746e5SOllivier Robert 1381c0b746e5SOllivier Robert rf = &resflags[0]; 1382c0b746e5SOllivier Robert while (rf->bit != 0) { 1383c0b746e5SOllivier Robert if (flags & rf->bit) { 1384c0b746e5SOllivier Robert if (!res) 1385c0b746e5SOllivier Robert (void) strcat(flagstr, comma); 1386c0b746e5SOllivier Robert res = 0; 1387c0b746e5SOllivier Robert (void) strcat(flagstr, rf->str); 1388c0b746e5SOllivier Robert } 1389c0b746e5SOllivier Robert rf++; 1390c0b746e5SOllivier Robert } 1391c0b746e5SOllivier Robert 1392c0b746e5SOllivier Robert if (flagstr[0] == '\0') 1393c0b746e5SOllivier Robert (void) strcpy(flagstr, "none"); 1394c0b746e5SOllivier Robert 1395c0b746e5SOllivier Robert (void) fprintf(fp, "%-15.15s %-15.15s %9ld %s\n", 1396c0b746e5SOllivier Robert addr, mask, (u_long)count, flagstr); 1397c0b746e5SOllivier Robert rl++; 1398c0b746e5SOllivier Robert items--; 1399c0b746e5SOllivier Robert } 1400c0b746e5SOllivier Robert } 1401c0b746e5SOllivier Robert 1402c0b746e5SOllivier Robert 1403c0b746e5SOllivier Robert 1404c0b746e5SOllivier Robert /* 1405c0b746e5SOllivier Robert * new_restrict - create/add a set of restrictions 1406c0b746e5SOllivier Robert */ 1407c0b746e5SOllivier Robert static void 1408c0b746e5SOllivier Robert new_restrict( 1409c0b746e5SOllivier Robert struct parse *pcmd, 1410c0b746e5SOllivier Robert FILE *fp 1411c0b746e5SOllivier Robert ) 1412c0b746e5SOllivier Robert { 1413c0b746e5SOllivier Robert do_restrict(pcmd, fp, REQ_RESADDFLAGS); 1414c0b746e5SOllivier Robert } 1415c0b746e5SOllivier Robert 1416c0b746e5SOllivier Robert 1417c0b746e5SOllivier Robert /* 1418c0b746e5SOllivier Robert * unrestrict - remove restriction flags from existing entry 1419c0b746e5SOllivier Robert */ 1420c0b746e5SOllivier Robert static void 1421c0b746e5SOllivier Robert unrestrict( 1422c0b746e5SOllivier Robert struct parse *pcmd, 1423c0b746e5SOllivier Robert FILE *fp 1424c0b746e5SOllivier Robert ) 1425c0b746e5SOllivier Robert { 1426c0b746e5SOllivier Robert do_restrict(pcmd, fp, REQ_RESSUBFLAGS); 1427c0b746e5SOllivier Robert } 1428c0b746e5SOllivier Robert 1429c0b746e5SOllivier Robert 1430c0b746e5SOllivier Robert /* 1431c0b746e5SOllivier Robert * delrestrict - delete an existing restriction 1432c0b746e5SOllivier Robert */ 1433c0b746e5SOllivier Robert static void 1434c0b746e5SOllivier Robert delrestrict( 1435c0b746e5SOllivier Robert struct parse *pcmd, 1436c0b746e5SOllivier Robert FILE *fp 1437c0b746e5SOllivier Robert ) 1438c0b746e5SOllivier Robert { 1439c0b746e5SOllivier Robert do_restrict(pcmd, fp, REQ_UNRESTRICT); 1440c0b746e5SOllivier Robert } 1441c0b746e5SOllivier Robert 1442c0b746e5SOllivier Robert 1443c0b746e5SOllivier Robert /* 1444c0b746e5SOllivier Robert * do_restrict - decode commandline restrictions and make the request 1445c0b746e5SOllivier Robert */ 1446c0b746e5SOllivier Robert static void 1447c0b746e5SOllivier Robert do_restrict( 1448c0b746e5SOllivier Robert struct parse *pcmd, 1449c0b746e5SOllivier Robert FILE *fp, 1450c0b746e5SOllivier Robert int req_code 1451c0b746e5SOllivier Robert ) 1452c0b746e5SOllivier Robert { 1453c0b746e5SOllivier Robert struct conf_restrict cres; 1454c0b746e5SOllivier Robert int items; 1455c0b746e5SOllivier Robert int itemsize; 1456c0b746e5SOllivier Robert char *dummy; 1457c0b746e5SOllivier Robert u_int32 num; 1458c0b746e5SOllivier Robert u_long bit; 1459c0b746e5SOllivier Robert int i; 1460c0b746e5SOllivier Robert int res; 1461c0b746e5SOllivier Robert int err; 1462c0b746e5SOllivier Robert 1463c0b746e5SOllivier Robert cres.addr = pcmd->argval[0].netnum; 1464c0b746e5SOllivier Robert cres.mask = pcmd->argval[1].netnum; 1465c0b746e5SOllivier Robert cres.flags = 0; 1466c0b746e5SOllivier Robert cres.mflags = 0; 1467c0b746e5SOllivier Robert err = 0; 1468c0b746e5SOllivier Robert for (res = 2; res < pcmd->nargs; res++) { 1469c0b746e5SOllivier Robert if (STREQ(pcmd->argval[res].string, "ntpport")) { 1470c0b746e5SOllivier Robert cres.mflags |= RESM_NTPONLY; 1471c0b746e5SOllivier Robert } else { 1472c0b746e5SOllivier Robert for (i = 0; resflags[i].bit != 0; i++) { 1473c0b746e5SOllivier Robert if (STREQ(pcmd->argval[res].string, 1474c0b746e5SOllivier Robert resflags[i].str)) 1475c0b746e5SOllivier Robert break; 1476c0b746e5SOllivier Robert } 1477c0b746e5SOllivier Robert if (resflags[i].bit != 0) { 1478c0b746e5SOllivier Robert cres.flags |= resflags[i].bit; 1479c0b746e5SOllivier Robert if (req_code == REQ_UNRESTRICT) { 1480c0b746e5SOllivier Robert (void) fprintf(fp, 1481c0b746e5SOllivier Robert "Flag %s inappropriate\n", 1482c0b746e5SOllivier Robert resflags[i].str); 1483c0b746e5SOllivier Robert err++; 1484c0b746e5SOllivier Robert } 1485c0b746e5SOllivier Robert } else { 1486c0b746e5SOllivier Robert (void) fprintf(fp, "Unknown flag %s\n", 1487c0b746e5SOllivier Robert pcmd->argval[res].string); 1488c0b746e5SOllivier Robert err++; 1489c0b746e5SOllivier Robert } 1490c0b746e5SOllivier Robert } 1491c0b746e5SOllivier Robert } 1492c0b746e5SOllivier Robert 1493c0b746e5SOllivier Robert /* 1494c0b746e5SOllivier Robert * Make sure mask for default address is zero. Otherwise, 1495c0b746e5SOllivier Robert * make sure mask bits are contiguous. 1496c0b746e5SOllivier Robert */ 1497c0b746e5SOllivier Robert if (cres.addr == 0) { 1498c0b746e5SOllivier Robert cres.mask = 0; 1499c0b746e5SOllivier Robert } else { 1500c0b746e5SOllivier Robert num = ntohl(cres.mask); 1501c0b746e5SOllivier Robert for (bit = 0x80000000; bit != 0; bit >>= 1) 1502c0b746e5SOllivier Robert if ((num & bit) == 0) 1503c0b746e5SOllivier Robert break; 1504c0b746e5SOllivier Robert for ( ; bit != 0; bit >>= 1) 1505c0b746e5SOllivier Robert if ((num & bit) != 0) 1506c0b746e5SOllivier Robert break; 1507c0b746e5SOllivier Robert if (bit != 0) { 1508c0b746e5SOllivier Robert (void) fprintf(fp, "Invalid mask %s\n", 1509c0b746e5SOllivier Robert numtoa(cres.mask)); 1510c0b746e5SOllivier Robert err++; 1511c0b746e5SOllivier Robert } 1512c0b746e5SOllivier Robert } 1513c0b746e5SOllivier Robert 1514c0b746e5SOllivier Robert if (err) 1515c0b746e5SOllivier Robert return; 1516c0b746e5SOllivier Robert 1517c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, req_code, 1, 1, 1518c0b746e5SOllivier Robert sizeof(struct conf_restrict), (char *)&cres, &items, 1519c0b746e5SOllivier Robert &itemsize, &dummy, 0); 1520c0b746e5SOllivier Robert 1521c0b746e5SOllivier Robert if (res == 0) 1522c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1523c0b746e5SOllivier Robert return; 1524c0b746e5SOllivier Robert } 1525c0b746e5SOllivier Robert 1526c0b746e5SOllivier Robert 1527c0b746e5SOllivier Robert /* 1528c0b746e5SOllivier Robert * monlist - obtain and print the server's monitor data 1529c0b746e5SOllivier Robert */ 1530c0b746e5SOllivier Robert /*ARGSUSED*/ 1531c0b746e5SOllivier Robert static void 1532c0b746e5SOllivier Robert monlist( 1533c0b746e5SOllivier Robert struct parse *pcmd, 1534c0b746e5SOllivier Robert FILE *fp 1535c0b746e5SOllivier Robert ) 1536c0b746e5SOllivier Robert { 1537c0b746e5SOllivier Robert char *struct_star; 1538c0b746e5SOllivier Robert struct in_addr addr; 1539c0b746e5SOllivier Robert int items; 1540c0b746e5SOllivier Robert int itemsize; 1541c0b746e5SOllivier Robert int res; 1542c0b746e5SOllivier Robert int version = -1; 1543c0b746e5SOllivier Robert 1544c0b746e5SOllivier Robert if (pcmd->nargs > 0) { 1545c0b746e5SOllivier Robert version = pcmd->argval[0].ival; 1546c0b746e5SOllivier Robert } 1547c0b746e5SOllivier Robert 1548c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, 1549c0b746e5SOllivier Robert (version == 1 || version == -1) ? REQ_MON_GETLIST_1 : 1550c0b746e5SOllivier Robert REQ_MON_GETLIST, 0, 0, 0, (char *)NULL, 1551c0b746e5SOllivier Robert &items, &itemsize, &struct_star, 1552c0b746e5SOllivier Robert (version < 0) ? (1 << INFO_ERR_REQ) : 0); 1553c0b746e5SOllivier Robert 1554c0b746e5SOllivier Robert if (res == INFO_ERR_REQ && version < 0) 1555c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_MON_GETLIST, 0, 0, 0, (char *)NULL, 1556c0b746e5SOllivier Robert &items, &itemsize, &struct_star, 0); 1557c0b746e5SOllivier Robert 1558c0b746e5SOllivier Robert if (res != 0 && items == 0) 1559c0b746e5SOllivier Robert return; 1560c0b746e5SOllivier Robert 1561c0b746e5SOllivier Robert if (!checkitems(items, fp)) 1562c0b746e5SOllivier Robert return; 1563c0b746e5SOllivier Robert 1564c0b746e5SOllivier Robert if (itemsize == sizeof(struct info_monitor_1)) { 1565c0b746e5SOllivier Robert struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star; 1566c0b746e5SOllivier Robert 1567c0b746e5SOllivier Robert (void) fprintf(fp, 1568c0b746e5SOllivier Robert "remote address port local address count m ver drop last first\n"); 1569c0b746e5SOllivier Robert (void) fprintf(fp, 1570c0b746e5SOllivier Robert "===============================================================================\n"); 1571c0b746e5SOllivier Robert while (items > 0) { 1572c0b746e5SOllivier Robert addr.s_addr = ml->daddr; 1573c0b746e5SOllivier Robert (void) fprintf(fp, 1574c0b746e5SOllivier Robert "%-22.22s %5d %-15s %8ld %1d %1d %6lu %6lu %7lu\n", 1575c0b746e5SOllivier Robert nntohost(ml->addr), 1576c0b746e5SOllivier Robert ntohs(ml->port), 1577c0b746e5SOllivier Robert inet_ntoa(addr), 1578c0b746e5SOllivier Robert (u_long)ntohl(ml->count), 1579c0b746e5SOllivier Robert ml->mode, 1580c0b746e5SOllivier Robert ml->version, 1581c0b746e5SOllivier Robert (u_long)ntohl(ml->lastdrop), 1582c0b746e5SOllivier Robert (u_long)ntohl(ml->lasttime), 1583c0b746e5SOllivier Robert (u_long)ntohl(ml->firsttime)); 1584c0b746e5SOllivier Robert ml++; 1585c0b746e5SOllivier Robert items--; 1586c0b746e5SOllivier Robert } 1587c0b746e5SOllivier Robert } else if (itemsize == sizeof(struct info_monitor)) { 1588c0b746e5SOllivier Robert struct info_monitor *ml = (struct info_monitor *) struct_star; 1589c0b746e5SOllivier Robert 1590c0b746e5SOllivier Robert (void) fprintf(fp, 1591c0b746e5SOllivier Robert " address port count mode ver lastdrop lasttime firsttime\n"); 1592c0b746e5SOllivier Robert (void) fprintf(fp, 1593c0b746e5SOllivier Robert "===============================================================================\n"); 1594c0b746e5SOllivier Robert while (items > 0) { 1595c0b746e5SOllivier Robert addr.s_addr = ml->lastdrop; 1596c0b746e5SOllivier Robert (void) fprintf(fp, 1597c0b746e5SOllivier Robert "%-25.25s %5d %9ld %4d %2d %9lu %9lu %9lu\n", 1598c0b746e5SOllivier Robert nntohost(ml->addr), 1599c0b746e5SOllivier Robert ntohs(ml->port), 1600c0b746e5SOllivier Robert (u_long)ntohl(ml->count), 1601c0b746e5SOllivier Robert ml->mode, 1602c0b746e5SOllivier Robert ml->version, 1603c0b746e5SOllivier Robert (u_long)ntohl(ml->lastdrop), 1604c0b746e5SOllivier Robert (u_long)ntohl(ml->lasttime), 1605c0b746e5SOllivier Robert (u_long)ntohl(ml->firsttime)); 1606c0b746e5SOllivier Robert ml++; 1607c0b746e5SOllivier Robert items--; 1608c0b746e5SOllivier Robert } 1609c0b746e5SOllivier Robert } else if (itemsize == sizeof(struct old_info_monitor)) { 1610c0b746e5SOllivier Robert struct old_info_monitor *oml = (struct old_info_monitor *)struct_star; 1611c0b746e5SOllivier Robert (void) fprintf(fp, 1612c0b746e5SOllivier Robert " address port count mode version lasttime firsttime\n"); 1613c0b746e5SOllivier Robert (void) fprintf(fp, 1614c0b746e5SOllivier Robert "======================================================================\n"); 1615c0b746e5SOllivier Robert while (items > 0) { 1616c0b746e5SOllivier Robert (void) fprintf(fp, "%-20.20s %5d %9ld %4d %3d %9lu %9lu\n", 1617c0b746e5SOllivier Robert nntohost(oml->addr), 1618c0b746e5SOllivier Robert ntohs(oml->port), 1619c0b746e5SOllivier Robert (u_long)ntohl(oml->count), 1620c0b746e5SOllivier Robert oml->mode, 1621c0b746e5SOllivier Robert oml->version, 1622c0b746e5SOllivier Robert (u_long)ntohl(oml->lasttime), 1623c0b746e5SOllivier Robert (u_long)ntohl(oml->firsttime)); 1624c0b746e5SOllivier Robert oml++; 1625c0b746e5SOllivier Robert items--; 1626c0b746e5SOllivier Robert } 1627c0b746e5SOllivier Robert } else { 1628c0b746e5SOllivier Robert /* issue warning according to new info_monitor size */ 1629c0b746e5SOllivier Robert checkitemsize(itemsize, sizeof(struct info_monitor)); 1630c0b746e5SOllivier Robert } 1631c0b746e5SOllivier Robert } 1632c0b746e5SOllivier Robert 1633c0b746e5SOllivier Robert 1634c0b746e5SOllivier Robert /* 1635c0b746e5SOllivier Robert * Mapping between command line strings and stat reset flags 1636c0b746e5SOllivier Robert */ 1637c0b746e5SOllivier Robert struct statreset { 1638c0b746e5SOllivier Robert const char *str; 1639c0b746e5SOllivier Robert int flag; 1640c0b746e5SOllivier Robert } sreset[] = { 1641c0b746e5SOllivier Robert { "io", RESET_FLAG_IO }, 1642c0b746e5SOllivier Robert { "sys", RESET_FLAG_SYS }, 1643c0b746e5SOllivier Robert { "mem", RESET_FLAG_MEM }, 1644c0b746e5SOllivier Robert { "timer", RESET_FLAG_TIMER }, 1645c0b746e5SOllivier Robert { "auth", RESET_FLAG_AUTH }, 1646c0b746e5SOllivier Robert { "allpeers", RESET_FLAG_ALLPEERS }, 1647c0b746e5SOllivier Robert { "", 0 } 1648c0b746e5SOllivier Robert }; 1649c0b746e5SOllivier Robert 1650c0b746e5SOllivier Robert /* 1651c0b746e5SOllivier Robert * reset - reset statistic counters 1652c0b746e5SOllivier Robert */ 1653c0b746e5SOllivier Robert static void 1654c0b746e5SOllivier Robert reset( 1655c0b746e5SOllivier Robert struct parse *pcmd, 1656c0b746e5SOllivier Robert FILE *fp 1657c0b746e5SOllivier Robert ) 1658c0b746e5SOllivier Robert { 1659c0b746e5SOllivier Robert struct reset_flags rflags; 1660c0b746e5SOllivier Robert int items; 1661c0b746e5SOllivier Robert int itemsize; 1662c0b746e5SOllivier Robert char *dummy; 1663c0b746e5SOllivier Robert int i; 1664c0b746e5SOllivier Robert int res; 1665c0b746e5SOllivier Robert int err; 1666c0b746e5SOllivier Robert 1667c0b746e5SOllivier Robert err = 0; 1668c0b746e5SOllivier Robert rflags.flags = 0; 1669c0b746e5SOllivier Robert for (res = 0; res < pcmd->nargs; res++) { 1670c0b746e5SOllivier Robert for (i = 0; sreset[i].flag != 0; i++) { 1671c0b746e5SOllivier Robert if (STREQ(pcmd->argval[res].string, sreset[i].str)) 1672c0b746e5SOllivier Robert break; 1673c0b746e5SOllivier Robert } 1674c0b746e5SOllivier Robert if (sreset[i].flag == 0) { 1675c0b746e5SOllivier Robert (void) fprintf(fp, "Flag %s unknown\n", 1676c0b746e5SOllivier Robert pcmd->argval[res].string); 1677c0b746e5SOllivier Robert err++; 1678c0b746e5SOllivier Robert } else { 1679c0b746e5SOllivier Robert rflags.flags |= sreset[i].flag; 1680c0b746e5SOllivier Robert } 1681c0b746e5SOllivier Robert } 1682c0b746e5SOllivier Robert 1683c0b746e5SOllivier Robert if (err) { 1684c0b746e5SOllivier Robert (void) fprintf(fp, "Not done due to errors\n"); 1685c0b746e5SOllivier Robert return; 1686c0b746e5SOllivier Robert } 1687c0b746e5SOllivier Robert 1688c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_RESET_STATS, 1, 1, 1689c0b746e5SOllivier Robert sizeof(struct reset_flags), (char *)&rflags, &items, 1690c0b746e5SOllivier Robert &itemsize, &dummy, 0); 1691c0b746e5SOllivier Robert 1692c0b746e5SOllivier Robert if (res == 0) 1693c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1694c0b746e5SOllivier Robert return; 1695c0b746e5SOllivier Robert } 1696c0b746e5SOllivier Robert 1697c0b746e5SOllivier Robert 1698c0b746e5SOllivier Robert 1699c0b746e5SOllivier Robert /* 1700c0b746e5SOllivier Robert * preset - reset stat counters for particular peers 1701c0b746e5SOllivier Robert */ 1702c0b746e5SOllivier Robert static void 1703c0b746e5SOllivier Robert preset( 1704c0b746e5SOllivier Robert struct parse *pcmd, 1705c0b746e5SOllivier Robert FILE *fp 1706c0b746e5SOllivier Robert ) 1707c0b746e5SOllivier Robert { 1708c0b746e5SOllivier Robert /* 8 is the maximum number of peers which will fit in a packet */ 1709c0b746e5SOllivier Robert struct conf_unpeer plist[min(MAXARGS, 8)]; 1710c0b746e5SOllivier Robert int qitems; 1711c0b746e5SOllivier Robert int items; 1712c0b746e5SOllivier Robert int itemsize; 1713c0b746e5SOllivier Robert char *dummy; 1714c0b746e5SOllivier Robert int res; 1715c0b746e5SOllivier Robert 1716c0b746e5SOllivier Robert for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) { 1717c0b746e5SOllivier Robert plist[qitems].peeraddr = pcmd->argval[qitems].netnum; 1718c0b746e5SOllivier Robert } 1719c0b746e5SOllivier Robert 1720c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_RESET_PEER, 1, qitems, 1721c0b746e5SOllivier Robert sizeof(struct conf_unpeer), (char *)plist, &items, 1722c0b746e5SOllivier Robert &itemsize, &dummy, 0); 1723c0b746e5SOllivier Robert 1724c0b746e5SOllivier Robert if (res == 0) 1725c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1726c0b746e5SOllivier Robert } 1727c0b746e5SOllivier Robert 1728c0b746e5SOllivier Robert 1729c0b746e5SOllivier Robert /* 1730c0b746e5SOllivier Robert * readkeys - request the server to reread the keys file 1731c0b746e5SOllivier Robert */ 1732c0b746e5SOllivier Robert /*ARGSUSED*/ 1733c0b746e5SOllivier Robert static void 1734c0b746e5SOllivier Robert readkeys( 1735c0b746e5SOllivier Robert struct parse *pcmd, 1736c0b746e5SOllivier Robert FILE *fp 1737c0b746e5SOllivier Robert ) 1738c0b746e5SOllivier Robert { 1739c0b746e5SOllivier Robert int items; 1740c0b746e5SOllivier Robert int itemsize; 1741c0b746e5SOllivier Robert char *dummy; 1742c0b746e5SOllivier Robert int res; 1743c0b746e5SOllivier Robert 1744c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_REREAD_KEYS, 1, 0, 0, (char *)0, 1745c0b746e5SOllivier Robert &items, &itemsize, &dummy, 0); 1746c0b746e5SOllivier Robert 1747c0b746e5SOllivier Robert if (res == 0) 1748c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1749c0b746e5SOllivier Robert return; 1750c0b746e5SOllivier Robert } 1751c0b746e5SOllivier Robert 1752c0b746e5SOllivier Robert 1753c0b746e5SOllivier Robert /* 1754c0b746e5SOllivier Robert * trustkey - add some keys to the trusted key list 1755c0b746e5SOllivier Robert */ 1756c0b746e5SOllivier Robert static void 1757c0b746e5SOllivier Robert trustkey( 1758c0b746e5SOllivier Robert struct parse *pcmd, 1759c0b746e5SOllivier Robert FILE *fp 1760c0b746e5SOllivier Robert ) 1761c0b746e5SOllivier Robert { 1762c0b746e5SOllivier Robert do_trustkey(pcmd, fp, REQ_TRUSTKEY); 1763c0b746e5SOllivier Robert } 1764c0b746e5SOllivier Robert 1765c0b746e5SOllivier Robert 1766c0b746e5SOllivier Robert /* 1767c0b746e5SOllivier Robert * untrustkey - remove some keys from the trusted key list 1768c0b746e5SOllivier Robert */ 1769c0b746e5SOllivier Robert static void 1770c0b746e5SOllivier Robert untrustkey( 1771c0b746e5SOllivier Robert struct parse *pcmd, 1772c0b746e5SOllivier Robert FILE *fp 1773c0b746e5SOllivier Robert ) 1774c0b746e5SOllivier Robert { 1775c0b746e5SOllivier Robert do_trustkey(pcmd, fp, REQ_UNTRUSTKEY); 1776c0b746e5SOllivier Robert } 1777c0b746e5SOllivier Robert 1778c0b746e5SOllivier Robert 1779c0b746e5SOllivier Robert /* 1780c0b746e5SOllivier Robert * do_trustkey - do grunge work of adding/deleting keys 1781c0b746e5SOllivier Robert */ 1782c0b746e5SOllivier Robert static void 1783c0b746e5SOllivier Robert do_trustkey( 1784c0b746e5SOllivier Robert struct parse *pcmd, 1785c0b746e5SOllivier Robert FILE *fp, 1786c0b746e5SOllivier Robert int req 1787c0b746e5SOllivier Robert ) 1788c0b746e5SOllivier Robert { 1789c0b746e5SOllivier Robert u_long keyids[MAXARGS]; 1790c0b746e5SOllivier Robert int i; 1791c0b746e5SOllivier Robert int items; 1792c0b746e5SOllivier Robert int itemsize; 1793c0b746e5SOllivier Robert char *dummy; 1794c0b746e5SOllivier Robert int ritems; 1795c0b746e5SOllivier Robert int res; 1796c0b746e5SOllivier Robert 1797c0b746e5SOllivier Robert ritems = 0; 1798c0b746e5SOllivier Robert for (i = 0; i < pcmd->nargs; i++) { 1799c0b746e5SOllivier Robert keyids[ritems++] = pcmd->argval[i].uval; 1800c0b746e5SOllivier Robert } 1801c0b746e5SOllivier Robert 1802c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, req, 1, ritems, sizeof(u_long), 1803c0b746e5SOllivier Robert (char *)keyids, &items, &itemsize, &dummy, 0); 1804c0b746e5SOllivier Robert 1805c0b746e5SOllivier Robert if (res == 0) 1806c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1807c0b746e5SOllivier Robert return; 1808c0b746e5SOllivier Robert } 1809c0b746e5SOllivier Robert 1810c0b746e5SOllivier Robert 1811c0b746e5SOllivier Robert 1812c0b746e5SOllivier Robert /* 1813c0b746e5SOllivier Robert * authinfo - obtain and print info about authentication 1814c0b746e5SOllivier Robert */ 1815c0b746e5SOllivier Robert /*ARGSUSED*/ 1816c0b746e5SOllivier Robert static void 1817c0b746e5SOllivier Robert authinfo( 1818c0b746e5SOllivier Robert struct parse *pcmd, 1819c0b746e5SOllivier Robert FILE *fp 1820c0b746e5SOllivier Robert ) 1821c0b746e5SOllivier Robert { 1822c0b746e5SOllivier Robert struct info_auth *ia; 1823c0b746e5SOllivier Robert int items; 1824c0b746e5SOllivier Robert int itemsize; 1825c0b746e5SOllivier Robert int res; 1826c0b746e5SOllivier Robert 1827c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_AUTHINFO, 0, 0, 0, (char *)NULL, 1828c0b746e5SOllivier Robert &items, &itemsize, (char **)&ia, 0); 1829c0b746e5SOllivier Robert 1830c0b746e5SOllivier Robert if (res != 0 && items == 0) 1831c0b746e5SOllivier Robert return; 1832c0b746e5SOllivier Robert 1833c0b746e5SOllivier Robert if (!check1item(items, fp)) 1834c0b746e5SOllivier Robert return; 1835c0b746e5SOllivier Robert 1836c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_auth))) 1837c0b746e5SOllivier Robert return; 1838c0b746e5SOllivier Robert 1839c0b746e5SOllivier Robert (void) fprintf(fp, "time since reset: %ld\n", 1840c0b746e5SOllivier Robert (u_long)ntohl(ia->timereset)); 1841c0b746e5SOllivier Robert (void) fprintf(fp, "stored keys: %ld\n", 1842c0b746e5SOllivier Robert (u_long)ntohl(ia->numkeys)); 1843c0b746e5SOllivier Robert (void) fprintf(fp, "free keys: %ld\n", 1844c0b746e5SOllivier Robert (u_long)ntohl(ia->numfreekeys)); 1845c0b746e5SOllivier Robert (void) fprintf(fp, "key lookups: %ld\n", 1846c0b746e5SOllivier Robert (u_long)ntohl(ia->keylookups)); 1847c0b746e5SOllivier Robert (void) fprintf(fp, "keys not found: %ld\n", 1848c0b746e5SOllivier Robert (u_long)ntohl(ia->keynotfound)); 1849c0b746e5SOllivier Robert (void) fprintf(fp, "uncached keys: %ld\n", 1850c0b746e5SOllivier Robert (u_long)ntohl(ia->keyuncached)); 1851c0b746e5SOllivier Robert (void) fprintf(fp, "encryptions: %ld\n", 1852c0b746e5SOllivier Robert (u_long)ntohl(ia->encryptions)); 1853c0b746e5SOllivier Robert (void) fprintf(fp, "decryptions: %ld\n", 1854c0b746e5SOllivier Robert (u_long)ntohl(ia->decryptions)); 1855c0b746e5SOllivier Robert (void) fprintf(fp, "expired keys: %ld\n", 1856c0b746e5SOllivier Robert (u_long)ntohl(ia->expired)); 1857c0b746e5SOllivier Robert } 1858c0b746e5SOllivier Robert 1859c0b746e5SOllivier Robert 1860c0b746e5SOllivier Robert 1861c0b746e5SOllivier Robert /* 1862c0b746e5SOllivier Robert * traps - obtain and print a list of traps 1863c0b746e5SOllivier Robert */ 1864c0b746e5SOllivier Robert /*ARGSUSED*/ 1865c0b746e5SOllivier Robert static void 1866c0b746e5SOllivier Robert traps( 1867c0b746e5SOllivier Robert struct parse *pcmd, 1868c0b746e5SOllivier Robert FILE *fp 1869c0b746e5SOllivier Robert ) 1870c0b746e5SOllivier Robert { 1871c0b746e5SOllivier Robert int i; 1872c0b746e5SOllivier Robert struct info_trap *it; 1873c0b746e5SOllivier Robert int items; 1874c0b746e5SOllivier Robert int itemsize; 1875c0b746e5SOllivier Robert int res; 1876c0b746e5SOllivier Robert 1877c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_TRAPS, 0, 0, 0, (char *)NULL, 1878c0b746e5SOllivier Robert &items, &itemsize, (char **)&it, 0); 1879c0b746e5SOllivier Robert 1880c0b746e5SOllivier Robert if (res != 0 && items == 0) 1881c0b746e5SOllivier Robert return; 1882c0b746e5SOllivier Robert 1883c0b746e5SOllivier Robert if (!checkitems(items, fp)) 1884c0b746e5SOllivier Robert return; 1885c0b746e5SOllivier Robert 1886c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_trap))) 1887c0b746e5SOllivier Robert return; 1888c0b746e5SOllivier Robert 1889c0b746e5SOllivier Robert for (i = 0; i < items; i++ ) { 1890c0b746e5SOllivier Robert if (i != 0) 1891c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 1892c0b746e5SOllivier Robert (void) fprintf(fp, "address %s, port %d\n", 1893c0b746e5SOllivier Robert numtoa(it->trap_address), ntohs(it->trap_port)); 1894c0b746e5SOllivier Robert (void) fprintf(fp, "interface: %s, ", 1895c0b746e5SOllivier Robert (it->local_address == 0) 1896c0b746e5SOllivier Robert ? "wildcard" 1897c0b746e5SOllivier Robert : numtoa(it->local_address)); 1898c0b746e5SOllivier Robert 1899c0b746e5SOllivier Robert if (ntohl(it->flags) & TRAP_CONFIGURED) 1900c0b746e5SOllivier Robert (void) fprintf(fp, "configured\n"); 1901c0b746e5SOllivier Robert else if (ntohl(it->flags) & TRAP_NONPRIO) 1902c0b746e5SOllivier Robert (void) fprintf(fp, "low priority\n"); 1903c0b746e5SOllivier Robert else 1904c0b746e5SOllivier Robert (void) fprintf(fp, "normal priority\n"); 1905c0b746e5SOllivier Robert 1906c0b746e5SOllivier Robert (void) fprintf(fp, "set for %ld secs, last set %ld secs ago\n", 1907c0b746e5SOllivier Robert (long)ntohl(it->origtime), 1908c0b746e5SOllivier Robert (long)ntohl(it->settime)); 1909c0b746e5SOllivier Robert (void) fprintf(fp, "sequence %d, number of resets %ld\n", 1910c0b746e5SOllivier Robert ntohs(it->sequence), 1911c0b746e5SOllivier Robert (long)ntohl(it->resets)); 1912c0b746e5SOllivier Robert } 1913c0b746e5SOllivier Robert } 1914c0b746e5SOllivier Robert 1915c0b746e5SOllivier Robert 1916c0b746e5SOllivier Robert /* 1917c0b746e5SOllivier Robert * addtrap - configure a trap 1918c0b746e5SOllivier Robert */ 1919c0b746e5SOllivier Robert static void 1920c0b746e5SOllivier Robert addtrap( 1921c0b746e5SOllivier Robert struct parse *pcmd, 1922c0b746e5SOllivier Robert FILE *fp 1923c0b746e5SOllivier Robert ) 1924c0b746e5SOllivier Robert { 1925c0b746e5SOllivier Robert do_addclr_trap(pcmd, fp, REQ_ADD_TRAP); 1926c0b746e5SOllivier Robert } 1927c0b746e5SOllivier Robert 1928c0b746e5SOllivier Robert 1929c0b746e5SOllivier Robert /* 1930c0b746e5SOllivier Robert * clrtrap - clear a trap from the server 1931c0b746e5SOllivier Robert */ 1932c0b746e5SOllivier Robert static void 1933c0b746e5SOllivier Robert clrtrap( 1934c0b746e5SOllivier Robert struct parse *pcmd, 1935c0b746e5SOllivier Robert FILE *fp 1936c0b746e5SOllivier Robert ) 1937c0b746e5SOllivier Robert { 1938c0b746e5SOllivier Robert do_addclr_trap(pcmd, fp, REQ_CLR_TRAP); 1939c0b746e5SOllivier Robert } 1940c0b746e5SOllivier Robert 1941c0b746e5SOllivier Robert 1942c0b746e5SOllivier Robert /* 1943c0b746e5SOllivier Robert * do_addclr_trap - do grunge work of adding/deleting traps 1944c0b746e5SOllivier Robert */ 1945c0b746e5SOllivier Robert static void 1946c0b746e5SOllivier Robert do_addclr_trap( 1947c0b746e5SOllivier Robert struct parse *pcmd, 1948c0b746e5SOllivier Robert FILE *fp, 1949c0b746e5SOllivier Robert int req 1950c0b746e5SOllivier Robert ) 1951c0b746e5SOllivier Robert { 1952c0b746e5SOllivier Robert struct conf_trap ctrap; 1953c0b746e5SOllivier Robert int items; 1954c0b746e5SOllivier Robert int itemsize; 1955c0b746e5SOllivier Robert char *dummy; 1956c0b746e5SOllivier Robert int res; 1957c0b746e5SOllivier Robert 1958c0b746e5SOllivier Robert ctrap.trap_address = pcmd->argval[0].netnum; 1959c0b746e5SOllivier Robert ctrap.local_address = 0; 1960c0b746e5SOllivier Robert ctrap.trap_port = htons(TRAPPORT); 1961c0b746e5SOllivier Robert ctrap.unused = 0; 1962c0b746e5SOllivier Robert 1963c0b746e5SOllivier Robert if (pcmd->nargs > 1) { 1964c0b746e5SOllivier Robert ctrap.trap_port 1965c0b746e5SOllivier Robert = htons((u_short)(pcmd->argval[1].uval & 0xffff)); 1966c0b746e5SOllivier Robert if (pcmd->nargs > 2) 1967c0b746e5SOllivier Robert ctrap.local_address = pcmd->argval[2].netnum; 1968c0b746e5SOllivier Robert } 1969c0b746e5SOllivier Robert 1970c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, req, 1, 1, sizeof(struct conf_trap), 1971c0b746e5SOllivier Robert (char *)&ctrap, &items, &itemsize, &dummy, 0); 1972c0b746e5SOllivier Robert 1973c0b746e5SOllivier Robert if (res == 0) 1974c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 1975c0b746e5SOllivier Robert return; 1976c0b746e5SOllivier Robert } 1977c0b746e5SOllivier Robert 1978c0b746e5SOllivier Robert 1979c0b746e5SOllivier Robert 1980c0b746e5SOllivier Robert /* 1981c0b746e5SOllivier Robert * requestkey - change the server's request key (a dangerous request) 1982c0b746e5SOllivier Robert */ 1983c0b746e5SOllivier Robert static void 1984c0b746e5SOllivier Robert requestkey( 1985c0b746e5SOllivier Robert struct parse *pcmd, 1986c0b746e5SOllivier Robert FILE *fp 1987c0b746e5SOllivier Robert ) 1988c0b746e5SOllivier Robert { 1989c0b746e5SOllivier Robert do_changekey(pcmd, fp, REQ_REQUEST_KEY); 1990c0b746e5SOllivier Robert } 1991c0b746e5SOllivier Robert 1992c0b746e5SOllivier Robert 1993c0b746e5SOllivier Robert /* 1994c0b746e5SOllivier Robert * controlkey - change the server's control key 1995c0b746e5SOllivier Robert */ 1996c0b746e5SOllivier Robert static void 1997c0b746e5SOllivier Robert controlkey( 1998c0b746e5SOllivier Robert struct parse *pcmd, 1999c0b746e5SOllivier Robert FILE *fp 2000c0b746e5SOllivier Robert ) 2001c0b746e5SOllivier Robert { 2002c0b746e5SOllivier Robert do_changekey(pcmd, fp, REQ_CONTROL_KEY); 2003c0b746e5SOllivier Robert } 2004c0b746e5SOllivier Robert 2005c0b746e5SOllivier Robert 2006c0b746e5SOllivier Robert 2007c0b746e5SOllivier Robert /* 2008c0b746e5SOllivier Robert * do_changekey - do grunge work of changing keys 2009c0b746e5SOllivier Robert */ 2010c0b746e5SOllivier Robert static void 2011c0b746e5SOllivier Robert do_changekey( 2012c0b746e5SOllivier Robert struct parse *pcmd, 2013c0b746e5SOllivier Robert FILE *fp, 2014c0b746e5SOllivier Robert int req 2015c0b746e5SOllivier Robert ) 2016c0b746e5SOllivier Robert { 2017c0b746e5SOllivier Robert u_long key; 2018c0b746e5SOllivier Robert int items; 2019c0b746e5SOllivier Robert int itemsize; 2020c0b746e5SOllivier Robert char *dummy; 2021c0b746e5SOllivier Robert int res; 2022c0b746e5SOllivier Robert 2023c0b746e5SOllivier Robert 2024c0b746e5SOllivier Robert key = htonl((u_int32)pcmd->argval[0].uval); 2025c0b746e5SOllivier Robert 2026c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, req, 1, 1, sizeof(u_int32), 2027c0b746e5SOllivier Robert (char *)&key, &items, &itemsize, &dummy, 0); 2028c0b746e5SOllivier Robert 2029c0b746e5SOllivier Robert if (res == 0) 2030c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 2031c0b746e5SOllivier Robert return; 2032c0b746e5SOllivier Robert } 2033c0b746e5SOllivier Robert 2034c0b746e5SOllivier Robert 2035c0b746e5SOllivier Robert 2036c0b746e5SOllivier Robert /* 2037c0b746e5SOllivier Robert * ctlstats - obtain and print info about authentication 2038c0b746e5SOllivier Robert */ 2039c0b746e5SOllivier Robert /*ARGSUSED*/ 2040c0b746e5SOllivier Robert static void 2041c0b746e5SOllivier Robert ctlstats( 2042c0b746e5SOllivier Robert struct parse *pcmd, 2043c0b746e5SOllivier Robert FILE *fp 2044c0b746e5SOllivier Robert ) 2045c0b746e5SOllivier Robert { 2046c0b746e5SOllivier Robert struct info_control *ic; 2047c0b746e5SOllivier Robert int items; 2048c0b746e5SOllivier Robert int itemsize; 2049c0b746e5SOllivier Robert int res; 2050c0b746e5SOllivier Robert 2051c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_GET_CTLSTATS, 0, 0, 0, (char *)NULL, 2052c0b746e5SOllivier Robert &items, &itemsize, (char **)&ic, 0); 2053c0b746e5SOllivier Robert 2054c0b746e5SOllivier Robert if (res != 0 && items == 0) 2055c0b746e5SOllivier Robert return; 2056c0b746e5SOllivier Robert 2057c0b746e5SOllivier Robert if (!check1item(items, fp)) 2058c0b746e5SOllivier Robert return; 2059c0b746e5SOllivier Robert 2060c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_control))) 2061c0b746e5SOllivier Robert return; 2062c0b746e5SOllivier Robert 2063c0b746e5SOllivier Robert (void) fprintf(fp, "time since reset: %ld\n", 2064c0b746e5SOllivier Robert (u_long)ntohl(ic->ctltimereset)); 2065c0b746e5SOllivier Robert (void) fprintf(fp, "requests received: %ld\n", 2066c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlreq)); 2067c0b746e5SOllivier Robert (void) fprintf(fp, "responses sent: %ld\n", 2068c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlresponses)); 2069c0b746e5SOllivier Robert (void) fprintf(fp, "fragments sent: %ld\n", 2070c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlfrags)); 2071c0b746e5SOllivier Robert (void) fprintf(fp, "async messages sent: %ld\n", 2072c0b746e5SOllivier Robert (u_long)ntohl(ic->numasyncmsgs)); 2073c0b746e5SOllivier Robert (void) fprintf(fp, "error msgs sent: %ld\n", 2074c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlerrors)); 2075c0b746e5SOllivier Robert (void) fprintf(fp, "total bad pkts: %ld\n", 2076c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlbadpkts)); 2077c0b746e5SOllivier Robert (void) fprintf(fp, "packet too short: %ld\n", 2078c0b746e5SOllivier Robert (u_long)ntohl(ic->numctltooshort)); 2079c0b746e5SOllivier Robert (void) fprintf(fp, "response on input: %ld\n", 2080c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlinputresp)); 2081c0b746e5SOllivier Robert (void) fprintf(fp, "fragment on input: %ld\n", 2082c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlinputfrag)); 2083c0b746e5SOllivier Robert (void) fprintf(fp, "error set on input: %ld\n", 2084c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlinputerr)); 2085c0b746e5SOllivier Robert (void) fprintf(fp, "bad offset on input: %ld\n", 2086c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlbadoffset)); 2087c0b746e5SOllivier Robert (void) fprintf(fp, "bad version packets: %ld\n", 2088c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlbadversion)); 2089c0b746e5SOllivier Robert (void) fprintf(fp, "data in pkt too short: %ld\n", 2090c0b746e5SOllivier Robert (u_long)ntohl(ic->numctldatatooshort)); 2091c0b746e5SOllivier Robert (void) fprintf(fp, "unknown op codes: %ld\n", 2092c0b746e5SOllivier Robert (u_long)ntohl(ic->numctlbadop)); 2093c0b746e5SOllivier Robert } 2094c0b746e5SOllivier Robert 2095c0b746e5SOllivier Robert 2096c0b746e5SOllivier Robert /* 2097c0b746e5SOllivier Robert * clockstat - get and print clock status information 2098c0b746e5SOllivier Robert */ 2099c0b746e5SOllivier Robert static void 2100c0b746e5SOllivier Robert clockstat( 2101c0b746e5SOllivier Robert struct parse *pcmd, 2102c0b746e5SOllivier Robert FILE *fp 2103c0b746e5SOllivier Robert ) 2104c0b746e5SOllivier Robert { 2105c0b746e5SOllivier Robert struct info_clock *cl; 2106c0b746e5SOllivier Robert /* 8 is the maximum number of clocks which will fit in a packet */ 2107c0b746e5SOllivier Robert u_long clist[min(MAXARGS, 8)]; 2108c0b746e5SOllivier Robert int qitems; 2109c0b746e5SOllivier Robert int items; 2110c0b746e5SOllivier Robert int itemsize; 2111c0b746e5SOllivier Robert int res; 2112c0b746e5SOllivier Robert l_fp ts; 2113c0b746e5SOllivier Robert struct clktype *clk; 2114c0b746e5SOllivier Robert u_long ltemp; 2115c0b746e5SOllivier Robert 2116c0b746e5SOllivier Robert for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) 2117c0b746e5SOllivier Robert clist[qitems] = pcmd->argval[qitems].netnum; 2118c0b746e5SOllivier Robert 2119c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_GET_CLOCKINFO, 0, qitems, 2120c0b746e5SOllivier Robert sizeof(u_int32), (char *)clist, &items, 2121c0b746e5SOllivier Robert &itemsize, (char **)&cl, 0); 2122c0b746e5SOllivier Robert 2123c0b746e5SOllivier Robert if (res != 0 && items == 0) 2124c0b746e5SOllivier Robert return; 2125c0b746e5SOllivier Robert 2126c0b746e5SOllivier Robert if (!checkitems(items, fp)) 2127c0b746e5SOllivier Robert return; 2128c0b746e5SOllivier Robert 2129c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_clock))) 2130c0b746e5SOllivier Robert return; 2131c0b746e5SOllivier Robert 2132c0b746e5SOllivier Robert while (items-- > 0) { 2133c0b746e5SOllivier Robert (void) fprintf(fp, "clock address: %s\n", 2134c0b746e5SOllivier Robert numtoa(cl->clockadr)); 2135c0b746e5SOllivier Robert for (clk = clktypes; clk->code >= 0; clk++) 2136c0b746e5SOllivier Robert if (clk->code == cl->type) 2137c0b746e5SOllivier Robert break; 2138c0b746e5SOllivier Robert if (clk->code >= 0) 2139c0b746e5SOllivier Robert (void) fprintf(fp, "clock type: %s\n", 2140c0b746e5SOllivier Robert clk->clocktype); 2141c0b746e5SOllivier Robert else 2142c0b746e5SOllivier Robert (void) fprintf(fp, "clock type: unknown type (%d)\n", 2143c0b746e5SOllivier Robert cl->type); 2144c0b746e5SOllivier Robert (void) fprintf(fp, "last event: %d\n", 2145c0b746e5SOllivier Robert cl->lastevent); 2146c0b746e5SOllivier Robert (void) fprintf(fp, "current status: %d\n", 2147c0b746e5SOllivier Robert cl->currentstatus); 2148c0b746e5SOllivier Robert (void) fprintf(fp, "number of polls: %lu\n", 2149c0b746e5SOllivier Robert (u_long)ntohl(cl->polls)); 2150c0b746e5SOllivier Robert (void) fprintf(fp, "no response to poll: %lu\n", 2151c0b746e5SOllivier Robert (u_long)ntohl(cl->noresponse)); 2152c0b746e5SOllivier Robert (void) fprintf(fp, "bad format responses: %lu\n", 2153c0b746e5SOllivier Robert (u_long)ntohl(cl->badformat)); 2154c0b746e5SOllivier Robert (void) fprintf(fp, "bad data responses: %lu\n", 2155c0b746e5SOllivier Robert (u_long)ntohl(cl->baddata)); 2156c0b746e5SOllivier Robert (void) fprintf(fp, "running time: %lu\n", 2157c0b746e5SOllivier Robert (u_long)ntohl(cl->timestarted)); 2158c0b746e5SOllivier Robert NTOHL_FP(&cl->fudgetime1, &ts); 2159c0b746e5SOllivier Robert (void) fprintf(fp, "fudge time 1: %s\n", 2160c0b746e5SOllivier Robert lfptoa(&ts, 6)); 2161c0b746e5SOllivier Robert NTOHL_FP(&cl->fudgetime2, &ts); 2162c0b746e5SOllivier Robert (void) fprintf(fp, "fudge time 2: %s\n", 2163c0b746e5SOllivier Robert lfptoa(&ts, 6)); 2164c0b746e5SOllivier Robert (void) fprintf(fp, "stratum: %ld\n", 2165c0b746e5SOllivier Robert (u_long)ntohl(cl->fudgeval1)); 2166c0b746e5SOllivier Robert ltemp = ntohl(cl->fudgeval2); 2167c0b746e5SOllivier Robert (void) fprintf(fp, "reference ID: %s\n", 2168c0b746e5SOllivier Robert (char *)<emp); 2169c0b746e5SOllivier Robert (void) fprintf(fp, "fudge flags: 0x%x\n", 2170c0b746e5SOllivier Robert cl->flags); 2171c0b746e5SOllivier Robert 2172c0b746e5SOllivier Robert if (items > 0) 2173c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 2174c0b746e5SOllivier Robert cl++; 2175c0b746e5SOllivier Robert } 2176c0b746e5SOllivier Robert } 2177c0b746e5SOllivier Robert 2178c0b746e5SOllivier Robert 2179c0b746e5SOllivier Robert /* 2180c0b746e5SOllivier Robert * fudge - set clock fudge factors 2181c0b746e5SOllivier Robert */ 2182c0b746e5SOllivier Robert static void 2183c0b746e5SOllivier Robert fudge( 2184c0b746e5SOllivier Robert struct parse *pcmd, 2185c0b746e5SOllivier Robert FILE *fp 2186c0b746e5SOllivier Robert ) 2187c0b746e5SOllivier Robert { 2188c0b746e5SOllivier Robert struct conf_fudge fudgedata; 2189c0b746e5SOllivier Robert int items; 2190c0b746e5SOllivier Robert int itemsize; 2191c0b746e5SOllivier Robert char *dummy; 2192c0b746e5SOllivier Robert l_fp ts; 2193c0b746e5SOllivier Robert int res; 2194c0b746e5SOllivier Robert long val; 2195c0b746e5SOllivier Robert u_long u_val; 2196c0b746e5SOllivier Robert int err; 2197c0b746e5SOllivier Robert 2198c0b746e5SOllivier Robert 2199c0b746e5SOllivier Robert err = 0; 2200c0b746e5SOllivier Robert memset((char *)&fudgedata, 0, sizeof fudgedata); 2201c0b746e5SOllivier Robert fudgedata.clockadr = pcmd->argval[0].netnum; 2202c0b746e5SOllivier Robert 2203c0b746e5SOllivier Robert if (STREQ(pcmd->argval[1].string, "time1")) { 2204c0b746e5SOllivier Robert fudgedata.which = htonl(FUDGE_TIME1); 2205c0b746e5SOllivier Robert if (!atolfp(pcmd->argval[2].string, &ts)) 2206c0b746e5SOllivier Robert err = 1; 2207c0b746e5SOllivier Robert else 2208c0b746e5SOllivier Robert NTOHL_FP(&ts, &fudgedata.fudgetime); 2209c0b746e5SOllivier Robert } else if (STREQ(pcmd->argval[1].string, "time2")) { 2210c0b746e5SOllivier Robert fudgedata.which = htonl(FUDGE_TIME2); 2211c0b746e5SOllivier Robert if (!atolfp(pcmd->argval[2].string, &ts)) 2212c0b746e5SOllivier Robert err = 1; 2213c0b746e5SOllivier Robert else 2214c0b746e5SOllivier Robert NTOHL_FP(&ts, &fudgedata.fudgetime); 2215c0b746e5SOllivier Robert } else if (STREQ(pcmd->argval[1].string, "val1")) { 2216c0b746e5SOllivier Robert fudgedata.which = htonl(FUDGE_VAL1); 2217c0b746e5SOllivier Robert if (!atoint(pcmd->argval[2].string, &val)) 2218c0b746e5SOllivier Robert err = 1; 2219c0b746e5SOllivier Robert else 2220c0b746e5SOllivier Robert fudgedata.fudgeval_flags = htonl(val); 2221c0b746e5SOllivier Robert } else if (STREQ(pcmd->argval[1].string, "val2")) { 2222c0b746e5SOllivier Robert fudgedata.which = htonl(FUDGE_VAL2); 2223c0b746e5SOllivier Robert if (!atoint(pcmd->argval[2].string, &val)) 2224c0b746e5SOllivier Robert err = 1; 2225c0b746e5SOllivier Robert else 2226c0b746e5SOllivier Robert fudgedata.fudgeval_flags = htonl((u_int32)val); 2227c0b746e5SOllivier Robert } else if (STREQ(pcmd->argval[1].string, "flags")) { 2228c0b746e5SOllivier Robert fudgedata.which = htonl(FUDGE_FLAGS); 2229c0b746e5SOllivier Robert if (!hextoint(pcmd->argval[2].string, &u_val)) 2230c0b746e5SOllivier Robert err = 1; 2231c0b746e5SOllivier Robert else 2232c0b746e5SOllivier Robert fudgedata.fudgeval_flags = htonl((u_int32)(u_val & 0xf)); 2233c0b746e5SOllivier Robert } else { 2234c0b746e5SOllivier Robert (void) fprintf(stderr, "What fudge is %s?\n", 2235c0b746e5SOllivier Robert pcmd->argval[1].string); 2236c0b746e5SOllivier Robert return; 2237c0b746e5SOllivier Robert } 2238c0b746e5SOllivier Robert 2239c0b746e5SOllivier Robert if (err) { 2240c0b746e5SOllivier Robert (void) fprintf(stderr, "Unknown fudge parameter %s\n", 2241c0b746e5SOllivier Robert pcmd->argval[2].string); 2242c0b746e5SOllivier Robert return; 2243c0b746e5SOllivier Robert } 2244c0b746e5SOllivier Robert 2245c0b746e5SOllivier Robert 2246c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_SET_CLKFUDGE, 1, 1, 2247c0b746e5SOllivier Robert sizeof(struct conf_fudge), (char *)&fudgedata, &items, 2248c0b746e5SOllivier Robert &itemsize, &dummy, 0); 2249c0b746e5SOllivier Robert 2250c0b746e5SOllivier Robert if (res == 0) 2251c0b746e5SOllivier Robert (void) fprintf(fp, "done!\n"); 2252c0b746e5SOllivier Robert return; 2253c0b746e5SOllivier Robert } 2254c0b746e5SOllivier Robert 2255c0b746e5SOllivier Robert /* 2256c0b746e5SOllivier Robert * clkbug - get and print clock debugging information 2257c0b746e5SOllivier Robert */ 2258c0b746e5SOllivier Robert static void 2259c0b746e5SOllivier Robert clkbug( 2260c0b746e5SOllivier Robert struct parse *pcmd, 2261c0b746e5SOllivier Robert FILE *fp 2262c0b746e5SOllivier Robert ) 2263c0b746e5SOllivier Robert { 2264c0b746e5SOllivier Robert register int i; 2265c0b746e5SOllivier Robert register int n; 2266c0b746e5SOllivier Robert register u_int32 s; 2267c0b746e5SOllivier Robert struct info_clkbug *cl; 2268c0b746e5SOllivier Robert /* 8 is the maximum number of clocks which will fit in a packet */ 2269c0b746e5SOllivier Robert u_long clist[min(MAXARGS, 8)]; 2270c0b746e5SOllivier Robert u_int32 ltemp; 2271c0b746e5SOllivier Robert int qitems; 2272c0b746e5SOllivier Robert int items; 2273c0b746e5SOllivier Robert int itemsize; 2274c0b746e5SOllivier Robert int res; 2275c0b746e5SOllivier Robert int needsp; 2276c0b746e5SOllivier Robert l_fp ts; 2277c0b746e5SOllivier Robert 2278c0b746e5SOllivier Robert for (qitems = 0; qitems < min(pcmd->nargs, 8); qitems++) 2279c0b746e5SOllivier Robert clist[qitems] = pcmd->argval[qitems].netnum; 2280c0b746e5SOllivier Robert 2281c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_GET_CLKBUGINFO, 0, qitems, 2282c0b746e5SOllivier Robert sizeof(u_int32), (char *)clist, &items, 2283c0b746e5SOllivier Robert &itemsize, (char **)&cl, 0); 2284c0b746e5SOllivier Robert 2285c0b746e5SOllivier Robert if (res != 0 && items == 0) 2286c0b746e5SOllivier Robert return; 2287c0b746e5SOllivier Robert 2288c0b746e5SOllivier Robert if (!checkitems(items, fp)) 2289c0b746e5SOllivier Robert return; 2290c0b746e5SOllivier Robert 2291c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_clkbug))) 2292c0b746e5SOllivier Robert return; 2293c0b746e5SOllivier Robert 2294c0b746e5SOllivier Robert while (items-- > 0) { 2295c0b746e5SOllivier Robert (void) fprintf(fp, "clock address: %s\n", 2296c0b746e5SOllivier Robert numtoa(cl->clockadr)); 2297c0b746e5SOllivier Robert n = (int)cl->nvalues; 2298c0b746e5SOllivier Robert (void) fprintf(fp, "values: %d", n); 2299c0b746e5SOllivier Robert s = ntohs(cl->svalues); 2300c0b746e5SOllivier Robert if (n > NUMCBUGVALUES) 2301c0b746e5SOllivier Robert n = NUMCBUGVALUES; 2302c0b746e5SOllivier Robert for (i = 0; i < n; i++) { 2303c0b746e5SOllivier Robert ltemp = ntohl(cl->values[i]); 2304c0b746e5SOllivier Robert ltemp &= 0xffffffff; /* HMS: This does nothing now */ 2305c0b746e5SOllivier Robert if ((i & 0x3) == 0) 2306c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 2307c0b746e5SOllivier Robert if (s & (1 << i)) 2308c0b746e5SOllivier Robert (void) fprintf(fp, "%12ld", (u_long)ltemp); 2309c0b746e5SOllivier Robert else 2310c0b746e5SOllivier Robert (void) fprintf(fp, "%12lu", (u_long)ltemp); 2311c0b746e5SOllivier Robert } 2312c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 2313c0b746e5SOllivier Robert 2314c0b746e5SOllivier Robert n = (int)cl->ntimes; 2315c0b746e5SOllivier Robert (void) fprintf(fp, "times: %d", n); 2316c0b746e5SOllivier Robert s = ntohl(cl->stimes); 2317c0b746e5SOllivier Robert if (n > NUMCBUGTIMES) 2318c0b746e5SOllivier Robert n = NUMCBUGTIMES; 2319c0b746e5SOllivier Robert needsp = 0; 2320c0b746e5SOllivier Robert for (i = 0; i < n; i++) { 2321c0b746e5SOllivier Robert if ((i & 0x1) == 0) { 2322c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 2323c0b746e5SOllivier Robert } else { 2324c0b746e5SOllivier Robert for (;needsp > 0; needsp--) 2325c0b746e5SOllivier Robert putc(' ', fp); 2326c0b746e5SOllivier Robert } 2327c0b746e5SOllivier Robert NTOHL_FP(&cl->times[i], &ts); 2328c0b746e5SOllivier Robert if (s & (1 << i)) { 2329c0b746e5SOllivier Robert (void) fprintf(fp, "%17s", 2330c0b746e5SOllivier Robert lfptoa(&ts, 6)); 2331c0b746e5SOllivier Robert needsp = 22; 2332c0b746e5SOllivier Robert } else { 2333c0b746e5SOllivier Robert (void) fprintf(fp, "%37s", 2334c0b746e5SOllivier Robert uglydate(&ts)); 2335c0b746e5SOllivier Robert needsp = 2; 2336c0b746e5SOllivier Robert } 2337c0b746e5SOllivier Robert } 2338c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 2339c0b746e5SOllivier Robert if (items > 0) { 2340c0b746e5SOllivier Robert cl++; 2341c0b746e5SOllivier Robert (void) fprintf(fp, "\n"); 2342c0b746e5SOllivier Robert } 2343c0b746e5SOllivier Robert } 2344c0b746e5SOllivier Robert } 2345c0b746e5SOllivier Robert 2346c0b746e5SOllivier Robert 2347c0b746e5SOllivier Robert /* 2348c0b746e5SOllivier Robert * kerninfo - display the kernel pll/pps variables 2349c0b746e5SOllivier Robert */ 2350c0b746e5SOllivier Robert static void 2351c0b746e5SOllivier Robert kerninfo( 2352c0b746e5SOllivier Robert struct parse *pcmd, 2353c0b746e5SOllivier Robert FILE *fp 2354c0b746e5SOllivier Robert ) 2355c0b746e5SOllivier Robert { 2356c0b746e5SOllivier Robert struct info_kernel *ik; 2357c0b746e5SOllivier Robert int items; 2358c0b746e5SOllivier Robert int itemsize; 2359c0b746e5SOllivier Robert int res; 2360c0b746e5SOllivier Robert unsigned status; 2361c0b746e5SOllivier Robert double tscale = 1e-6; 2362c0b746e5SOllivier Robert 2363c0b746e5SOllivier Robert res = doquery(IMPL_XNTPD, REQ_GET_KERNEL, 0, 0, 0, (char *)NULL, 2364c0b746e5SOllivier Robert &items, &itemsize, (char **)&ik, 0); 2365c0b746e5SOllivier Robert if (res != 0 && items == 0) 2366c0b746e5SOllivier Robert return; 2367c0b746e5SOllivier Robert if (!check1item(items, fp)) 2368c0b746e5SOllivier Robert return; 2369c0b746e5SOllivier Robert if (!checkitemsize(itemsize, sizeof(struct info_kernel))) 2370c0b746e5SOllivier Robert return; 2371c0b746e5SOllivier Robert 2372c0b746e5SOllivier Robert status = ntohs(ik->status) & 0xffff; 2373c0b746e5SOllivier Robert /* 2374c0b746e5SOllivier Robert * pll variables. We know more than we should about the NANO bit. 2375c0b746e5SOllivier Robert */ 2376c0b746e5SOllivier Robert #ifdef STA_NANO 2377c0b746e5SOllivier Robert if (status & STA_NANO) 2378c0b746e5SOllivier Robert tscale = 1e-9; 2379c0b746e5SOllivier Robert #endif 2380c0b746e5SOllivier Robert (void)fprintf(fp, "pll offset: %g s\n", 2381c0b746e5SOllivier Robert (long)ntohl(ik->offset) * tscale); 2382c0b746e5SOllivier Robert (void)fprintf(fp, "pll frequency: %s ppm\n", 2383c0b746e5SOllivier Robert fptoa((s_fp)ntohl(ik->freq), 3)); 2384c0b746e5SOllivier Robert (void)fprintf(fp, "maximum error: %g s\n", 2385c0b746e5SOllivier Robert (u_long)ntohl(ik->maxerror) * 1e-6); 2386c0b746e5SOllivier Robert (void)fprintf(fp, "estimated error: %g s\n", 2387c0b746e5SOllivier Robert (u_long)ntohl(ik->esterror) * 1e-6); 2388c0b746e5SOllivier Robert (void)fprintf(fp, "status: %04x ", status); 2389c0b746e5SOllivier Robert #ifdef STA_PLL 2390c0b746e5SOllivier Robert if (status & STA_PLL) (void)fprintf(fp, " pll"); 2391c0b746e5SOllivier Robert #endif 2392c0b746e5SOllivier Robert #ifdef STA_PPSFREQ 2393c0b746e5SOllivier Robert if (status & STA_PPSFREQ) (void)fprintf(fp, " ppsfreq"); 2394c0b746e5SOllivier Robert #endif 2395c0b746e5SOllivier Robert #ifdef STA_PPSTIME 2396c0b746e5SOllivier Robert if (status & STA_PPSTIME) (void)fprintf(fp, " ppstime"); 2397c0b746e5SOllivier Robert #endif 2398c0b746e5SOllivier Robert #ifdef STA_FLL 2399c0b746e5SOllivier Robert if (status & STA_FLL) (void)fprintf(fp, " fll"); 2400c0b746e5SOllivier Robert #endif 2401c0b746e5SOllivier Robert #ifdef STA_INS 2402c0b746e5SOllivier Robert if (status & STA_INS) (void)fprintf(fp, " ins"); 2403c0b746e5SOllivier Robert #endif 2404c0b746e5SOllivier Robert #ifdef STA_DEL 2405c0b746e5SOllivier Robert if (status & STA_DEL) (void)fprintf(fp, " del"); 2406c0b746e5SOllivier Robert #endif 2407c0b746e5SOllivier Robert #ifdef STA_UNSYNC 2408c0b746e5SOllivier Robert if (status & STA_UNSYNC) (void)fprintf(fp, " unsync"); 2409c0b746e5SOllivier Robert #endif 2410c0b746e5SOllivier Robert #ifdef STA_FREQHOLD 2411c0b746e5SOllivier Robert if (status & STA_FREQHOLD) (void)fprintf(fp, " freqhold"); 2412c0b746e5SOllivier Robert #endif 2413c0b746e5SOllivier Robert #ifdef STA_PPSSIGNAL 2414c0b746e5SOllivier Robert if (status & STA_PPSSIGNAL) (void)fprintf(fp, " ppssignal"); 2415c0b746e5SOllivier Robert #endif 2416c0b746e5SOllivier Robert #ifdef STA_PPSJITTER 2417c0b746e5SOllivier Robert if (status & STA_PPSJITTER) (void)fprintf(fp, " ppsjitter"); 2418c0b746e5SOllivier Robert #endif 2419c0b746e5SOllivier Robert #ifdef STA_PPSWANDER 2420c0b746e5SOllivier Robert if (status & STA_PPSWANDER) (void)fprintf(fp, " ppswander"); 2421c0b746e5SOllivier Robert #endif 2422c0b746e5SOllivier Robert #ifdef STA_PPSERROR 2423c0b746e5SOllivier Robert if (status & STA_PPSERROR) (void)fprintf(fp, " ppserror"); 2424c0b746e5SOllivier Robert #endif 2425c0b746e5SOllivier Robert #ifdef STA_CLOCKERR 2426c0b746e5SOllivier Robert if (status & STA_CLOCKERR) (void)fprintf(fp, " clockerr"); 2427c0b746e5SOllivier Robert #endif 2428c0b746e5SOllivier Robert #ifdef STA_NANO 2429c0b746e5SOllivier Robert if (status & STA_NANO) (void)fprintf(fp, " nano"); 2430c0b746e5SOllivier Robert #endif 2431c0b746e5SOllivier Robert #ifdef STA_MODE 2432c0b746e5SOllivier Robert if (status & STA_MODE) (void)fprintf(fp, " mode=fll"); 2433c0b746e5SOllivier Robert #endif 2434c0b746e5SOllivier Robert #ifdef STA_CLK 2435c0b746e5SOllivier Robert if (status & STA_CLK) (void)fprintf(fp, " src=B"); 2436c0b746e5SOllivier Robert #endif 2437c0b746e5SOllivier Robert (void)fprintf(fp, "\n"); 2438c0b746e5SOllivier Robert (void)fprintf(fp, "pll time constant: %ld\n", 2439c0b746e5SOllivier Robert (u_long)ntohl(ik->constant)); 2440c0b746e5SOllivier Robert (void)fprintf(fp, "precision: %g s\n", 2441c0b746e5SOllivier Robert (u_long)ntohl(ik->precision) * tscale); 2442c0b746e5SOllivier Robert (void)fprintf(fp, "frequency tolerance: %s ppm\n", 2443c0b746e5SOllivier Robert fptoa((s_fp)ntohl(ik->tolerance), 0)); 2444c0b746e5SOllivier Robert 2445c0b746e5SOllivier Robert /* 2446c0b746e5SOllivier Robert * For backwards compatibility (ugh), we find the pps variables 2447c0b746e5SOllivier Robert * only if the shift member is nonzero. 2448c0b746e5SOllivier Robert */ 2449c0b746e5SOllivier Robert if (!ik->shift) 2450c0b746e5SOllivier Robert return; 2451c0b746e5SOllivier Robert 2452c0b746e5SOllivier Robert /* 2453c0b746e5SOllivier Robert * pps variables 2454c0b746e5SOllivier Robert */ 2455c0b746e5SOllivier Robert (void)fprintf(fp, "pps frequency: %s ppm\n", 2456c0b746e5SOllivier Robert fptoa((s_fp)ntohl(ik->ppsfreq), 3)); 2457c0b746e5SOllivier Robert (void)fprintf(fp, "pps stability: %s ppm\n", 2458c0b746e5SOllivier Robert fptoa((s_fp)ntohl(ik->stabil), 3)); 2459c0b746e5SOllivier Robert (void)fprintf(fp, "pps jitter: %g s\n", 2460c0b746e5SOllivier Robert (u_long)ntohl(ik->jitter) * tscale); 2461c0b746e5SOllivier Robert (void)fprintf(fp, "calibration interval: %d s\n", 2462c0b746e5SOllivier Robert 1 << ntohs(ik->shift)); 2463c0b746e5SOllivier Robert (void)fprintf(fp, "calibration cycles: %ld\n", 2464c0b746e5SOllivier Robert (u_long)ntohl(ik->calcnt)); 2465c0b746e5SOllivier Robert (void)fprintf(fp, "jitter exceeded: %ld\n", 2466c0b746e5SOllivier Robert (u_long)ntohl(ik->jitcnt)); 2467c0b746e5SOllivier Robert (void)fprintf(fp, "stability exceeded: %ld\n", 2468c0b746e5SOllivier Robert (u_long)ntohl(ik->stbcnt)); 2469c0b746e5SOllivier Robert (void)fprintf(fp, "calibration errors: %ld\n", 2470c0b746e5SOllivier Robert (u_long)ntohl(ik->errcnt)); 2471c0b746e5SOllivier Robert } 2472