1 1.1 kardel /* -*- Mode: Text -*- */ 2 1.1 kardel 3 1.1 kardel autogen definitions options; 4 1.1 kardel 5 1.1 kardel #include autogen-version.def 6 1.1 kardel #include copyright.def 7 1.1 kardel 8 1.1 kardel prog-name = "sntp"; 9 1.1.1.3 christos prog-title = "standard Simple Network Time Protocol client program"; 10 1.1.1.2 kardel argument = '[ hostname-or-IP ...]'; 11 1.1.1.2 kardel 12 1.1.1.2 kardel #include homerc.def 13 1.1 kardel 14 1.1 kardel long-opts; 15 1.1 kardel 16 1.1.1.3 christos config-header = "config.h"; 17 1.1 kardel 18 1.1 kardel environrc; 19 1.1 kardel 20 1.1 kardel #include version.def 21 1.1 kardel 22 1.1 kardel flag = { 23 1.1.1.3 christos name = ipv4; 24 1.1.1.3 christos value = 4; 25 1.1.1.3 christos flags-cant = ipv6; 26 1.1.1.3 christos descrip = "Force IPv4 DNS name resolution"; 27 1.1.1.3 christos doc = <<- _EndOfDoc_ 28 1.1.1.2 kardel Force DNS resolution of the following host names on the command line 29 1.1 kardel to the IPv4 namespace. 30 1.1 kardel _EndOfDoc_; 31 1.1 kardel }; 32 1.1 kardel 33 1.1 kardel flag = { 34 1.1.1.3 christos name = ipv6; 35 1.1.1.3 christos value = 6; 36 1.1.1.3 christos flags-cant = ipv4; 37 1.1.1.3 christos descrip = "Force IPv6 DNS name resolution"; 38 1.1.1.3 christos doc = <<- _EndOfDoc_ 39 1.1.1.2 kardel Force DNS resolution of the following host names on the command line 40 1.1 kardel to the IPv6 namespace. 41 1.1 kardel _EndOfDoc_; 42 1.1 kardel }; 43 1.1 kardel 44 1.1.1.3 christos flag = { 45 1.1.1.3 christos name = authentication; 46 1.1.1.3 christos value = a; 47 1.1.1.3 christos descrip = "Enable authentication with the key @var{auth-keynumber}"; 48 1.1.1.3 christos arg-type = number; 49 1.1.1.3 christos arg-name = "auth-keynumber"; 50 1.1.1.3 christos doc = <<- _EndOfDoc_ 51 1.1.1.3 christos Enable authentication using the key specified in this option's 52 1.1.1.3 christos argument. The argument of this option is the @option{keyid}, a 53 1.1.1.3 christos number specified in the @option{keyfile} as this key's identifier. 54 1.1.1.3 christos See the @option{keyfile} option (@option{-k}) for more details. 55 1.1.1.3 christos _EndOfDoc_; 56 1.1.1.3 christos }; 57 1.1 kardel 58 1.1 kardel flag = { 59 1.1.1.3 christos name = broadcast; 60 1.1.1.3 christos value = b; 61 1.1.1.3 christos descrip = "Listen to the address specified for broadcast time sync"; 62 1.1.1.3 christos arg-type = string; 63 1.1.1.3 christos arg-name = "broadcast-address"; 64 1.1.1.3 christos max = NOLIMIT; 65 1.1.1.3 christos stack-arg; 66 1.1.1.3 christos doc = <<- _EndOfDoc_ 67 1.1.1.3 christos If specified @code{sntp} will listen to the specified address 68 1.1.1.3 christos for NTP broadcasts. The default maximum wait time 69 1.1.1.3 christos can (and probably should) be modified with @option{-t}. 70 1.1 kardel _EndOfDoc_; 71 1.1 kardel }; 72 1.1 kardel 73 1.1 kardel flag = { 74 1.1.1.3 christos name = concurrent; 75 1.1.1.3 christos value = c; 76 1.1.1.3 christos descrip = "Concurrently query all IPs returned for host-name"; 77 1.1.1.3 christos arg-type = string; 78 1.1.1.3 christos arg-name = "host-name"; 79 1.1.1.3 christos max = NOLIMIT; 80 1.1.1.3 christos stack-arg; 81 1.1.1.3 christos doc = <<- _EndOfDoc_ 82 1.1.1.3 christos Requests from an NTP "client" to a "server" should never be sent 83 1.1.1.3 christos more rapidly than one every 2 seconds. By default, any IPs returned 84 1.1.1.3 christos as part of a DNS lookup are assumed to be for a single instance of 85 1.1.1.3 christos @code{ntpd}, and therefore @code{sntp} will send queries to these IPs 86 1.1.1.3 christos one after another, with a 2-second gap in between each query. 87 1.1.1.3 christos 88 1.1.1.3 christos The @option{-c} or @option{--concurrent} flag says that any IPs 89 1.1.1.3 christos returned for the DNS lookup of the supplied host-name are on 90 1.1.1.3 christos different machines, so we can send concurrent queries. 91 1.1 kardel _EndOfDoc_; 92 1.1 kardel }; 93 1.1 kardel 94 1.1.1.3 christos #include debug-opt.def 95 1.1 kardel 96 1.1 kardel flag = { 97 1.1.1.3 christos name = gap; 98 1.1.1.3 christos value = g; 99 1.1.1.3 christos descrip = "The gap (in milliseconds) between time requests"; 100 1.1.1.3 christos arg-type = number; 101 1.1.1.3 christos arg-name = "milliseconds"; 102 1.1.1.3 christos arg-default = 50; 103 1.1.1.3 christos doc = <<- _EndOfDoc_ 104 1.1.1.3 christos Since we're only going to use the first valid response we get and 105 1.1.1.3 christos there is benefit to specifying a good number of servers to query, 106 1.1.1.3 christos separate the queries we send out by the specified number of 107 1.1.1.3 christos milliseconds. 108 1.1 kardel _EndOfDoc_; 109 1.1.1.2 kardel }; 110 1.1 kardel 111 1.1 kardel flag = { 112 1.1.1.3 christos name = kod; 113 1.1.1.3 christos value = K; 114 1.1.1.3 christos arg-type = file; 115 1.1.1.3 christos arg-name = "file-name"; 116 1.1.1.3 christos arg-default = "/var/db/ntp-kod"; 117 1.1.1.3 christos descrip = "KoD history filename"; 118 1.1.1.3 christos doc = <<- _EndOfDoc_ 119 1.1.1.3 christos Specifies the filename to be used for the persistent history of KoD 120 1.1.1.4 christos responses received from servers. If the file does not exist, a 121 1.1.1.4 christos warning message will be displayed. The file will not be created. 122 1.1 kardel _EndOfDoc_; 123 1.1 kardel }; 124 1.1 kardel 125 1.1 kardel flag = { 126 1.1.1.3 christos name = keyfile; 127 1.1.1.3 christos value = k; 128 1.1.1.3 christos descrip = "Look in this file for the key specified with @option{-a}"; 129 1.1.1.3 christos arg-type = file; 130 1.1.1.3 christos arg-name = "file-name"; 131 1.1.1.6 christos arg-default = "/etc/ntp.keys"; 132 1.1.1.3 christos doc = <<- _EndOfDoc_ 133 1.1.1.3 christos This option specifies the keyfile. 134 1.1.1.3 christos @code{sntp} will search for the key specified with @option{-a} 135 1.1.1.3 christos @file{keyno} in this file. See @command{ntp.keys(5)} for more 136 1.1.1.3 christos information. 137 1.1 kardel _EndOfDoc_; 138 1.1 kardel }; 139 1.1 kardel 140 1.1 kardel flag = { 141 1.1.1.3 christos name = logfile; 142 1.1.1.3 christos value = l; 143 1.1.1.3 christos arg-type = file; 144 1.1.1.3 christos arg-name = "file-name"; 145 1.1.1.3 christos descrip = "Log to specified logfile"; 146 1.1.1.3 christos doc = <<- _EndOfDoc_ 147 1.1.1.3 christos This option causes the client to write log messages to the specified 148 1.1.1.3 christos @file{logfile}. 149 1.1 kardel _EndOfDoc_; 150 1.1 kardel }; 151 1.1 kardel 152 1.1 kardel flag = { 153 1.1.1.3 christos name = steplimit; 154 1.1.1.3 christos value = M; 155 1.1.1.3 christos arg-type = number; 156 1.1.1.3 christos arg-range = "0->"; 157 1.1.1.3 christos descrip = "Adjustments less than @var{steplimit} msec will be slewed"; 158 1.1.1.3 christos doc = <<- _EndOfDoc_ 159 1.1.1.3 christos If the time adjustment is less than @file{steplimit} milliseconds, 160 1.1.1.3 christos slew the amount using @command{adjtime(2)}. Otherwise, step the 161 1.1.1.5 christos correction using @command{settimeofday(2)}. The default value is 0, 162 1.1.1.5 christos which means all adjustments will be stepped. This is a feature, as 163 1.1.1.5 christos different situations demand different values. 164 1.1 kardel _EndOfDoc_; 165 1.1 kardel }; 166 1.1 kardel 167 1.1 kardel flag = { 168 1.1.1.3 christos name = ntpversion; 169 1.1.1.3 christos value = o; 170 1.1.1.3 christos descrip = "Send @var{int} as our NTP protocol version"; 171 1.1.1.3 christos arg-type = number; 172 1.1.1.3 christos arg-default = 4; 173 1.1.1.3 christos arg-range = "0->7"; 174 1.1.1.3 christos doc = <<- _EndOfDoc_ 175 1.1.1.3 christos When sending requests to a remote server, tell them we are running 176 1.1.1.3 christos NTP protocol version @file{ntpversion} . 177 1.1 kardel _EndOfDoc_; 178 1.1 kardel }; 179 1.1 kardel 180 1.1 kardel flag = { 181 1.1.1.3 christos name = usereservedport; 182 1.1.1.3 christos value = r; 183 1.1.1.3 christos descrip = "Use the NTP Reserved Port (port 123)"; 184 1.1.1.3 christos doc = <<- _EndOfDoc_ 185 1.1.1.3 christos Use port 123, which is reserved for NTP, for our network 186 1.1.1.3 christos communications. 187 1.1 kardel _EndOfDoc_; 188 1.1 kardel }; 189 1.1 kardel 190 1.1 kardel flag = { 191 1.1.1.3 christos name = step; 192 1.1.1.3 christos value = S; 193 1.1.1.3 christos descrip = "OK to 'step' the time with @command{settimeofday(2)}"; 194 1.1.1.3 christos doc = <<- _EndOfDoc_ 195 1.1.1.3 christos _EndOfDoc_; 196 1.1.1.3 christos }; 197 1.1 kardel 198 1.1.1.3 christos flag = { 199 1.1.1.3 christos name = slew; 200 1.1.1.3 christos value = s; 201 1.1.1.3 christos descrip = "OK to 'slew' the time with @command{adjtime(2)}"; 202 1.1.1.3 christos doc = <<- _EndOfDoc_ 203 1.1.1.3 christos _EndOfDoc_; 204 1.1.1.3 christos }; 205 1.1 kardel 206 1.1 kardel 207 1.1.1.3 christos flag = { 208 1.1.1.3 christos name = timeout; 209 1.1.1.3 christos value = t; 210 1.1.1.3 christos descrip = "The number of seconds to wait for responses"; 211 1.1.1.3 christos arg-type = number; 212 1.1.1.3 christos arg-name = "seconds"; 213 1.1.1.3 christos arg-default = 5; 214 1.1.1.3 christos doc = <<- _EndOfDoc_ 215 1.1.1.3 christos When waiting for a reply, @code{sntp} will wait the number 216 1.1.1.3 christos of seconds specified before giving up. The default should be 217 1.1.1.3 christos more than enough for a unicast response. If @code{sntp} is 218 1.1.1.3 christos only waiting for a broadcast response a longer timeout is 219 1.1.1.3 christos likely needed. 220 1.1 kardel _EndOfDoc_; 221 1.1 kardel }; 222 1.1 kardel 223 1.1.1.3 christos flag = { 224 1.1.1.3 christos name = "wait"; 225 1.1.1.3 christos descrip = "Wait for pending replies (if not setting the time)"; 226 1.1.1.3 christos disable = no; 227 1.1.1.3 christos enabled; 228 1.1.1.3 christos settable; 229 1.1.1.3 christos doc = <<- _EndOfDoc_ 230 1.1.1.3 christos If we are not setting the time, wait for all pending responses. 231 1.1.1.3 christos _EndOfDoc_; 232 1.1.1.3 christos }; 233 1.1 kardel 234 1.1.1.2 kardel /* explain: Additional information whenever the usage routine is invoked */ 235 1.1.1.2 kardel explain = <<- _END_EXPLAIN 236 1.1.1.2 kardel _END_EXPLAIN; 237 1.1 kardel 238 1.1.1.3 christos doc-section = { 239 1.1.1.3 christos ds-type = 'DESCRIPTION'; 240 1.1.1.3 christos ds-format = 'mdoc'; 241 1.1.1.3 christos ds-text = <<- _END_PROG_MDOC_DESCRIP 242 1.1.1.3 christos .Nm 243 1.1.1.3 christos can be used as an SNTP client to query a NTP or SNTP server and either display 244 1.1 kardel the time or set the local system's time (given suitable privilege). It can be 245 1.1.1.3 christos run as an interactive command or from a 246 1.1.1.3 christos .Ic cron 247 1.1 kardel job. 248 1.1 kardel 249 1.1 kardel NTP (the Network Time Protocol) and SNTP (the Simple Network Time Protocol) 250 1.1.1.2 kardel are defined and described by RFC 5905. 251 1.1 kardel 252 1.1.1.3 christos .Pp 253 1.1 kardel The default is to write the estimated correct local date and time (i.e. not 254 1.1.1.3 christos UTC) to the standard output in a format like: 255 1.1.1.2 kardel 256 1.1.1.3 christos .Ic "'1996-10-15 20:17:25.123 (+0800) +4.567 +/- 0.089 [host] IP sN'" 257 1.1.1.2 kardel 258 1.1.1.2 kardel where the 259 1.1.1.3 christos .Ic "'(+0800)'" 260 1.1.1.3 christos means that to get to UTC from the reported local time one must 261 1.1.1.3 christos add 8 hours and 0 minutes, 262 1.1.1.3 christos the 263 1.1.1.3 christos .Ic "'+4.567'" 264 1.1.1.2 kardel indicates the local clock is 4.567 seconds behind the correct time 265 1.1.1.3 christos (so 4.567 seconds must be added to the local clock to get it to be correct). 266 1.1.1.3 christos Note that the number of decimals printed for this value will change 267 1.1.1.3 christos based on the reported precision of the server. 268 1.1.1.3 christos .Ic "'+/- 0.089'" 269 1.1.1.3 christos is the reported 270 1.1.1.3 christos .Em synchronization distance 271 1.1.1.3 christos (in seconds), which represents the maximum error due to all causes. 272 1.1.1.3 christos If the server does not report valid data needed to calculate the 273 1.1.1.3 christos synchronization distance, this will be reported as 274 1.1.1.3 christos .Ic "'+/- ?'" . 275 1.1.1.3 christos If the 276 1.1.1.3 christos .Em host 277 1.1.1.3 christos is different from the 278 1.1.1.3 christos .Em IP , 279 1.1.1.3 christos both will be displayed. 280 1.1.1.3 christos Otherwise, only the 281 1.1.1.3 christos .Em IP 282 1.1.1.3 christos is displayed. 283 1.1.1.3 christos Finally, the 284 1.1.1.3 christos .Em stratum 285 1.1.1.5 christos of the host is reported 286 1.1.1.5 christos and the leap indicator is decoded and displayed. 287 1.1.1.3 christos _END_PROG_MDOC_DESCRIP; 288 1.1.1.3 christos }; 289 1.1.1.3 christos 290 1.1.1.3 christos doc-section = { 291 1.1.1.3 christos ds-type = 'USAGE'; 292 1.1.1.3 christos ds-format = 'mdoc'; 293 1.1.1.3 christos ds-text = <<- _END_MDOC_USAGE 294 1.1.1.3 christos .Bl -tag -width indent 295 1.1.1.3 christos .It Li "sntp ntpserver.somewhere" 296 1.1.1.3 christos is the simplest use of this program 297 1.1.1.3 christos and can be run as an unprivileged command 298 1.1.1.3 christos to check the current time and error in the local clock. 299 1.1.1.5 christos .It Li "sntp -Ss -M 128 ntpserver.somewhere" 300 1.1.1.3 christos With suitable privilege, 301 1.1.1.3 christos run as a command 302 1.1.1.3 christos or from a 303 1.1.1.3 christos .Xr cron 8 304 1.1.1.3 christos job, 305 1.1.1.5 christos .Ic "sntp -Ss -M 128 ntpserver.somewhere" 306 1.1.1.5 christos will request the time from the server, 307 1.1.1.5 christos and if that server reports that it is synchronized 308 1.1.1.5 christos then if the offset adjustment is less than 128 milliseconds 309 1.1.1.5 christos the correction will be slewed, 310 1.1.1.5 christos and if the correction is more than 128 milliseconds 311 1.1.1.5 christos the correction will be stepped. 312 1.1.1.5 christos .It Li "sntp -S ntpserver.somewhere" 313 1.1.1.5 christos With suitable privilege, 314 1.1.1.5 christos run as a command 315 1.1.1.5 christos or from a 316 1.1.1.5 christos .Xr cron 8 317 1.1.1.5 christos job, 318 1.1.1.5 christos .Ic "sntp -S ntpserver.somewhere" 319 1.1.1.5 christos will set (step) the local clock from a synchronized specified server, 320 1.1.1.3 christos like the (deprecated) 321 1.1.1.3 christos .Xr ntpdate 1ntpdatemdoc , 322 1.1.1.3 christos or 323 1.1.1.3 christos .Xr rdate 8 324 1.1.1.3 christos commands. 325 1.1.1.3 christos .El 326 1.1.1.3 christos _END_MDOC_USAGE; 327 1.1.1.3 christos }; 328 1.1.1.3 christos 329 1.1.1.3 christos doc-section = { 330 1.1.1.3 christos ds-type = 'AUTHORS'; 331 1.1.1.3 christos ds-format = 'mdoc'; 332 1.1.1.3 christos ds-text = <<- _END_MDOC_AUTHORS 333 1.1.1.3 christos .An "Johannes Maximilian Kuehn" 334 1.1.1.3 christos .An "Harlan Stenn" 335 1.1.1.3 christos .An "Dave Hart" 336 1.1.1.3 christos _END_MDOC_AUTHORS; 337 1.1.1.3 christos }; 338