]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
ntcdc options update
authorRay Van Tassle <rayvt@ntp.org>
Fri, 24 Feb 2006 02:10:29 +0000 (02:10 +0000)
committerRay Van Tassle <rayvt@ntp.org>
Fri, 24 Feb 2006 02:10:29 +0000 (02:10 +0000)
bk: 43fe6b15mkS13hqeqd7WuCKMmocRVw

ntpd/ntp_request.c
ntpdc/ntpdc.h
ntpdc/ntpdc_ops.c

index 17dcef5fb12ce7c57883f31ce904f91157ce84a7..34401666e6debcffa5eba580d08c5b63d2f1bbb9 100644 (file)
@@ -1000,10 +1000,13 @@ peer_stats (
                    ip->flags |= INFO_FLAG_PREFER;
                if (pp->flags & FLAG_BURST)
                    ip->flags |= INFO_FLAG_BURST;
+               if (pp->flags & FLAG_IBURST)
+                   ip->flags |= INFO_FLAG_IBURST;
                if (pp->status == CTL_PST_SEL_SYNCCAND)
                    ip->flags |= INFO_FLAG_SEL_CANDIDATE;
                if (pp->status >= CTL_PST_SEL_SYSPEER)
                    ip->flags |= INFO_FLAG_SHORTLIST;
+               ip->flags = htons(ip->flags);
                ip->timereceived = htonl((u_int32)(current_time - pp->timereceived));
                ip->timetosend = htonl(pp->nextdate - current_time);
                ip->timereachable = htonl((u_int32)(current_time - pp->timereachable));
@@ -1620,7 +1623,9 @@ setclr_flags(
        )
 {
        register u_int flags;
+       int prev_kern_enable;
 
+       prev_kern_enable = kern_enable;
        if (INFO_NITEMS(inpkt->err_nitems) > 1) {
                msyslog(LOG_ERR, "setclr_flags: err_nitems > 1");
                req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
@@ -1628,7 +1633,8 @@ setclr_flags(
        }
 
        flags = ((struct conf_sys_flags *)inpkt->data)->flags;
-
+       flags = ntohl(flags);
+       
        if (flags & ~(SYS_FLAG_BCLIENT | SYS_FLAG_PPS |
                      SYS_FLAG_NTP | SYS_FLAG_KERNEL | SYS_FLAG_MONITOR |
                      SYS_FLAG_FILEGEN | SYS_FLAG_AUTH | SYS_FLAG_CAL)) {
@@ -1658,6 +1664,12 @@ setclr_flags(
        if (flags & SYS_FLAG_CAL)
                proto_config(PROTO_CAL, set, 0., NULL);
        req_ack(srcadr, inter, inpkt, INFO_OKAY);
+
+       /* Reset the kernel ntp parameters if the kernel flag changed. */
+       if (prev_kern_enable && !kern_enable)
+               loop_config(LOOP_KERN_CLEAR, 0.0);
+       if (!prev_kern_enable && kern_enable)
+               loop_config(LOOP_DRIFTCOMP, drift_comp);
 }
 
 
@@ -1780,6 +1792,8 @@ do_restrict(
        cr = (struct conf_restrict *)inpkt->data;
 
        bad = 0;
+       cr->flags = ntohs(cr->flags);
+       cr->mflags = ntohs(cr->mflags);
        while (items-- > 0 && !bad) {
                if (cr->mflags & ~(RESM_NTPONLY))
                    bad |= 1;
@@ -1926,7 +1940,7 @@ mon_getlist_1(
                                : GET_INADDR(md->interface->bcast))
                                : 4);
                }
-               im->flags = md->cast_flags;
+               im->flags = htonl(md->cast_flags);
                im->port = md->rmtport;
                im->mode = md->mode;
                im->version = md->version;
@@ -1974,7 +1988,8 @@ reset_stats(
        }
 
        flags = ((struct reset_flags *)inpkt->data)->flags;
-
+       flags = ntohl(flags);
+     
        if (flags & ~RESET_ALLFLAGS) {
                msyslog(LOG_ERR, "reset_stats: reset leaves %#lx",
                        flags & ~RESET_ALLFLAGS);
index ff935ae24289862a84baeb23ab7cc62c6eb7ca6b..7fc6994748b295028bab255fc46bbafbbe17dc90 100644 (file)
@@ -11,7 +11,8 @@
  * Maximum number of arguments
  */
 #define        MAXARGS 4
-#define        MOREARGS 4
+#define        MOREARGS 10
+
 /*
  * Flags for forming descriptors.
  */
index 8663588d5c1063f7d437b95aaf71c8ef24ddc2d1..d1310d961e7e7cc590a02cf5ee2f25dc50531c04 100644 (file)
@@ -116,16 +116,16 @@ struct xcmd opcmds[] = {
        { "timerstats", timerstats,     { NO, NO, NO, NO },
          { "", "", "", "" },
          "display event timer subsystem statistics" },
-       { "addpeer",    addpeer,        { NTP_ADD, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_STR },
-         { "addr", "keyid", "version", "minpoll|prefer|burst ..." },
+       { "addpeer",    addpeer,        { NTP_ADD, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR },
+         { "addr", "keyid", "version", "minpoll#|prefer|burst|iburst|'minpoll N'|'maxpoll N'|'keyid N'|'version N' ..." },
          "configure a new peer association" },
-       { "addserver",  addserver,      { NTP_ADD, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_STR },
-         { "addr", "keyid", "version", "minpoll|prefer|burst|iburst ..." },
+       { "addserver",  addserver,      { NTP_ADD, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR },
+         { "addr", "keyid", "version", "minpoll#|prefer|burst|iburst|'minpoll N'|'maxpoll N'|'keyid N'|'version N' ..." },
          "configure a new server" },
        { "addrefclock",addrefclock,    { NTP_ADD, OPT|NTP_UINT, OPT|NTP_STR, OPT|NTP_STR },
          { "addr", "mode", "minpoll|prefer", "minpoll|prefer" },
          "configure a new server" },
-       { "broadcast",  broadcast,      { NTP_ADD, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_STR },
+       { "broadcast",  broadcast,      { NTP_ADD, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR },
          { "addr", "keyid", "version", "minpoll" },
          "configure broadcasting time service" },
        { "unconfig",   unconfig,       { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD },
@@ -482,6 +482,52 @@ refid_string(
        return numtoa(refid);
 }
 
+static void
+print_pflag(
+           FILE *fp,
+           u_int32 flags
+           )
+{
+     const char *str;
+
+     if (flags == 0) {
+               (void) fprintf(fp, " none\n");
+       } else {
+               str = "";
+               if (flags & INFO_FLAG_SYSPEER) {
+                       (void) fprintf(fp, " system_peer");
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_CONFIG) {
+                       (void) fprintf(fp, "%s config", str);
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_REFCLOCK) {
+                       (void) fprintf(fp, "%s refclock", str);
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_AUTHENABLE) {
+                       (void) fprintf(fp, "%s auth", str);
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_BCLIENT) {
+                       (void) fprintf(fp, "%s bclient", str);
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_PREFER) {
+                       (void) fprintf(fp, "%s prefer", str);
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_IBURST) {
+                       (void) fprintf(fp, "%s iburst", str);
+                       str = ",";
+               }
+               if (flags & INFO_FLAG_BURST) {
+                       (void) fprintf(fp, "%s burst", str);
+               }
+               (void) fprintf(fp, "\n");
+       }
+}
 /*
  * printpeer - print detail information for a peer
  */
@@ -492,7 +538,6 @@ printpeer(
        )
 {
        register int i;
-       const char *str;
        l_fp tempts;
        struct sockaddr_storage srcadr, dstadr;
        
@@ -538,39 +583,7 @@ printpeer(
                       fptoa(NTOHS_FP(pp->estbdelay), 5), pp->ttl);
        
        (void) fprintf(fp, "timer %lds, flags", (long)ntohl(pp->timer));
-       if (pp->flags == 0) {
-               (void) fprintf(fp, " none\n");
-       } else {
-               str = "";
-               if (pp->flags & INFO_FLAG_SYSPEER) {
-                       (void) fprintf(fp, " system_peer");
-                       str = ",";
-               }
-               if (pp->flags & INFO_FLAG_CONFIG) {
-                       (void) fprintf(fp, "%s config", str);
-                       str = ",";
-               }
-               if (pp->flags & INFO_FLAG_REFCLOCK) {
-                       (void) fprintf(fp, "%s refclock", str);
-                       str = ",";
-               }
-               if (pp->flags & INFO_FLAG_AUTHENABLE) {
-                       (void) fprintf(fp, "%s auth", str);
-                       str = ",";
-               }
-               if (pp->flags & INFO_FLAG_BCLIENT) {
-                       (void) fprintf(fp, "%s bclient", str);
-                       str = ",";
-               }
-               if (pp->flags & INFO_FLAG_PREFER) {
-                       (void) fprintf(fp, "%s prefer", str);
-                       str = ",";
-               }
-               if (pp->flags & INFO_FLAG_BURST) {
-                       (void) fprintf(fp, "%s burst", str);
-               }
-               (void) fprintf(fp, "\n");
-       }
+       print_pflag(fp, pp->flags); 
 
        NTOHL_FP(&pp->reftime, &tempts);
        (void) fprintf(fp, "reference time:      %s\n",
@@ -803,7 +816,9 @@ again:
                               (int)pp->candidate);
                if (items > 0)
                    (void) fprintf(fp, "\n");
-               pp++;
+               (void) fprintf(fp, "flags:      ");
+               print_pflag(fp, ntohs(pp->flags));
+               pp++;
        }
 }
 
@@ -1280,51 +1295,31 @@ doconfig(
        u_long keyid;
        u_int version;
        u_char minpoll;
+       u_char maxpoll;
        u_int flags;
        u_char cmode;
        int res;
        int sendsize;
+       int numtyp;
 
 again:
        keyid = 0;
-       version = NTP_OLDVERSION + 1;
+       version = 3;
        flags = 0;
        res = 0;
        cmode = 0;
        minpoll = NTP_MINDPOLL;
+       maxpoll = NTP_MAXDPOLL;
+       numtyp = 1;
+       if (refc)
+            numtyp = 5;
 
        if (impl_ver == IMPL_XNTPD)
                sendsize = sizeof(struct conf_peer);
        else
                sendsize = v4sizeof(struct conf_peer);
 
-       items = pcmd->nargs;
-
-       if (refc) {
-               if (pcmd->nargs > 1) {
-                       cmode = (u_char) pcmd->argval[1].uval;
-                       items = 2;
-               }
-       } else {
-               if (pcmd->nargs > 1) {
-                       keyid = pcmd->argval[1].uval;
-                       if (keyid > 0) {
-                               flags |= CONF_FLAG_AUTHENABLE;
-                       }
-                       if (pcmd->nargs > 2) {
-                               version = (u_int)pcmd->argval[2].uval;
-                               if (version > NTP_VERSION ||
-                                   version < NTP_OLDVERSION) {
-                                       (void)fprintf(fp,
-                                       "invalid version number %u\n",
-                                           version);
-                                       res++;
-                               }
-                               items = 3;
-                       }
-               }
-       }
-
+       items = 1;
        while (pcmd->nargs > items) {
                if (STREQ(pcmd->argval[items].string, "prefer"))
                    flags |= CONF_FLAG_PREFER;
@@ -1332,28 +1327,74 @@ again:
                    flags |= CONF_FLAG_BURST;
                else if (STREQ(pcmd->argval[items].string, "iburst"))
                    flags |= CONF_FLAG_IBURST;
+               else if (!refc && STREQ(pcmd->argval[items].string, "keyid"))
+                   numtyp = 1;
+               else if (!refc && STREQ(pcmd->argval[items].string, "version"))
+                   numtyp = 2;
+               else if (STREQ(pcmd->argval[items].string, "minpoll"))
+                   numtyp = 3;
+               else if (STREQ(pcmd->argval[items].string, "maxpoll"))
+                   numtyp = 4;
                else {
                        long val;
-                       if (!atoint(pcmd->argval[items].string, &val)) {
-                               (void) fprintf(fp,
-                                   "%s not understood\n",
-                                   pcmd->argval[items].string);
-                               res++;
-                               break;
-                       } else {
-                               if (val >= NTP_MINPOLL && val <= NTP_MAXPOLL) {
-                                       minpoll = (u_char)val;
-                               } else {
-                                       (void) fprintf(fp,
-                                                      "minpol must be within %d..%d\n",
-                                                      NTP_MINPOLL, NTP_MAXPOLL);
-                                       res++;
-                                       break;
-                               }                                       
+                       if (!atoint(pcmd->argval[items].string, &val))
+                            numtyp = 0;                                  
+                       switch (numtyp) {
+                       case 1:
+                            keyid = val;
+                            numtyp = 2;                                  
+                            break;
+                            
+                       case 2:
+                            version = (u_int) val;
+                            numtyp = 0;                                  
+                            break;
+
+                       case 3:
+                            minpoll = (u_char)val;
+                            numtyp = 0;                                  
+                            break;
+
+                       case 4:
+                            maxpoll = (u_char)val;
+                            numtyp = 0;                                  
+                            break;
+
+                       case 5:
+                            cmode = (u_char)val;
+                            numtyp = 0;                                  
+                            break;
+
+                       default:
+                            (void) fprintf(fp, "*** '%s' not understood\n",
+                                           pcmd->argval[items].string);
+                            res++;
+                            numtyp = 0;                                  
                        }
-               }
-               items++;
-       }
+                       if (val < 0) {
+                            (void) fprintf(stderr,
+                                    "***Value '%s' should be unsigned\n",
+                                     pcmd->argval[items].string);
+                            res++;
+                       }
+                  }
+            items++;
+       }
+       if (keyid > 0)
+            flags |= CONF_FLAG_AUTHENABLE;
+       if (version > NTP_VERSION ||
+           version < NTP_OLDVERSION) {
+            (void)fprintf(fp, "***invalid version number: %u\n",
+                          version);
+            res++;
+       }
+       if (minpoll < NTP_MINPOLL || minpoll > NTP_MAXPOLL || 
+           maxpoll < NTP_MINPOLL || maxpoll > NTP_MAXPOLL || 
+           minpoll > maxpoll) {
+            (void) fprintf(fp, "***min/max-poll must be within %d..%d\n",
+                           NTP_MINPOLL, NTP_MAXPOLL);
+            res++;
+       }                                       
 
        if (res)
            return;
@@ -1377,7 +1418,7 @@ again:
        cpeer.keyid = keyid;
        cpeer.version = (u_char) version;
        cpeer.minpoll = minpoll;
-       cpeer.maxpoll = NTP_MAXDPOLL;
+       cpeer.maxpoll = maxpoll;
        cpeer.flags = (u_char)flags;
        cpeer.ttl = cmode;
 
@@ -1529,6 +1570,7 @@ doset(
                }
        }
 
+       sys.flags = htonl(sys.flags);
        if (res || sys.flags == 0)
            return;
 
@@ -1834,6 +1876,8 @@ again:
                        }
                }
        }
+       cres.flags = htons(cres.flags);
+       cres.mflags = htons(cres.mflags);
 
        /*
         * Make sure mask for default address is zero.  Otherwise,
@@ -2087,6 +2131,7 @@ reset(
                        rflags.flags |= sreset[i].flag;
                }
        }
+       rflags.flags = htonl(rflags.flags);
 
        if (err) {
                (void) fprintf(fp, "Not done due to errors\n");