Time-OlsonTZ-Data
view release on metacpan or search on metacpan
tzsrc/zic.c view on Meta::CPAN
# define HAVE_GETRANDOM GRND_RANDOM
#elif HAVE_GETRANDOM
# include <sys/random.h>
#endif
#if HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifndef S_IRWXU
# define S_IRUSR 0400
# define S_IWUSR 0200
# define S_IXUSR 0100
# define S_IRGRP 0040
# define S_IWGRP 0020
# define S_IXGRP 0010
# define S_IROTH 0004
# define S_IWOTH 0002
# define S_IXOTH 0001
# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
#endif
/* All file permission bits. */
#define ALL_PERMS (S_IRWXU | S_IRWXG | S_IRWXO)
/* Troublesome file permission bits. */
#define TROUBLE_PERMS (S_IWGRP | S_IWOTH)
/* File permission bits for making directories.
The umask modifies these bits. */
#define MKDIR_PERMS (ALL_PERMS & ~TROUBLE_PERMS)
/* File permission bits for making regular files.
The umask modifies these bits. */
#define CREAT_PERMS (MKDIR_PERMS & ~(S_IXUSR | S_IXGRP | S_IXOTH))
static mode_t creat_perms = CREAT_PERMS;
#ifndef HAVE_PWD_H
# ifdef __has_include
# if __has_include(<pwd.h>) && __has_include(<grp.h>)
# define HAVE_PWD_H 1
# else
# define HAVE_PWD_H 0
# endif
# endif
#endif
#ifndef HAVE_PWD_H
# define HAVE_PWD_H 1
#endif
#if HAVE_PWD_H
# include <grp.h>
# include <pwd.h>
#else
struct group { gid_t gr_gid; };
struct passwd { uid_t pw_uid; };
# define getgrnam(arg) NULL
# define getpwnam(arg) NULL
# define fchown(fd, owner, group) ((fd) < 0 ? -1 : 0)
#endif
static gid_t const no_gid = -1;
static uid_t const no_uid = -1;
static gid_t output_group = -1;
static uid_t output_owner = -1;
#ifndef GID_T_MAX
# define GID_T_MAX_NO_PADDING MAXVAL(gid_t, TYPE_BIT(gid_t))
# if HAVE__GENERIC
# define GID_T_MAX \
(TYPE_SIGNED(gid_t) \
? _Generic((gid_t) 0, \
signed char: SCHAR_MAX, short: SHRT_MAX, \
int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
default: GID_T_MAX_NO_PADDING) \
: (gid_t) -1)
# else
# define GID_T_MAX GID_T_MAX_NO_PADDING
# endif
#endif
#ifndef UID_T_MAX
# define UID_T_MAX_NO_PADDING MAXVAL(uid_t, TYPE_BIT(uid_t))
# if HAVE__GENERIC
# define UID_T_MAX \
(TYPE_SIGNED(uid_t) \
? _Generic((uid_t) 0, \
signed char: SCHAR_MAX, short: SHRT_MAX, \
int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
default: UID_T_MAX_NO_PADDING) \
: (uid_t) -1)
# else
# define UID_T_MAX UID_T_MAX_NO_PADDING
# endif
#endif
/* The minimum alignment of a type, for pre-C23 platforms.
The __SUNPRO_C test is because Oracle Developer Studio 12.6 lacks
<stdalign.h> even though __STDC_VERSION__ == 201112. */
#if __STDC_VERSION__ < 201112 || defined __SUNPRO_C
# define alignof(type) offsetof(struct { char a; type b; }, b)
#elif __STDC_VERSION__ < 202311
# include <stdalign.h>
#endif
/* The name used for the file implementing the obsolete -p option. */
#ifndef TZDEFRULES
# define TZDEFRULES "posixrules"
#endif
/* The maximum length of a text line, including the trailing newline. */
#ifndef _POSIX2_LINE_MAX
# define _POSIX2_LINE_MAX 2048
#endif
/* The type for line numbers. Use PRIdMAX to format them; formerly
there was also "#define PRIdLINENO PRIdMAX" and formats used
PRIdLINENO, but xgettext cannot grok that. */
typedef intmax_t lineno;
struct rule {
int r_filenum;
tzsrc/zic.c view on Meta::CPAN
if (ep == arg || *ep || maxval < n || errno) {
fprintf(stderr, _(msgid), progname, arg);
exit(EXIT_FAILURE);
}
return n;
}
#ifndef MODE_T_MAX
# define MODE_T_MAX_NO_PADDING MAXVAL(mode_t, TYPE_BIT(mode_t))
# if HAVE__GENERIC
# define MODE_T_MAX \
(TYPE_SIGNED(mode_t) \
? _Generic((mode_t) 0, \
signed char: SCHAR_MAX, short: SHRT_MAX, \
int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
default: MODE_T_MAX_NO_PADDING) \
: (mode_t) -1)
# else
# define MODE_T_MAX MODE_T_MAX_NO_PADDING
# endif
#endif
#ifndef HAVE_FCHMOD
# define HAVE_FCHMOD 1
#endif
#if !HAVE_FCHMOD
# define fchmod(fd, mode) 0
#endif
#ifndef HAVE_SETMODE
# if (defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
|| (defined __APPLE__ && defined __MACH__))
# define HAVE_SETMODE 1
# else
# define HAVE_SETMODE 0
# endif
#endif
static mode_t const no_mode = -1;
static mode_t output_mode = -1;
static mode_t
mode_option(char const *arg)
{
#if HAVE_SETMODE
void *set = setmode(arg);
if (set) {
mode_t mode = getmode(set, CREAT_PERMS);
free(set);
return mode;
}
#endif
return arg2num(arg, 8, min(MODE_T_MAX, ULONG_MAX),
N_("%s: -m '%s': invalid mode\n"));
}
static int
chmetadata(FILE *stream)
{
if (output_owner != no_uid || output_group != no_gid) {
int r = fchown(fileno(stream), output_owner, output_group);
if (r < 0)
return r;
}
return output_mode == no_mode ? 0 : fchmod(fileno(stream), output_mode);
}
/* Close STREAM.
If it had an I/O error, report it against DIR/NAME,
remove TEMPNAME if nonnull, and then exit.
If TEMPNAME is nonnull, and if requested,
change the stream's metadata before closing. */
static void
close_file(FILE *stream, char const *dir, char const *name,
char const *tempname)
{
char const *e = (ferror(stream) ? _("I/O error")
: ((tempname
&& (fflush(stream) < 0 || chmetadata(stream) < 0))
|| fclose(stream) < 0)
? strerror(errno) : NULL);
if (e) {
if (name && *name == '/')
dir = NULL;
fprintf(stderr, "%s: %s%s%s%s%s\n", progname,
dir ? dir : "", dir ? "/" : "",
name ? name : "", name ? ": " : "",
e);
if (tempname)
remove(tempname);
exit(EXIT_FAILURE);
}
}
ATTRIBUTE_NORETURN static void
duplicate_options(char const *opt)
{
fprintf(stderr, _("%s: More than one %s option specified\n"), progname, opt);
exit(EXIT_FAILURE);
}
ATTRIBUTE_NORETURN static void
usage(FILE *stream, int status)
{
fprintf(stream,
_("%s: usage is %s [ --version ] [ --help ] [ -v ] \\\n"
"\t[ -b {slim|fat} ] [ -d directory ] [ -D ] \\\n"
"\t[ -l localtime ] [ -L leapseconds ] [ -m mode ] \\\n"
"\t[ -p posixrules ] [ -r '[@lo][/@hi]' ] [ -R @hi ] \\\n"
"\t[ -t localtime-link ] [ -u 'owner[:group]' ] \\\n"
"\t[ filename ... ]\n\n"
"Report bugs to %s.\n"),
progname, progname, REPORT_BUGS_TO);
if (status == EXIT_SUCCESS)
close_file(stream, NULL, NULL, NULL);
exit(status);
}
static void
group_option(char const *arg)
{
( run in 0.782 second using v1.01-cache-2.11-cpan-5511b514fd6 )