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