mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-05 09:14:03 +00:00
Merge changes from vendor branch (tzcode1999a), plus the following additional
changes: - Finish migrating zic to its own private.h. - Fix zic.8 so that it really is written in -mdoc. - Add four new flags to zic (&document): -D don't create directories -u change ownership of newly-created files to user -g change ownership of newly-created files to group -m change mode of newly-created files to modespec These, once proven, can be used to clean up the installation. Obtained from: ftp://elsie.nci.nih.gov/pub/tzcode1999a.tar.gz (partially)
This commit is contained in:
parent
32b2240b31
commit
5b7f6bf978
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=42997
@ -1,5 +1,4 @@
|
||||
# $Id$
|
||||
# $Id: Makefile,v 1.4 1999/01/21 17:12:48 wollman Exp $
|
||||
SUBDIR= zic zdump
|
||||
|
||||
.include <bsd.subdir.mk>
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
#ifndef lint
|
||||
#ifndef NOID
|
||||
static char elsieid[] = "@(#)ialloc.c 8.28";
|
||||
static char elsieid[] = "@(#)ialloc.c 8.29";
|
||||
#endif /* !defined NOID */
|
||||
#endif /* !defined lint */
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$Id$";
|
||||
"$Id: ialloc.c,v 1.4 1999/01/21 17:12:49 wollman Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*LINTLIBRARY*/
|
||||
@ -15,13 +15,6 @@ static const char rcsid[] =
|
||||
|
||||
#define nonzero(n) (((n) == 0) ? 1 : (n))
|
||||
|
||||
char * icalloc P((int nelem, int elsize));
|
||||
char * icatalloc P((char * old, const char * new));
|
||||
char * icpyalloc P((const char * string));
|
||||
char * imalloc P((int n));
|
||||
void * irealloc P((void * pointer, int size));
|
||||
void ifree P((char * pointer));
|
||||
|
||||
char *
|
||||
imalloc(n)
|
||||
const int n;
|
||||
|
@ -7,6 +7,15 @@
|
||||
** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
|
||||
*/
|
||||
|
||||
/*
|
||||
* FreeBSD modifications: separate libc's privates from zic's.
|
||||
* This makes it easier when we need to update one but not the other.
|
||||
* I have removed all of the ifdef spaghetti which is not relevant to
|
||||
* zic from this file.
|
||||
*
|
||||
* $Id: private.h,v 1.2 1999/01/21 17:12:49 wollman Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
** This header is for use ONLY with the time conversion code.
|
||||
** There is no guarantee that it will remain unchanged,
|
||||
@ -30,20 +39,12 @@ static char privatehid[] = "@(#)private.h 7.48";
|
||||
** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_ADJTIME
|
||||
#define HAVE_ADJTIME 1
|
||||
#endif /* !defined HAVE_ADJTIME */
|
||||
|
||||
#ifndef HAVE_GETTEXT
|
||||
#define HAVE_GETTEXT 0
|
||||
#endif /* !defined HAVE_GETTEXT */
|
||||
|
||||
#ifndef HAVE_SETTIMEOFDAY
|
||||
#define HAVE_SETTIMEOFDAY 3
|
||||
#endif /* !defined HAVE_SETTIMEOFDAY */
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
#define HAVE_STRERROR 0
|
||||
#define HAVE_STRERROR 1
|
||||
#endif /* !defined HAVE_STRERROR */
|
||||
|
||||
#ifndef HAVE_SYMLINK
|
||||
@ -54,14 +55,6 @@ static char privatehid[] = "@(#)private.h 7.48";
|
||||
#define HAVE_UNISTD_H 1
|
||||
#endif /* !defined HAVE_UNISTD_H */
|
||||
|
||||
#ifndef HAVE_UTMPX_H
|
||||
#define HAVE_UTMPX_H 0
|
||||
#endif /* !defined HAVE_UTMPX_H */
|
||||
|
||||
#ifndef LOCALE_HOME
|
||||
#define LOCALE_HOME "/usr/lib/locale"
|
||||
#endif /* !defined LOCALE_HOME */
|
||||
|
||||
/*
|
||||
** Nested includes
|
||||
*/
|
||||
@ -94,87 +87,7 @@ static char privatehid[] = "@(#)private.h 7.48";
|
||||
/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
|
||||
#define is_digit(c) ((unsigned)(c) - '0' <= 9)
|
||||
|
||||
/*
|
||||
** Workarounds for compilers/systems.
|
||||
*/
|
||||
|
||||
/*
|
||||
** SunOS 4.1.1 cc lacks const.
|
||||
*/
|
||||
|
||||
#ifndef const
|
||||
#ifndef __STDC__
|
||||
#define const
|
||||
#endif /* !defined __STDC__ */
|
||||
#endif /* !defined const */
|
||||
|
||||
/*
|
||||
** SunOS 4.1.1 cc lacks prototypes.
|
||||
*/
|
||||
|
||||
#ifndef P
|
||||
#ifdef __STDC__
|
||||
#define P(x) x
|
||||
#endif /* defined __STDC__ */
|
||||
#ifndef __STDC__
|
||||
#define P(x) ()
|
||||
#endif /* !defined __STDC__ */
|
||||
#endif /* !defined P */
|
||||
|
||||
/*
|
||||
** SunOS 4.1.1 headers lack EXIT_SUCCESS.
|
||||
*/
|
||||
|
||||
#ifndef EXIT_SUCCESS
|
||||
#define EXIT_SUCCESS 0
|
||||
#endif /* !defined EXIT_SUCCESS */
|
||||
|
||||
/*
|
||||
** SunOS 4.1.1 headers lack EXIT_FAILURE.
|
||||
*/
|
||||
|
||||
#ifndef EXIT_FAILURE
|
||||
#define EXIT_FAILURE 1
|
||||
#endif /* !defined EXIT_FAILURE */
|
||||
|
||||
/*
|
||||
** SunOS 4.1.1 headers lack FILENAME_MAX.
|
||||
*/
|
||||
|
||||
#ifndef FILENAME_MAX
|
||||
|
||||
#ifndef MAXPATHLEN
|
||||
#ifdef unix
|
||||
#include "sys/param.h"
|
||||
#endif /* defined unix */
|
||||
#endif /* !defined MAXPATHLEN */
|
||||
|
||||
#ifdef MAXPATHLEN
|
||||
#define FILENAME_MAX MAXPATHLEN
|
||||
#endif /* defined MAXPATHLEN */
|
||||
#ifndef MAXPATHLEN
|
||||
#define FILENAME_MAX 1024 /* Pure guesswork */
|
||||
#endif /* !defined MAXPATHLEN */
|
||||
|
||||
#endif /* !defined FILENAME_MAX */
|
||||
|
||||
/*
|
||||
** SunOS 4.1.1 libraries lack remove.
|
||||
*/
|
||||
|
||||
#ifndef remove
|
||||
extern int unlink P((const char * filename));
|
||||
#define remove unlink
|
||||
#endif /* !defined remove */
|
||||
|
||||
/*
|
||||
** Some ancient errno.h implementations don't declare errno.
|
||||
** But some newer errno.h implementations define it as a macro.
|
||||
** Fix the former without affecting the latter.
|
||||
*/
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif /* !defined errno */
|
||||
#define P(x) x
|
||||
|
||||
/*
|
||||
** Private function declarations.
|
||||
@ -188,7 +101,6 @@ void icfree P((char * pointer));
|
||||
void ifree P((char * pointer));
|
||||
char * scheck P((const char *string, const char *format));
|
||||
|
||||
|
||||
/*
|
||||
** Finally, some convenience items.
|
||||
*/
|
||||
|
@ -1,25 +1,22 @@
|
||||
#ifndef lint
|
||||
#ifndef NOID
|
||||
static char elsieid[] = "@(#)scheck.c 8.13";
|
||||
static char elsieid[] = "@(#)scheck.c 8.15";
|
||||
#endif /* !defined lint */
|
||||
#endif /* !defined NOID */
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$Id$";
|
||||
"$Id: scheck.c,v 1.3 1999/01/21 17:12:49 wollman Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*LINTLIBRARY*/
|
||||
|
||||
#include "private.h"
|
||||
|
||||
extern char * imalloc P((int n));
|
||||
extern void ifree P((char * p));
|
||||
|
||||
char *
|
||||
scheck(string, format)
|
||||
const char * const string;
|
||||
char * const format;
|
||||
const char * const format;
|
||||
{
|
||||
register char * fbuf;
|
||||
register const char * fp;
|
||||
|
@ -1,12 +1,12 @@
|
||||
#ifndef lint
|
||||
#ifndef NOID
|
||||
static char elsieid[] = "@(#)zdump.c 7.24";
|
||||
static char elsieid[] = "@(#)zdump.c 7.28";
|
||||
#endif /* !defined NOID */
|
||||
#endif /* !defined lint */
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$Id$";
|
||||
"$Id: zdump.c,v 1.5 1999/01/21 17:12:49 wollman Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -118,15 +118,24 @@ static const char rcsid[] =
|
||||
#define TZ_DOMAIN "tz"
|
||||
#endif /* !defined TZ_DOMAIN */
|
||||
|
||||
#ifndef P
|
||||
#ifdef __STDC__
|
||||
#define P(x) x
|
||||
#endif /* defined __STDC__ */
|
||||
#ifndef __STDC__
|
||||
#define P(x) ()
|
||||
#endif /* !defined __STDC__ */
|
||||
#endif /* !defined P */
|
||||
|
||||
extern char ** environ;
|
||||
extern char * tzname[2];
|
||||
|
||||
static char * abbr();
|
||||
static long delta();
|
||||
static time_t hunt();
|
||||
static int longest;
|
||||
static void show();
|
||||
static void usage __P((void));
|
||||
static char * abbr P((struct tm * tmp));
|
||||
static long delta P((struct tm * newp, struct tm * oldp));
|
||||
static time_t hunt P((char * name, time_t lot, time_t hit));
|
||||
static size_t longest;
|
||||
static char * progname;
|
||||
static void show P((char * zone, time_t t, int v));
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
@ -161,7 +170,7 @@ char * argv[];
|
||||
if (c == 'v')
|
||||
vflag = 1;
|
||||
else cutoff = optarg;
|
||||
if (c != EOF ||
|
||||
if ((c != EOF && c != -1) ||
|
||||
(optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
|
||||
usage();
|
||||
}
|
||||
@ -327,8 +336,6 @@ struct tm * oldp;
|
||||
return result;
|
||||
}
|
||||
|
||||
extern struct tm * localtime();
|
||||
|
||||
static void
|
||||
show(zone, t, v)
|
||||
char * zone;
|
||||
@ -337,9 +344,9 @@ int v;
|
||||
{
|
||||
struct tm * tmp;
|
||||
|
||||
(void) printf("%-*s ", longest, zone);
|
||||
(void) printf("%-*s ", (int) longest, zone);
|
||||
if (v)
|
||||
(void) printf("%.24s GMT = ", asctime(gmtime(&t)));
|
||||
(void) printf("%.24s UTC = ", asctime(gmtime(&t)));
|
||||
tmp = localtime(&t);
|
||||
(void) printf("%.24s", asctime(tmp));
|
||||
if (*abbr(tmp) != '\0')
|
||||
|
@ -1,3 +1,4 @@
|
||||
.\" $Id: zic.8,v 1.8 1999/01/21 17:12:49 wollman Exp $
|
||||
.Dd
|
||||
.Dt ZIC 8
|
||||
.Os
|
||||
@ -6,12 +7,14 @@
|
||||
.Nd timezone compiler
|
||||
.Sh SYNOPSIS
|
||||
.Nm zic
|
||||
.Op Fl v
|
||||
.Op Fl Dsv
|
||||
.Op Fl d Ar directory
|
||||
.Op Fl l Ar localtime
|
||||
.Op Fl p Ar posixrules
|
||||
.Op Fl g Ar group
|
||||
.Op Fl L Ar leapsecondfilename
|
||||
.Op Fl s
|
||||
.Op Fl l Ar localtime
|
||||
.Op Fl m Ar mode
|
||||
.Op Fl p Ar posixrules
|
||||
.Op Fl u Ar user
|
||||
.Op Fl y Ar command
|
||||
.Op Ar filename ...
|
||||
.Sh DESCRIPTION
|
||||
@ -26,18 +29,47 @@ the standard input is read.
|
||||
.Pp
|
||||
The following options are available:
|
||||
.Bl -tag -width indent
|
||||
.It Fl D
|
||||
Do not automatically create directories. If the input file(s) specify
|
||||
an output file in a directory which does not already exist, the
|
||||
default behavior is to attempt to create the directory. If
|
||||
.Fl D
|
||||
is specified,
|
||||
.Nm zic
|
||||
will instead error out immediately.
|
||||
.It Fl d Ar directory
|
||||
Create time conversion information files in the named directory rather than
|
||||
in the standard directory named below.
|
||||
.It Fl l Ar timezone
|
||||
.It Fl g Ar group
|
||||
After creating each output file, change its group ownership to the
|
||||
specified
|
||||
.Ar group
|
||||
(which can be either a name or a numeric group ID).
|
||||
.It Fl L Ar leapsecondfilename
|
||||
Read leap second information from the file with the given name.
|
||||
If this option is not used,
|
||||
no leap second information appears in output files.
|
||||
.It Fl l Ar timezone
|
||||
Use the given
|
||||
.Ar time zone
|
||||
as local time.
|
||||
.Nm Zic
|
||||
will act as if the input contained a link line of the form
|
||||
.sp
|
||||
.ti +.5i
|
||||
Link \fItimezone\fP localtime
|
||||
.Bd -literal -offset indent
|
||||
Link timezone localtime
|
||||
.Ed
|
||||
(Note that this action has no effect on
|
||||
.Fx ,
|
||||
since the local time zone is specified in
|
||||
.Pa /etc/localtime
|
||||
and not
|
||||
.Pa /usr/share/zoneinfo/localtime . )
|
||||
.It Fl m Ar mode
|
||||
After creating each output file, change its access mode to
|
||||
.Ar mode .
|
||||
Both numeric and alphabetic modes are accepted
|
||||
(see
|
||||
.Xr chmod 1 ) .
|
||||
.It Fl p Ar timezone
|
||||
Use the given
|
||||
.Ar "time zone" Ns 's
|
||||
@ -45,13 +77,13 @@ rules when handling POSIX-format
|
||||
time zone environment variables.
|
||||
.Nm Zic
|
||||
will act as if the input contained a link line of the form
|
||||
.sp
|
||||
.ti +.5i
|
||||
Link \fItimezone\fP posixrules
|
||||
.It Fl L Ar leapsecondfilename
|
||||
Read leap second information from the file with the given name.
|
||||
If this option is not used,
|
||||
no leap second information appears in output files.
|
||||
.Bd -literal -offset indent
|
||||
Link timezone posixrules
|
||||
.Ed
|
||||
.It Fl u Ar user
|
||||
After creating each output file, change its owner to
|
||||
.Ar user
|
||||
(which can be either a name or a numeric user ID).
|
||||
.It Fl v
|
||||
Complain if a year that appears in a data file is outside the range
|
||||
of years representable by
|
||||
@ -80,21 +112,13 @@ Any line that is blank (after comment stripping) is ignored.
|
||||
Non-blank lines are expected to be of one of three types:
|
||||
rule lines, zone lines, and link lines.
|
||||
.Pp
|
||||
A rule line has the form
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'TYPE\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
|
||||
.sp
|
||||
Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
.sp
|
||||
A rule line has the form:
|
||||
.Dl Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
For example:
|
||||
.ti +.5i
|
||||
.sp
|
||||
Rule US 1967 1973 \- Apr lastSun 2:00 1:00 D
|
||||
.sp
|
||||
.fi
|
||||
.Dl Rule US 1967 1973 \- Apr lastSun 2:00 1:00 D
|
||||
.Pp
|
||||
The fields that make up a rule line are:
|
||||
.Bl -tag -width indent
|
||||
.Bl -tag -width "LETTER/S" -offset indent
|
||||
.It NAME
|
||||
Give the (arbitrary) name of the set of rules this rule is part of.
|
||||
.It FROM
|
||||
@ -138,9 +162,7 @@ If
|
||||
is something else, then
|
||||
.Nm
|
||||
executes the command
|
||||
.ti +.5i
|
||||
\fByearistype\fP \fIyear\fP \fItype\fP
|
||||
.br
|
||||
.Li yearistype Ar year Ar type
|
||||
to check the type of a year:
|
||||
an exit status of zero is taken to mean that the year is of the given type;
|
||||
an exit status of one is taken to mean that the year is not of the given type.
|
||||
@ -150,18 +172,20 @@ Month names may be abbreviated.
|
||||
.It ON
|
||||
Give the day on which the rule takes effect.
|
||||
Recognized forms include:
|
||||
.nf
|
||||
.in +.5i
|
||||
.sp
|
||||
.ta \w'Sun<=25\0\0'u
|
||||
5 the fifth of the month
|
||||
lastSun the last Sunday in the month
|
||||
lastMon the last Monday in the month
|
||||
Sun>=8 first Sunday on or after the eighth
|
||||
Sun<=25 last Sunday on or before the 25th
|
||||
.fi
|
||||
.in -.5i
|
||||
.sp
|
||||
.Pp
|
||||
.Bl -tag -width lastSun -compact -offset indent
|
||||
.It \&5
|
||||
the fifth of the month
|
||||
.It lastSun
|
||||
the last Sunday in the month
|
||||
.It lastMon
|
||||
the last Monday in the month
|
||||
.It Sun>=8
|
||||
first Sunday on or after the eighth
|
||||
.It Sun<=25
|
||||
last Sunday on or before the 25th
|
||||
.El
|
||||
.Pp
|
||||
Names of days of the week may be abbreviated or spelled out in full.
|
||||
Note that there must be no spaces within the
|
||||
.Em ON
|
||||
@ -169,31 +193,34 @@ field.
|
||||
.It AT
|
||||
Give the time of day at which the rule takes effect.
|
||||
Recognized forms include:
|
||||
.nf
|
||||
.in +.5i
|
||||
.sp
|
||||
.ta \w'1:28:13\0\0'u
|
||||
2 time in hours
|
||||
2:00 time in hours and minutes
|
||||
15:00 24-hour format time (for times after noon)
|
||||
1:28:14 time in hours, minutes, and seconds
|
||||
.fi
|
||||
.in -.5i
|
||||
.sp
|
||||
.Pp
|
||||
.Bl -tag -width "1:28:14" -offset indent -compact
|
||||
.It 2
|
||||
time in hours
|
||||
.It 2:00
|
||||
time in hours and minutes
|
||||
.It 15:00
|
||||
24-hour format time (for times after noon)
|
||||
.It 1:28:14
|
||||
time in hours, minutes, and seconds
|
||||
.El
|
||||
.Pp
|
||||
where hour 0 is midnight at the start of the day,
|
||||
and hour 24 is midnight at the end of the day.
|
||||
Any of these forms may be followed by the letter
|
||||
.Em w
|
||||
.Sq Li w
|
||||
if the given time is local
|
||||
.Dq "wall clock"
|
||||
time,
|
||||
.Em s
|
||||
.Sq Li s
|
||||
if the given time is local
|
||||
.Dq standard
|
||||
time, or
|
||||
.Em u
|
||||
.Sq Li u
|
||||
(or
|
||||
.Em g
|
||||
.Sq Li g
|
||||
or
|
||||
.Em z )
|
||||
.Sq Li z )
|
||||
if the given time is universal time;
|
||||
in the absence of an indicator,
|
||||
wall clock time is assumed.
|
||||
@ -204,9 +231,9 @@ This field has the same format as the
|
||||
.Em AT
|
||||
field
|
||||
(although, of course, the
|
||||
.Em w
|
||||
.Sq Li w
|
||||
and
|
||||
.Em s
|
||||
.Sq Li s
|
||||
suffixes are not used).
|
||||
.It LETTER/S
|
||||
Give the
|
||||
@ -225,19 +252,10 @@ If this field is
|
||||
the variable part is null.
|
||||
.El
|
||||
.Pp
|
||||
A zone line has the form
|
||||
.sp
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Zone\0\0'u +\w'Australia/Adelaide\0\0'u +\w'GMTOFF\0\0'u +\w'RULES/SAVE\0\0'u +\w'FORMAT\0\0'u
|
||||
Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
|
||||
.sp
|
||||
A zone line has the form:
|
||||
.Dl Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
|
||||
For example:
|
||||
.sp
|
||||
.ti +.5i
|
||||
Zone Australia/Adelaide 9:30 Aus CST 1971 Oct 31 2:00
|
||||
.sp
|
||||
.fi
|
||||
.Dl Zone Australia/Adelaide 9:30 Aus CST 1971 Oct 31 2:00
|
||||
The fields that make up a zone line are:
|
||||
.Bl -tag -width indent
|
||||
.It NAME
|
||||
@ -245,13 +263,13 @@ The name of the time zone.
|
||||
This is the name used in creating the time conversion information file for the
|
||||
zone.
|
||||
.It GMTOFF
|
||||
The amount of time to add to GMT to get standard time in this zone.
|
||||
The amount of time to add to UTC to get standard time in this zone.
|
||||
This field has the same format as the
|
||||
.Em AT
|
||||
and
|
||||
.Em SAVE
|
||||
fields of rule lines;
|
||||
begin the field with a minus sign if time must be subtracted from GMT.
|
||||
begin the field with a minus sign if time must be subtracted from UTC.
|
||||
.It RULES/SAVE
|
||||
The name of the rule(s) that apply in the time zone or,
|
||||
alternately, an amount of time to add to local standard time.
|
||||
@ -269,11 +287,14 @@ Alternately,
|
||||
a slash (/)
|
||||
separates standard and daylight abbreviations.
|
||||
.It UNTIL
|
||||
The time at which the GMT offset or the rule(s) change for a location.
|
||||
The time at which the UTC offset or the rule(s) change for a location.
|
||||
It is specified as a year, a month, a day, and a time of day.
|
||||
If this is specified,
|
||||
the time zone information is generated from the given GMT offset
|
||||
the time zone information is generated from the given UTC offset
|
||||
and rule change until the time specified.
|
||||
The month, day, and time of day have the same format as the IN, ON, and AT
|
||||
columns of a rule; trailing columns can be omitted, and default to the
|
||||
earliest possible value for the missing columns.
|
||||
.Pp
|
||||
The next line must be a
|
||||
.Dq continuation
|
||||
@ -291,18 +312,9 @@ continuation.
|
||||
.El
|
||||
.Pp
|
||||
A link line has the form
|
||||
.sp
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Link\0\0'u +\w'Europe/Istanbul\0\0'u
|
||||
Link LINK-FROM LINK-TO
|
||||
.sp
|
||||
.Dl Link LINK-FROM LINK-TO
|
||||
For example:
|
||||
.sp
|
||||
.ti +.5i
|
||||
Link Europe/Istanbul Asia/Istanbul
|
||||
.sp
|
||||
.fi
|
||||
.Dl Link Europe/Istanbul Asia/Istanbul
|
||||
The
|
||||
.Em LINK-FROM
|
||||
field should appear as the
|
||||
@ -316,18 +328,9 @@ Except for continuation lines,
|
||||
lines may appear in any order in the input.
|
||||
.Pp
|
||||
Lines in the file that describes leap seconds have the following form:
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Leap\0\0'u +\w'YEAR\0\0'u +\w'MONTH\0\0'u +\w'DAY\0\0'u +\w'HH:MM:SS\0\0'u +\w'CORR\0\0'u
|
||||
.sp
|
||||
Leap YEAR MONTH DAY HH:MM:SS CORR R/S
|
||||
.sp
|
||||
.Dl Leap YEAR MONTH DAY HH:MM:SS CORR R/S
|
||||
For example:
|
||||
.ti +.5i
|
||||
.sp
|
||||
Leap 1974 Dec 31 23:59:60 + S
|
||||
.sp
|
||||
.fi
|
||||
.Dl Leap 1974 Dec 31 23:59:60 + S
|
||||
The
|
||||
.Em YEAR ,
|
||||
.Em MONTH ,
|
||||
@ -360,7 +363,7 @@ The
|
||||
field
|
||||
should be (an abbreviation of)
|
||||
.Dq Stationary
|
||||
if the leap second time given by the other fields should be interpreted as GMT
|
||||
if the leap second time given by the other fields should be interpreted as UTC
|
||||
or
|
||||
(an abbreviation of)
|
||||
.Dq Rolling
|
||||
@ -374,10 +377,11 @@ field of the earliest transition time's rule to ensure that
|
||||
the earliest transition time recorded in the compiled file is correct.
|
||||
.Sh FILE
|
||||
.Bl -tag -width /usr/share/zoneinfo -compact
|
||||
/usr/share/zoneinfo standard directory used for created files
|
||||
.It /usr/share/zoneinfo
|
||||
standard directory used for created files
|
||||
.El
|
||||
.Sh "SEE ALSO"
|
||||
.Xr ctime 3 ,
|
||||
.Xr tzfile 5 ,
|
||||
.Xr zdump 8
|
||||
.\" @(#)zic.8 7.12
|
||||
.\" @(#)zic.8 7.18
|
||||
|
@ -1,12 +1,12 @@
|
||||
#ifndef lint
|
||||
#ifndef NOID
|
||||
static char elsieid[] = "@(#)zic.c 7.77";
|
||||
static char elsieid[] = "@(#)zic.c 7.96";
|
||||
#endif /* !defined NOID */
|
||||
#endif /* !defined lint */
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] =
|
||||
"$Id$";
|
||||
"$Id: zic.c,v 1.8 1999/01/21 17:12:49 wollman Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "private.h"
|
||||
@ -83,18 +83,6 @@ struct zone {
|
||||
time_t z_untiltime;
|
||||
};
|
||||
|
||||
extern int getopt P((int argc, char * const argv[],
|
||||
const char * options));
|
||||
extern char * icatalloc P((char * old, const char * new));
|
||||
extern char * icpyalloc P((const char * string));
|
||||
extern void ifree P((char * p));
|
||||
extern char * imalloc P((int n));
|
||||
extern void * irealloc P((void * old, int n));
|
||||
extern int link P((const char * fromname, const char * toname));
|
||||
extern char * optarg;
|
||||
extern int optind;
|
||||
extern char * scheck P((const char * string, const char * format));
|
||||
|
||||
static void addtt P((time_t starttime, int type));
|
||||
static int addtype P((long gmtoff, const char * abbr, int isdst,
|
||||
int ttisstd, int ttisgmt));
|
||||
@ -137,14 +125,16 @@ static void rulesub P((struct rule * rp,
|
||||
const char * typep, const char * monthp,
|
||||
const char * dayp, const char * timep));
|
||||
static void setboundaries P((void));
|
||||
static void setgroup P((gid_t *flag, const char *name));
|
||||
static void setuser P((uid_t *flag, const char *name));
|
||||
static time_t tadd P((time_t t1, long t2));
|
||||
static void usage P((void));
|
||||
static void writezone P((const char * name));
|
||||
static int yearistype P((int year, const char * type));
|
||||
|
||||
#if !HAVE_STRERROR
|
||||
#if !(HAVE_STRERROR - 0)
|
||||
static char * strerror P((int));
|
||||
#endif /* !HAVE_STRERROR */
|
||||
#endif /* !(HAVE_STRERROR - 0) */
|
||||
|
||||
static int charcnt;
|
||||
static int errors;
|
||||
@ -153,8 +143,10 @@ static int leapcnt;
|
||||
static int linenum;
|
||||
static time_t max_time;
|
||||
static int max_year;
|
||||
static int max_year_representable;
|
||||
static time_t min_time;
|
||||
static int min_year;
|
||||
static int min_year_representable;
|
||||
static int noise;
|
||||
static const char * rfilename;
|
||||
static int rlinenum;
|
||||
@ -376,19 +368,18 @@ char * const ptr;
|
||||
** Error handling.
|
||||
*/
|
||||
|
||||
#if ! HAVE_STRERROR
|
||||
#if !(HAVE_STRERROR - 0)
|
||||
static char *
|
||||
strerror(errnum)
|
||||
int errnum;
|
||||
{
|
||||
extern char *sys_errlist[];
|
||||
extern int sys_nerr;
|
||||
extern char * sys_errlist[];
|
||||
extern int sys_nerr;
|
||||
|
||||
if (errnum > 0 && errnum <= sys_nerr)
|
||||
return sys_errlist[errnum];
|
||||
return "Unknown system error";
|
||||
return (errnum > 0 && errnum <= sys_nerr) ?
|
||||
sys_errlist[errnum] : _("Unknown system error");
|
||||
}
|
||||
#endif /* ! HAVE_STRERROR */
|
||||
#endif /* !(HAVE_STRERROR - 0) */
|
||||
|
||||
static void
|
||||
eats(name, num, rname, rnum)
|
||||
@ -435,9 +426,9 @@ const char * const string;
|
||||
{
|
||||
char * cp;
|
||||
|
||||
cp = ecpyalloc("warning: ");
|
||||
cp = ecpyalloc(_("warning: "));
|
||||
cp = ecatalloc(cp, string);
|
||||
error(string);
|
||||
error(cp);
|
||||
ifree(cp);
|
||||
--errors;
|
||||
}
|
||||
@ -457,6 +448,11 @@ static const char * directory;
|
||||
static const char * leapsec;
|
||||
static const char * yitcommand;
|
||||
static int sflag = FALSE;
|
||||
static int Dflag;
|
||||
static uid_t oflag = (uid_t)-1;
|
||||
static gid_t gflag = (gid_t)-1;
|
||||
static mode_t mflag = (S_IRUSR | S_IRGRP | S_IROTH
|
||||
| S_IWUSR);
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
@ -477,10 +473,13 @@ char * argv[];
|
||||
#endif /* defined TEXTDOMAINDIR */
|
||||
(void) textdomain(TZ_DOMAIN);
|
||||
#endif /* HAVE_GETTEXT - 0 */
|
||||
while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != -1)
|
||||
while ((c = getopt(argc, argv, "Dd:g:l:m:p:L:u:vsy:")) != -1)
|
||||
switch (c) {
|
||||
default:
|
||||
usage();
|
||||
case 'D':
|
||||
Dflag = 1;
|
||||
break;
|
||||
case 'd':
|
||||
if (directory == NULL)
|
||||
directory = optarg;
|
||||
@ -488,6 +487,9 @@ char * argv[];
|
||||
errx(EXIT_FAILURE,
|
||||
_("more than one -d option specified"));
|
||||
break;
|
||||
case 'g':
|
||||
setgroup(&gflag, optarg);
|
||||
break;
|
||||
case 'l':
|
||||
if (lcltime == NULL)
|
||||
lcltime = optarg;
|
||||
@ -495,6 +497,12 @@ _("more than one -d option specified"));
|
||||
errx(EXIT_FAILURE,
|
||||
_("more than one -l option specified"));
|
||||
break;
|
||||
case 'm':
|
||||
{
|
||||
void *set = setmode(optarg);
|
||||
getmode(set, mflag);
|
||||
break;
|
||||
}
|
||||
case 'p':
|
||||
if (psxrules == NULL)
|
||||
psxrules = optarg;
|
||||
@ -502,6 +510,9 @@ _("more than one -l option specified"));
|
||||
errx(EXIT_FAILURE,
|
||||
_("more than one -p option specified"));
|
||||
break;
|
||||
case 'u':
|
||||
setuser(&uflag, optarg);
|
||||
break;
|
||||
case 'y':
|
||||
if (yitcommand == NULL)
|
||||
yitcommand = optarg;
|
||||
@ -591,11 +602,23 @@ const char * const tofile;
|
||||
if (!itsdir(toname))
|
||||
(void) remove(toname);
|
||||
if (link(fromname, toname) != 0) {
|
||||
int result;
|
||||
|
||||
if (mkdirs(toname) != 0)
|
||||
(void) exit(EXIT_FAILURE);
|
||||
if (link(fromname, toname) != 0)
|
||||
err(EXIT_FAILURE, _("can't link from %s to %s"),
|
||||
fromname, toname);
|
||||
result = link(fromname, toname);
|
||||
#if (HAVE_SYMLINK - 0)
|
||||
if (result != 0) {
|
||||
result = symlink(fromname, toname);
|
||||
if (result == 0)
|
||||
warning(_("hard link failed, symbolic link used"));
|
||||
}
|
||||
#endif
|
||||
if (result != 0) {
|
||||
err(EXIT_FAILURE,
|
||||
_("%s: Can't link from %s to %s"),
|
||||
fromname, toname);
|
||||
}
|
||||
}
|
||||
ifree(fromname);
|
||||
ifree(toname);
|
||||
@ -636,6 +659,8 @@ setboundaries P((void))
|
||||
}
|
||||
min_year = TM_YEAR_BASE + gmtime(&min_time)->tm_year;
|
||||
max_year = TM_YEAR_BASE + gmtime(&max_time)->tm_year;
|
||||
min_year_representable = min_year;
|
||||
max_year_representable = max_year;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -858,9 +883,10 @@ const int signable;
|
||||
error(errstring);
|
||||
return 0;
|
||||
}
|
||||
if (hh < 0 || hh >= HOURSPERDAY ||
|
||||
if ((hh < 0 || hh >= HOURSPERDAY ||
|
||||
mm < 0 || mm >= MINSPERHOUR ||
|
||||
ss < 0 || ss > SECSPERMIN) {
|
||||
ss < 0 || ss > SECSPERMIN) &&
|
||||
!(hh == HOURSPERDAY && mm == 0 && ss == 0)) {
|
||||
error(errstring);
|
||||
return 0;
|
||||
}
|
||||
@ -987,7 +1013,7 @@ const int iscont;
|
||||
}
|
||||
z.z_filename = filename;
|
||||
z.z_linenum = linenum;
|
||||
z.z_gmtoff = gethms(fields[i_gmtoff], _("invalid GMT offset"), TRUE);
|
||||
z.z_gmtoff = gethms(fields[i_gmtoff], _("invalid UTC offset"), TRUE);
|
||||
if ((cp = strchr(fields[i_format], '%')) != 0) {
|
||||
if (*++cp != 's' || strchr(cp, '%') != 0) {
|
||||
error(_("invalid abbreviation format"));
|
||||
@ -1189,6 +1215,7 @@ const char * const timep;
|
||||
rp->r_todisstd = FALSE;
|
||||
rp->r_todisgmt = FALSE;
|
||||
*ep = '\0';
|
||||
break;
|
||||
case 'g': /* Greenwich */
|
||||
case 'u': /* Universal */
|
||||
case 'z': /* Zulu */
|
||||
@ -1218,6 +1245,11 @@ const char * const timep;
|
||||
} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
|
||||
error(_("invalid starting year"));
|
||||
return;
|
||||
} else if (noise) {
|
||||
if (rp->r_loyear < min_year_representable)
|
||||
warning(_("starting year too low to be represented"));
|
||||
else if (rp->r_loyear > max_year_representable)
|
||||
warning(_("starting year too high to be represented"));
|
||||
}
|
||||
cp = hiyearp;
|
||||
if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
|
||||
@ -1236,6 +1268,11 @@ const char * const timep;
|
||||
} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
|
||||
error(_("invalid ending year"));
|
||||
return;
|
||||
} else if (noise) {
|
||||
if (rp->r_loyear < min_year_representable)
|
||||
warning(_("starting year too low to be represented"));
|
||||
else if (rp->r_loyear > max_year_representable)
|
||||
warning(_("starting year too high to be represented"));
|
||||
}
|
||||
if (rp->r_loyear > rp->r_hiyear) {
|
||||
error(_("starting year greater than ending year"));
|
||||
@ -1250,6 +1287,8 @@ const char * const timep;
|
||||
}
|
||||
rp->r_yrtype = ecpyalloc(typep);
|
||||
}
|
||||
if (rp->r_loyear < min_year && rp->r_loyear > 0)
|
||||
min_year = rp->r_loyear;
|
||||
/*
|
||||
** Day work.
|
||||
** Accept things such as:
|
||||
@ -1358,8 +1397,10 @@ const char * const name;
|
||||
|
||||
toi = 0;
|
||||
fromi = 0;
|
||||
while (fromi < timecnt && attypes[fromi].at < min_time)
|
||||
++fromi;
|
||||
if (isdsts[0] == 0)
|
||||
while (attypes[fromi].type == 0)
|
||||
while (fromi < timecnt && attypes[fromi].type == 0)
|
||||
++fromi; /* handled by default rule */
|
||||
for ( ; fromi < timecnt; ++fromi) {
|
||||
if (toi != 0
|
||||
@ -1406,7 +1447,9 @@ const char * const name;
|
||||
convert(eitol(timecnt), tzh.tzh_timecnt);
|
||||
convert(eitol(typecnt), tzh.tzh_typecnt);
|
||||
convert(eitol(charcnt), tzh.tzh_charcnt);
|
||||
(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
|
||||
#define DO(field) (void) fwrite((void *) tzh.field, (size_t) sizeof tzh.field, (size_t) 1, fp)
|
||||
DO(tzh_magic);
|
||||
DO(tzh_reserved);
|
||||
DO(tzh_ttisgmtcnt);
|
||||
DO(tzh_ttisstdcnt);
|
||||
@ -1460,6 +1503,13 @@ const char * const name;
|
||||
(void) putc(ttisgmts[i], fp);
|
||||
if (ferror(fp) || fclose(fp))
|
||||
errx(EXIT_FAILURE, _("error writing %s"), fullname);
|
||||
if (chmod(fullname, mflag) < 0)
|
||||
err(EXIT_FAILURE, _("cannot change mode of %s to %03o"),
|
||||
fullname, (unsigned)mflag);
|
||||
if ((uflag != (uid_t)-1 || gflag != (gid_t)-1)
|
||||
&& chown(fullname, uflag, gflag) < 0)
|
||||
err(EXIT_FAILURE, _("cannot change ownership of %s"),
|
||||
fullname);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1567,7 +1617,7 @@ const int zonecount;
|
||||
INITIALIZE(ktime);
|
||||
if (useuntil) {
|
||||
/*
|
||||
** Turn untiltime into GMT
|
||||
** Turn untiltime into UTC
|
||||
** assuming the current gmtoff and
|
||||
** stdoff values.
|
||||
*/
|
||||
@ -1647,7 +1697,7 @@ const int zonecount;
|
||||
(void) strcpy(startbuf, zp->z_format);
|
||||
eat(zp->z_filename, zp->z_linenum);
|
||||
if (*startbuf == '\0')
|
||||
error(_("can't determine time zone abbrevation to use just after until time"));
|
||||
error(_("can't determine time zone abbreviation to use just after until time"));
|
||||
else addtt(starttime,
|
||||
addtype(startoff, startbuf,
|
||||
startoff != zp->z_gmtoff,
|
||||
@ -1673,8 +1723,22 @@ error(_("can't determine time zone abbrevation to use just after until time"));
|
||||
static void
|
||||
addtt(starttime, type)
|
||||
const time_t starttime;
|
||||
const int type;
|
||||
int type;
|
||||
{
|
||||
if (starttime <= min_time ||
|
||||
(timecnt == 1 && attypes[0].at < min_time)) {
|
||||
gmtoffs[0] = gmtoffs[type];
|
||||
isdsts[0] = isdsts[type];
|
||||
ttisstds[0] = ttisstds[type];
|
||||
ttisgmts[0] = ttisgmts[type];
|
||||
if (abbrinds[type] != 0)
|
||||
(void) strcpy(chars, &chars[abbrinds[type]]);
|
||||
abbrinds[0] = 0;
|
||||
charcnt = strlen(chars) + 1;
|
||||
typecnt = 1;
|
||||
timecnt = 0;
|
||||
type = 0;
|
||||
}
|
||||
if (timecnt >= TZ_MAX_TIMES) {
|
||||
error(_("too many transitions?!"));
|
||||
(void) exit(EXIT_FAILURE);
|
||||
@ -1868,10 +1932,11 @@ register const struct lookup * const table;
|
||||
*/
|
||||
foundlp = NULL;
|
||||
for (lp = table; lp->l_word != NULL; ++lp)
|
||||
if (itsabbr(word, lp->l_word))
|
||||
if (itsabbr(word, lp->l_word)) {
|
||||
if (foundlp == NULL)
|
||||
foundlp = lp;
|
||||
else return NULL; /* multiple inexact matches */
|
||||
}
|
||||
return foundlp;
|
||||
}
|
||||
|
||||
@ -2057,7 +2122,7 @@ char * const argname;
|
||||
register char * name;
|
||||
register char * cp;
|
||||
|
||||
if (argname == NULL || *argname == '\0')
|
||||
if (argname == NULL || *argname == '\0' || Dflag)
|
||||
return 0;
|
||||
cp = name = ecpyalloc(argname);
|
||||
while ((cp = strchr(cp + 1, '/')) != 0) {
|
||||
@ -2075,8 +2140,14 @@ char * const argname;
|
||||
if (!itsdir(name)) {
|
||||
/*
|
||||
** It doesn't seem to exist, so we try to create it.
|
||||
** Creation may fail because of the directory being
|
||||
** created by some other multiprocessor, so we get
|
||||
** to do extra checking.
|
||||
*/
|
||||
if (mkdir(name, 0755) != 0) {
|
||||
if (mkdir(name, (S_IRUSR | S_IWUSR | S_IXUSR
|
||||
| S_IRGRP | S_IXGRP | S_IROTH
|
||||
| S_IXOTH)) != 0
|
||||
&& (errno != EEXIST || !itsdir(name))) {
|
||||
warn(_("can't create directory %s"), name);
|
||||
ifree(name);
|
||||
return -1;
|
||||
@ -2100,6 +2171,59 @@ const int i;
|
||||
return l;
|
||||
}
|
||||
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
|
||||
static void
|
||||
setgroup(flag, name)
|
||||
gid_t *flag;
|
||||
const char *name;
|
||||
{
|
||||
struct group *gr;
|
||||
|
||||
if (*flag != (gid_t)-1)
|
||||
errx(EXIT_FAILURE, _("multiple -g flags specified"));
|
||||
|
||||
gr = getgrnam(name);
|
||||
if (gr == 0) {
|
||||
char *ep;
|
||||
unsigned long ul;
|
||||
|
||||
ul = strtoul(name, &ep, 10);
|
||||
if (ul == (unsigned long)(gid_t)ul && *ep == '\0') {
|
||||
*flag = ul;
|
||||
return;
|
||||
}
|
||||
errx(EXIT_FAILURE, _("group `%s' not found"), name);
|
||||
}
|
||||
*flag = gr->gr_gid;
|
||||
}
|
||||
|
||||
static void
|
||||
setuser(flag, name)
|
||||
uid_t *flag;
|
||||
const char *name;
|
||||
{
|
||||
struct passwd *pw;
|
||||
|
||||
if (*flag != (gid_t)-1)
|
||||
errx(EXIT_FAILURE, _("multiple -u flags specified"));
|
||||
|
||||
pw = getpwnam(name);
|
||||
if (pw == 0) {
|
||||
char *ep;
|
||||
unsigned long ul;
|
||||
|
||||
ul = strtoul(name, &ep, 10);
|
||||
if (ul == (unsigned long)(gid_t)ul && *ep == '\0') {
|
||||
*flag = ul;
|
||||
return;
|
||||
}
|
||||
errx(EXIT_FAILURE, _("user `%s' not found"), name);
|
||||
}
|
||||
*flag = pw->pw_uid;
|
||||
}
|
||||
|
||||
/*
|
||||
** UNIX was a registered trademark of UNIX System Laboratories in 1993.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user