📄 ntpdc_ops.c
字号:
};static struct resflags resmflags[] = { { "ntpport", RESM_NTPONLY }, { "interface", RESM_INTERFACE }, { "", 0 }};/* * reslist - obtain and print the server's restrict list *//*ARGSUSED*/static voidreslist( struct parse *pcmd, FILE *fp ){ struct info_restrict *rl; struct sockaddr_storage resaddr; struct sockaddr_storage maskaddr; int items; int itemsize; int res; int skip; char *addr; char *mask; struct resflags *rf; u_int32 count; u_short flags; u_short mflags; char flagstr[300]; static const char *comma = ", ";again: res = doquery(impl_ver, REQ_GET_RESTRICT, 0, 0, 0, (char *)NULL, &items, &itemsize, (void *)&rl, 0, sizeof(struct info_restrict)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res != 0) return; if (!checkitems(items, fp)) return; if (!checkitemsize(itemsize, sizeof(struct info_restrict)) && !checkitemsize(itemsize, v4sizeof(struct info_restrict))) return; (void) fprintf(fp, " address mask count flags\n"); (void) fprintf(fp, "=====================================================================\n"); while (items > 0) { memset((char *)&resaddr, 0, sizeof(resaddr)); memset((char *)&maskaddr, 0, sizeof(maskaddr)); if (rl->v6_flag != 0) { GET_INADDR6(resaddr) = rl->addr6; GET_INADDR6(maskaddr) = rl->mask6; resaddr.ss_family = AF_INET6; maskaddr.ss_family = AF_INET6;#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR resaddr.ss_len = SOCKLEN(&resaddr);#endif addr = nntohost(&resaddr); } else { GET_INADDR(resaddr) = rl->addr; GET_INADDR(maskaddr) = rl->mask; resaddr.ss_family = AF_INET; maskaddr.ss_family = AF_INET;#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR resaddr.ss_len = SOCKLEN(&resaddr);#endif if ((rl->mask == (u_int32)0xffffffff)) addr = nntohost(&resaddr); else addr = stoa(&resaddr); } mask = stoa(&maskaddr); skip = 1; if ((pcmd->nargs == 0) || ((pcmd->argval->ival == 6) && (rl->v6_flag != 0)) || ((pcmd->argval->ival == 4) && (rl->v6_flag == 0))) skip = 0; count = ntohl(rl->count); flags = ntohs(rl->flags); mflags = ntohs(rl->mflags); flagstr[0] = '\0'; res = 1; rf = &resmflags[0]; while (rf->bit != 0) { if (mflags & rf->bit) { if (!res) (void) strcat(flagstr, comma); res = 0; (void) strcat(flagstr, rf->str); } rf++; } rf = (impl_ver == IMPL_XNTPD_OLD) ? &resflagsV2[0] : &resflagsV3[0] ; while (rf->bit != 0) { if (flags & rf->bit) { if (!res) (void) strcat(flagstr, comma); res = 0; (void) strcat(flagstr, rf->str); } rf++; } if (flagstr[0] == '\0') (void) strcpy(flagstr, "none"); if (!skip) (void) fprintf(fp, "%-15.15s %-15.15s %9ld %s\n", addr, mask, (u_long)count, flagstr); rl++; items--; }}/* * new_restrict - create/add a set of restrictions */static voidnew_restrict( struct parse *pcmd, FILE *fp ){ do_restrict(pcmd, fp, REQ_RESADDFLAGS);}/* * unrestrict - remove restriction flags from existing entry */static voidunrestrict( struct parse *pcmd, FILE *fp ){ do_restrict(pcmd, fp, REQ_RESSUBFLAGS);}/* * delrestrict - delete an existing restriction */static voiddelrestrict( struct parse *pcmd, FILE *fp ){ do_restrict(pcmd, fp, REQ_UNRESTRICT);}/* * do_restrict - decode commandline restrictions and make the request */static voiddo_restrict( struct parse *pcmd, FILE *fp, int req_code ){ struct conf_restrict cres; int items; int itemsize; char *dummy; u_int32 num; u_long bit; int i; int res; int err; int sendsize; /* Initialize cres */ cres.addr = 0; cres.mask = 0; cres.flags = 0; cres.mflags = 0; cres.v6_flag = 0;again: if (impl_ver == IMPL_XNTPD) sendsize = sizeof(struct conf_restrict); else sendsize = v4sizeof(struct conf_restrict); if (pcmd->argval[0].netnum.ss_family == AF_INET) { cres.addr = GET_INADDR(pcmd->argval[0].netnum); cres.mask = GET_INADDR(pcmd->argval[1].netnum); if (impl_ver == IMPL_XNTPD) cres.v6_flag = 0; } else { if (impl_ver == IMPL_XNTPD_OLD) { fprintf(stderr, "***Server doesn't understand IPv6 addresses\n"); return; } cres.addr6 = GET_INADDR6(pcmd->argval[0].netnum); cres.v6_flag = 1; } cres.flags = 0; cres.mflags = 0; err = 0; for (res = 2; res < pcmd->nargs; res++) { if (STREQ(pcmd->argval[res].string, "ntpport")) { cres.mflags |= RESM_NTPONLY; } else { for (i = 0; resflagsV3[i].bit != 0; i++) { if (STREQ(pcmd->argval[res].string, resflagsV3[i].str)) break; } if (resflagsV3[i].bit != 0) { cres.flags |= resflagsV3[i].bit; if (req_code == REQ_UNRESTRICT) { (void) fprintf(fp, "Flag %s inappropriate\n", resflagsV3[i].str); err++; } } else { (void) fprintf(fp, "Unknown flag %s\n", pcmd->argval[res].string); err++; } } } /* * Make sure mask for default address is zero. Otherwise, * make sure mask bits are contiguous. */ if (pcmd->argval[0].netnum.ss_family == AF_INET) { if (cres.addr == 0) { cres.mask = 0; } else { num = ntohl(cres.mask); for (bit = 0x80000000; bit != 0; bit >>= 1) if ((num & bit) == 0) break; for ( ; bit != 0; bit >>= 1) if ((num & bit) != 0) break; if (bit != 0) { (void) fprintf(fp, "Invalid mask %s\n", numtoa(cres.mask)); err++; } } } else { /* XXX IPv6 sanity checking stuff */ } if (err) return; res = doquery(impl_ver, req_code, 1, 1, sendsize, (char *)&cres, &items, &itemsize, &dummy, 0, sizeof(struct conf_restrict)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * monlist - obtain and print the server's monitor data *//*ARGSUSED*/static voidmonlist( struct parse *pcmd, FILE *fp ){ char *struct_star; struct sockaddr_storage addr; struct sockaddr_storage dstadr; int items; int itemsize; int res; int version = -1; if (pcmd->nargs > 0) { version = pcmd->argval[0].ival; }again: res = doquery(impl_ver, (version == 1 || version == -1) ? REQ_MON_GETLIST_1 : REQ_MON_GETLIST, 0, 0, 0, (char *)NULL, &items, &itemsize, &struct_star, (version < 0) ? (1 << INFO_ERR_REQ) : 0, sizeof(struct info_monitor_1)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == INFO_ERR_REQ && version < 0) res = doquery(impl_ver, REQ_MON_GETLIST, 0, 0, 0, (char *)NULL, &items, &itemsize, &struct_star, 0, sizeof(struct info_monitor)); if (res != 0) return; if (!checkitems(items, fp)) return; if (itemsize == sizeof(struct info_monitor_1) || itemsize == v4sizeof(struct info_monitor_1)) { struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star; (void) fprintf(fp, "remote address port local address count m ver code avgint lstint\n"); (void) fprintf(fp, "===============================================================================\n"); while (items > 0) { memset((char *)&addr, 0, sizeof(addr)); memset((char *)&dstadr, 0, sizeof(dstadr)); if (ml->v6_flag != 0) { GET_INADDR6(addr) = ml->addr6; addr.ss_family = AF_INET6; GET_INADDR6(dstadr) = ml->daddr6; dstadr.ss_family = AF_INET6; } else { GET_INADDR(addr) = ml->addr; addr.ss_family = AF_INET; GET_INADDR(dstadr) = ml->daddr; dstadr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR addr.ss_len = SOCKLEN(&addr); dstadr.ss_len = SOCKLEN(&dstadr);#endif if ((pcmd->nargs == 0) || ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) || ((pcmd->argval->ival == 4) && (ml->v6_flag == 0))) (void) fprintf(fp, "%-22.22s %5d %-15s %8ld %1d %1d %6lx %6lu %7lu\n", nntohost(&addr), ntohs(ml->port), stoa(&dstadr), (u_long)ntohl(ml->count), ml->mode, ml->version, (u_long)ntohl(ml->lastdrop), (u_long)ntohl(ml->lasttime), (u_long)ntohl(ml->firsttime)); ml++; items--; } } else if (itemsize == sizeof(struct info_monitor) || itemsize == v4sizeof(struct info_monitor)) { struct info_monitor *ml = (struct info_monitor *) struct_star; (void) fprintf(fp, " address port count mode ver code avgint lstint\n"); (void) fprintf(fp, "===============================================================================\n"); while (items > 0) { memset((char *)&dstadr, 0, sizeof(dstadr)); if (ml->v6_flag != 0) { GET_INADDR6(dstadr) = ml->addr6; dstadr.ss_family = AF_INET6; } else { GET_INADDR(dstadr) = ml->addr; dstadr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR dstadr.ss_len = SOCKLEN(&dstadr);#endif if ((pcmd->nargs == 0) || ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) || ((pcmd->argval->ival == 4) && (ml->v6_flag == 0))) (void) fprintf(fp, "%-25.25s %5d %9ld %4d %2d %9lx %9lu %9lu\n", nntohost(&dstadr), ntohs(ml->port), (u_long)ntohl(ml->count), ml->mode, ml->version, (u_long)ntohl(ml->lastdrop), (u_long)ntohl(ml->lasttime), (u_long)ntohl(ml->firsttime)); ml++; items--; } } else if (itemsize == sizeof(struct old_info_monitor)) { struct old_info_monitor *oml = (struct old_info_monitor *)struct_star; (void) fprintf(fp, " address port count mode version lasttime firsttime\n"); (void) fprintf(fp, "======================================================================\n"); while (items > 0) { memset((char *)&dstadr, 0, sizeof(dstadr)); if (oml->v6_flag != 0) { GET_INADDR6(dstadr) = oml->addr6; dstadr.ss_family = AF_INET6; } else { GET_INADDR(dstadr) = oml->addr; dstadr.ss_family = AF_INET; }#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR dstadr.ss_len = SOCKLEN(&dstadr);#endif (void) fprintf(fp, "%-20.20s %5d %9ld %4d %3d %9lu %9lu\n", nntohost(&dstadr), ntohs(oml->port), (u_long)ntohl(oml->count), oml->mode, oml->version, (u_long)ntohl(oml->lasttime), (u_long)ntohl(oml->firsttime)); oml++; items--; } } else { /* issue warning according to new info_monitor size */ checkitemsize(itemsize, sizeof(struct info_monitor)); }}/* * Mapping between command line strings and stat reset flags */struct statreset { const char *str; int flag;} sreset[] = { { "io", RESET_FLAG_IO }, { "sys", RESET_FLAG_SYS }, { "mem", RESET_FLAG_MEM }, { "timer", RESET_FLAG_TIMER }, { "auth", RESET_FLAG_AUTH }, { "allpeers", RESET_FLAG_ALLPEERS }, { "", 0 }};/* * reset - reset statistic counters */static voidreset( struct parse *pcmd, FILE *fp ){ struct reset_flags rflags; int items; int itemsize; char *dummy; int i; int res; int err; err = 0; rflags.flags = 0; for (res = 0; res < pcmd->nargs; res++) { for (i = 0; sreset[i].flag != 0; i++) { if (STREQ(pcmd->argval[res].string, sreset[i].str)) break; } if (sreset[i].flag == 0) { (void) fprintf(fp, "Flag %s unknown\n", pcmd->argval[res].string); err++; } else { rflags.flags |= sreset[i].flag; } } if (err) { (void) fprintf(fp, "Not done due to errors\n"); return; }again: res = doquery(impl_ver, REQ_RESET_STATS, 1, 1, sizeof(struct reset_flags), (char *)&rflags, &items, &itemsize, &dummy, 0, sizeof(struct reset_flags)); if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { impl_ver = IMPL_XNTPD_OLD; goto again; } if (res == 0) (void) fprintf(fp, "done!\n"); return;}/* * preset - reset stat counters for particular peers */static void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -