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 )