diff options
-rw-r--r-- | bin/date/date.1 | 21 | ||||
-rw-r--r-- | bin/date/date.c | 81 | ||||
-rw-r--r-- | bin/date/netdate.c | 200 |
3 files changed, 34 insertions, 268 deletions
diff --git a/bin/date/date.1 b/bin/date/date.1 index f15119a..e8817ec 100644 --- a/bin/date/date.1 +++ b/bin/date/date.1 @@ -41,7 +41,6 @@ .Sh SYNOPSIS .Nm .Op Fl ajnu -.Op Fl d Ar date .Op Fl r Ar seconds .Op Cm + Ns Ar format .Sm off @@ -70,29 +69,9 @@ maintaining it as a monotonically increasing function. .Fl a implies .Fl n . -.It Fl d Ar date -Parse the provided human-described date and time and display the result without -actually changing the system clock. -(See -.Xr parsedate 3 -for examples.) .It Fl j Parse the provided canonical representation of date and time (described below) and display the result without actually changing the system clock. -.It Fl n -The utility -.Xr timed 8 -is used to synchronize the clocks on groups of machines. -By default, if -.Xr timed 8 -is running, -.Nm -will set the time on all of the machines in the local group. -The -.Fl n -option stops -.Nm -from setting the time for other than the current machine. .It Fl r Ar seconds Print out the date and time that is .Ar seconds diff --git a/bin/date/date.c b/bin/date/date.c index a067457..313a7f1 100644 --- a/bin/date/date.c +++ b/bin/date/date.c @@ -29,21 +29,6 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> -#ifndef lint -__COPYRIGHT( -"@(#) Copyright (c) 1985, 1987, 1988, 1993\ - The Regents of the University of California. All rights reserved."); -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)date.c 8.2 (Berkeley) 4/28/95"; -#else -__RCSID("$NetBSD: date.c,v 1.61 2014/09/01 21:42:21 dholland Exp $"); -#endif -#endif /* not lint */ - #include <sys/param.h> #include <sys/time.h> @@ -54,21 +39,24 @@ __RCSID("$NetBSD: date.c,v 1.61 2014/09/01 21:42:21 dholland Exp $"); #include <locale.h> #include <stdio.h> #include <stdlib.h> +#include <bsd/stdlib.h> #include <string.h> #include <syslog.h> #include <time.h> -#include <tzfile.h> #include <unistd.h> -#include <util.h> +#include <utmpx.h> +#include <stdbool.h> #include "extern.h" +#define TM_YEAR_BASE 1900 + static time_t tval; static int aflag, jflag, rflag, nflag; -__dead static void badcanotime(const char *, const char *, size_t); +static void badcanotime(const char *, const char *, size_t); static void setthetime(const char *); -__dead static void usage(void); +static void usage(void); int main(int argc, char *argv[]) @@ -83,26 +71,15 @@ main(int argc, char *argv[]) setprogname(argv[0]); (void)setlocale(LC_ALL, ""); - while ((ch = getopt(argc, argv, "ad:jnr:u")) != -1) { + while ((ch = getopt(argc, argv, "a:jnr:u")) != -1) { switch (ch) { case 'a': /* adjust time slowly */ aflag = 1; nflag = 1; break; - case 'd': - rflag = 1; - tval = parsedate(optarg, NULL, NULL); - if (tval == -1) { - errx(EXIT_FAILURE, - "%s: Unrecognized date format", optarg); - } - break; case 'j': /* don't set time */ jflag = 1; break; - case 'n': /* don't set network */ - nflag = 1; - break; case 'r': /* user specified seconds */ if (optarg[0] == '\0') { errx(EXIT_FAILURE, "<empty>: Invalid number"); @@ -165,6 +142,18 @@ bad: err(EXIT_FAILURE, "Cannot allocate format buffer"); } +static inline bool +isleap(int year) { + if ((year % 100) == 0) { + if ((year % 400) != 0) { + return false; + } + } else if (year % 4) { + return false; + } + return true; +} + static void badcanotime(const char *msg, const char *val, size_t where) { @@ -330,22 +319,20 @@ setthetime(const char *p) } /* set the time */ - if (nflag || netsettime(new_time)) { - logwtmp("|", "date", ""); - if (aflag) { - tv.tv_sec = new_time - tval; - tv.tv_usec = 0; - if (adjtime(&tv, NULL)) - err(EXIT_FAILURE, "adjtime"); - } else { - tval = new_time; - tv.tv_sec = tval; - tv.tv_usec = 0; - if (settimeofday(&tv, NULL)) - err(EXIT_FAILURE, "settimeofday"); - } - logwtmp("{", "date", ""); + logwtmp("|", "date", ""); + if (aflag) { + tv.tv_sec = new_time - tval; + tv.tv_usec = 0; + if (adjtime(&tv, NULL)) + err(EXIT_FAILURE, "adjtime"); + } else { + tval = new_time; + tv.tv_sec = tval; + tv.tv_usec = 0; + if (settimeofday(&tv, NULL)) + err(EXIT_FAILURE, "settimeofday"); } + logwtmp("{", "date", ""); if ((p = getlogin()) == NULL) p = "???"; @@ -356,7 +343,7 @@ static void usage(void) { (void)fprintf(stderr, - "Usage: %s [-ajnu] [-d date] [-r seconds] [+format]", + "Usage: %s [-aju] [-r seconds] [+format]", getprogname()); (void)fprintf(stderr, " [[[[[[CC]yy]mm]dd]HH]MM[.SS]]\n"); exit(EXIT_FAILURE); diff --git a/bin/date/netdate.c b/bin/date/netdate.c deleted file mode 100644 index 5b5857c..0000000 --- a/bin/date/netdate.c +++ /dev/null @@ -1,200 +0,0 @@ -/* $NetBSD: netdate.c,v 1.30 2011/01/29 02:16:52 christos Exp $ */ - -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -#ifndef lint -#if 0 -static char sccsid[] = "@(#)netdate.c 8.2 (Berkeley) 4/28/95"; -#else -__RCSID("$NetBSD: netdate.c,v 1.30 2011/01/29 02:16:52 christos Exp $"); -#endif -#endif /* not lint */ - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netdb.h> -#define TSPTYPES -#include <protocols/timed.h> - -#include <err.h> -#include <errno.h> -#include <poll.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "extern.h" - -#define WAITACK 2000 /* milliseconds */ -#define WAITDATEACK 5000 /* milliseconds */ - -static const char * -tsp_type_to_string(const struct tsp *msg) -{ - unsigned i; - - i = msg->tsp_type; - return i < TSPTYPENUMBER ? tsptype[i] : "unknown"; -} - -/* - * Set the date in the machines controlled by timedaemons by communicating the - * new date to the local timedaemon. If the timedaemon is in the master state, - * it performs the correction on all slaves. If it is in the slave state, it - * notifies the master that a correction is needed. - * Returns 0 on success. Returns > 0 on failure. - */ -int -netsettime(time_t tval) -{ - struct sockaddr_in dest; - struct tsp msg; - char hostname[MAXHOSTNAMELEN]; - struct servent *sp; - struct pollfd ready; - int found, s, timed_ack, waittime; - - if ((sp = getservbyname("timed", "udp")) == NULL) { - warnx("udp/timed: unknown service"); - return 2; - } - - (void)memset(&dest, 0, sizeof(dest)); -#ifdef BSD4_4 - dest.sin_len = sizeof(dest); -#endif - dest.sin_family = AF_INET; - dest.sin_port = sp->s_port; - dest.sin_addr.s_addr = htonl(INADDR_ANY); - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s == -1) { - if (errno != EAFNOSUPPORT) - warn("timed"); - return 2; - } - -#ifdef IP_PORTRANGE - { - static const int on = IP_PORTRANGE_LOW; - - if (setsockopt(s, IPPROTO_IP, IP_PORTRANGE, &on, - sizeof(on)) == -1) { - warn("setsockopt"); - goto bad; - } - } -#endif - - msg.tsp_type = TSP_SETDATE; - msg.tsp_vers = TSPVERSION; - if (gethostname(hostname, sizeof(hostname)) == -1) { - warn("gethostname"); - goto bad; - } - (void)strlcpy(msg.tsp_name, hostname, sizeof(msg.tsp_name)); - msg.tsp_seq = htons((in_port_t)0); - msg.tsp_time.tv_sec = htonl((in_addr_t)tval); /* XXX: y2038 */ - msg.tsp_time.tv_usec = htonl((in_addr_t)0); - if (connect(s, (const void *)&dest, sizeof(dest)) == -1) { - warn("connect"); - goto bad; - } - if (send(s, &msg, sizeof(msg), 0) == -1) { - if (errno != ECONNREFUSED) - warn("send"); - goto bad; - } - - timed_ack = -1; - waittime = WAITACK; - ready.fd = s; - ready.events = POLLIN; -loop: - found = poll(&ready, 1, waittime); - - { - socklen_t len; - int error; - - len = sizeof(error); - if (getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len) == -1) { - warn("getsockopt"); - goto bad; - } - if (error) { - if (error != ECONNREFUSED) { - errno = error; - warn("send (delayed error)"); - } - goto bad; - } - } - - if (found > 0 && ready.revents & POLLIN) { - ssize_t ret; - - if ((ret = recv(s, &msg, sizeof(msg), 0)) == -1) { - if (errno != ECONNREFUSED) - warn("recv"); - goto bad; - } else if ((size_t)ret < sizeof(msg)) { - warnx("recv: incomplete packet"); - goto bad; - } - - msg.tsp_seq = ntohs(msg.tsp_seq); - msg.tsp_time.tv_sec = ntohl(msg.tsp_time.tv_sec); - msg.tsp_time.tv_usec = ntohl(msg.tsp_time.tv_usec); - switch (msg.tsp_type) { - case TSP_ACK: - timed_ack = TSP_ACK; - waittime = WAITDATEACK; - goto loop; - case TSP_DATEACK: - (void)close(s); - return 0; - default: - warnx("wrong ack received from timed: %s", - tsp_type_to_string(&msg)); - timed_ack = -1; - break; - } - } - if (timed_ack == -1) - warnx("can't reach time daemon, time set locally"); - -bad: - (void)close(s); - return 2; -} |