Blame missing_d/mktime.c

Packit Service f629e6
/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Packit Service f629e6
   This file is part of the GNU C Library.
Packit Service f629e6
   Contributed by Paul Eggert (eggert@twinsun.com).
Packit Service f629e6
Packit Service f629e6
   The GNU C Library is free software; you can redistribute it and/or
Packit Service f629e6
   modify it under the terms of the GNU Library General Public License as
Packit Service f629e6
   published by the Free Software Foundation; either version 3 of the
Packit Service f629e6
   License, or (at your option) any later version.
Packit Service f629e6
Packit Service f629e6
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service f629e6
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f629e6
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service f629e6
   Library General Public License for more details.
Packit Service f629e6
Packit Service f629e6
   You should have received a copy of the GNU Library General Public
Packit Service f629e6
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
Packit Service f629e6
   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit Service f629e6
   Boston, MA 02110-1301, USA.  */
Packit Service f629e6
Packit Service f629e6
/* Define this to have a standalone program to test this implementation of
Packit Service f629e6
   mktime.  */
Packit Service f629e6
/* #define DEBUG 1 */
Packit Service f629e6
Packit Service f629e6
#ifdef HAVE_CONFIG_H
Packit Service f629e6
#include <config.h>
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
#ifdef _LIBC
Packit Service f629e6
# define HAVE_LIMITS_H 1
Packit Service f629e6
# define HAVE_LOCALTIME_R 1
Packit Service f629e6
# define STDC_HEADERS 1
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
/* Assume that leap seconds are possible, unless told otherwise.
Packit Service f629e6
   If the host has a `zic' command with a `-L leapsecondfilename' option,
Packit Service f629e6
   then it supports leap seconds; otherwise it probably doesn't.  */
Packit Service f629e6
#ifndef LEAP_SECONDS_POSSIBLE
Packit Service f629e6
#define LEAP_SECONDS_POSSIBLE 1
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
#ifndef VMS
Packit Service f629e6
#include <sys/types.h>		/* Some systems define `time_t' here.  */
Packit Service f629e6
#else
Packit Service f629e6
#include <stddef.h>
Packit Service f629e6
#endif
Packit Service f629e6
#include <time.h>
Packit Service f629e6
Packit Service f629e6
#if HAVE_LIMITS_H
Packit Service f629e6
#include <limits.h>
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
#if DEBUG
Packit Service f629e6
#include <stdio.h>
Packit Service f629e6
#if STDC_HEADERS
Packit Service f629e6
#include <stdlib.h>
Packit Service f629e6
#endif
Packit Service f629e6
/* Make it work even if the system's libc has its own mktime routine.  */
Packit Service f629e6
#define mktime my_mktime
Packit Service f629e6
#endif /* DEBUG */
Packit Service f629e6
Packit Service f629e6
#ifndef __P
Packit Service f629e6
#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
Packit Service f629e6
#define __P(args) args
Packit Service f629e6
#else
Packit Service f629e6
#define __P(args) ()
Packit Service f629e6
#endif  /* GCC.  */
Packit Service f629e6
#endif  /* Not __P.  */
Packit Service f629e6
Packit Service f629e6
#ifndef CHAR_BIT
Packit Service f629e6
#define CHAR_BIT 8
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
#ifndef INT_MIN
Packit Service f629e6
#define INT_MIN (~0 << (sizeof (int) * CHAR_BIT - 1))
Packit Service f629e6
#endif
Packit Service f629e6
#ifndef INT_MAX
Packit Service f629e6
#define INT_MAX (~0 - INT_MIN)
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
#ifndef TIME_T_MIN
Packit Service f629e6
#define TIME_T_MIN (0 < (time_t) -1 ? (time_t) 0 \
Packit Service f629e6
		    : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1))
Packit Service f629e6
#endif
Packit Service f629e6
#ifndef TIME_T_MAX
Packit Service f629e6
#define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
#define TM_YEAR_BASE 1900
Packit Service f629e6
#define EPOCH_YEAR 1970
Packit Service f629e6
Packit Service f629e6
#ifndef __isleap
Packit Service f629e6
/* Nonzero if YEAR is a leap year (every 4 years,
Packit Service f629e6
   except every 100th isn't, and every 400th is).  */
Packit Service f629e6
#define	__isleap(year)	\
Packit Service f629e6
  ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
/* How many days come before each month (0-12).  */
Packit Service f629e6
const unsigned short int __mon_yday[2][13] =
Packit Service f629e6
  {
Packit Service f629e6
    /* Normal years.  */
Packit Service f629e6
    { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
Packit Service f629e6
    /* Leap years.  */
Packit Service f629e6
    { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
Packit Service f629e6
  };
Packit Service f629e6
Packit Service f629e6
static time_t ydhms_tm_diff __P ((int, int, int, int, int, const struct tm *));
Packit Service f629e6
time_t __mktime_internal __P ((struct tm *,
Packit Service f629e6
			       struct tm *(*) (const time_t *, struct tm *),
Packit Service f629e6
			       time_t *));
Packit Service f629e6
Packit Service f629e6
Packit Service f629e6
static struct tm *my_localtime_r __P ((const time_t *, struct tm *));
Packit Service f629e6
static struct tm *
Packit Service f629e6
my_localtime_r (t, tp)
Packit Service f629e6
     const time_t *t;
Packit Service f629e6
     struct tm *tp;
Packit Service f629e6
{
Packit Service f629e6
  struct tm *l = localtime (t);
Packit Service f629e6
  if (! l)
Packit Service f629e6
    return 0;
Packit Service f629e6
  *tp = *l;
Packit Service f629e6
  return tp;
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
Packit Service f629e6
/* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP),
Packit Service f629e6
   measured in seconds, ignoring leap seconds.
Packit Service f629e6
   YEAR uses the same numbering as TM->tm_year.
Packit Service f629e6
   All values are in range, except possibly YEAR.
Packit Service f629e6
   If overflow occurs, yield the low order bits of the correct answer.  */
Packit Service f629e6
static time_t
Packit Service f629e6
ydhms_tm_diff (year, yday, hour, min, sec, tp)
Packit Service f629e6
     int year, yday, hour, min, sec;
Packit Service f629e6
     const struct tm *tp;
Packit Service f629e6
{
Packit Service f629e6
  /* Compute intervening leap days correctly even if year is negative.
Packit Service f629e6
     Take care to avoid int overflow.  time_t overflow is OK, since
Packit Service f629e6
     only the low order bits of the correct time_t answer are needed.
Packit Service f629e6
     Don't convert to time_t until after all divisions are done, since
Packit Service f629e6
     time_t might be unsigned.  */
Packit Service f629e6
  int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - ! (year & 3);
Packit Service f629e6
  int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (tp->tm_year & 3);
Packit Service f629e6
  int a100 = a4 / 25 - (a4 % 25 < 0);
Packit Service f629e6
  int b100 = b4 / 25 - (b4 % 25 < 0);
Packit Service f629e6
  int a400 = a100 >> 2;
Packit Service f629e6
  int b400 = b100 >> 2;
Packit Service f629e6
  int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
Packit Service f629e6
  time_t years = year - (time_t) tp->tm_year;
Packit Service f629e6
  time_t days = (365 * years + intervening_leap_days
Packit Service f629e6
		 + (yday - tp->tm_yday));
Packit Service f629e6
  return (60 * (60 * (24 * days + (hour - tp->tm_hour))
Packit Service f629e6
		+ (min - tp->tm_min))
Packit Service f629e6
	  + (sec - tp->tm_sec));
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
Packit Service f629e6
static time_t localtime_offset;
Packit Service f629e6
Packit Service f629e6
/* Convert *TP to a time_t value.  */
Packit Service f629e6
time_t
Packit Service f629e6
mktime (tp)
Packit Service f629e6
     struct tm *tp;
Packit Service f629e6
{
Packit Service f629e6
#ifdef _LIBC
Packit Service f629e6
  /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
Packit Service f629e6
     time zone names contained in the external variable `tzname' shall
Packit Service f629e6
     be set as if the tzset() function had been called.  */
Packit Service f629e6
  __tzset ();
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
  return __mktime_internal (tp, my_localtime_r, &localtime_offset);
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
/* Convert *TP to a time_t value, inverting
Packit Service f629e6
   the monotonic and mostly-unit-linear conversion function CONVERT.
Packit Service f629e6
   Use *OFFSET to keep track of a guess at the offset of the result,
Packit Service f629e6
   compared to what the result would be for UTC without leap seconds.
Packit Service f629e6
   If *OFFSET's guess is correct, only one CONVERT call is needed.  */
Packit Service f629e6
time_t
Packit Service f629e6
__mktime_internal (tp, convert, offset)
Packit Service f629e6
     struct tm *tp;
Packit Service f629e6
     struct tm *(*convert) __P ((const time_t *, struct tm *));
Packit Service f629e6
     time_t *offset;
Packit Service f629e6
{
Packit Service f629e6
  time_t t, dt, t0;
Packit Service f629e6
  struct tm tm;
Packit Service f629e6
Packit Service f629e6
  /* The maximum number of probes (calls to CONVERT) should be enough
Packit Service f629e6
     to handle any combinations of time zone rule changes, solar time,
Packit Service f629e6
     and leap seconds.  Posix.1 prohibits leap seconds, but some hosts
Packit Service f629e6
     have them anyway.  */
Packit Service f629e6
  int remaining_probes = 4;
Packit Service f629e6
Packit Service f629e6
  /* Time requested.  Copy it in case CONVERT modifies *TP; this can
Packit Service f629e6
     occur if TP is localtime's returned value and CONVERT is localtime.  */
Packit Service f629e6
  int sec = tp->tm_sec;
Packit Service f629e6
  int min = tp->tm_min;
Packit Service f629e6
  int hour = tp->tm_hour;
Packit Service f629e6
  int mday = tp->tm_mday;
Packit Service f629e6
  int mon = tp->tm_mon;
Packit Service f629e6
  int year_requested = tp->tm_year;
Packit Service f629e6
  int isdst = tp->tm_isdst;
Packit Service f629e6
Packit Service f629e6
  /* Ensure that mon is in range, and set year accordingly.  */
Packit Service f629e6
  int mon_remainder = mon % 12;
Packit Service f629e6
  int negative_mon_remainder = mon_remainder < 0;
Packit Service f629e6
  int mon_years = mon / 12 - negative_mon_remainder;
Packit Service f629e6
  int year = year_requested + mon_years;
Packit Service f629e6
Packit Service f629e6
  /* The other values need not be in range:
Packit Service f629e6
     the remaining code handles minor overflows correctly,
Packit Service f629e6
     assuming int and time_t arithmetic wraps around.
Packit Service f629e6
     Major overflows are caught at the end.  */
Packit Service f629e6
Packit Service f629e6
  /* Calculate day of year from year, month, and day of month.
Packit Service f629e6
     The result need not be in range.  */
Packit Service f629e6
  int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)]
Packit Service f629e6
	       [mon_remainder + 12 * negative_mon_remainder])
Packit Service f629e6
	      + mday - 1);
Packit Service f629e6
Packit Service f629e6
#if LEAP_SECONDS_POSSIBLE
Packit Service f629e6
  /* Handle out-of-range seconds specially,
Packit Service f629e6
     since ydhms_tm_diff assumes every minute has 60 seconds.  */
Packit Service f629e6
  int sec_requested = sec;
Packit Service f629e6
  if (sec < 0)
Packit Service f629e6
    sec = 0;
Packit Service f629e6
  if (59 < sec)
Packit Service f629e6
    sec = 59;
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
  /* Invert CONVERT by probing.  First assume the same offset as last time.
Packit Service f629e6
     Then repeatedly use the error to improve the guess.  */
Packit Service f629e6
Packit Service f629e6
  tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
Packit Service f629e6
  tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
Packit Service f629e6
  t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm;;
Packit Service f629e6
Packit Service f629e6
  for (t = t0 + *offset;
Packit Service f629e6
       (dt = ydhms_tm_diff (year, yday, hour, min, sec, (*convert) (&t, &tm)));
Packit Service f629e6
       t += dt)
Packit Service f629e6
    if (--remaining_probes == 0)
Packit Service f629e6
      return -1;
Packit Service f629e6
Packit Service f629e6
  /* Check whether tm.tm_isdst has the requested value, if any.  */
Packit Service f629e6
  if (0 <= isdst && 0 <= tm.tm_isdst)
Packit Service f629e6
    {
Packit Service f629e6
      int dst_diff = (isdst != 0) - (tm.tm_isdst != 0);
Packit Service f629e6
      if (dst_diff)
Packit Service f629e6
	{
Packit Service f629e6
	  /* Move two hours in the direction indicated by the disagreement,
Packit Service f629e6
	     probe some more, and switch to a new time if found.
Packit Service f629e6
	     The largest known fallback due to daylight savings is two hours:
Packit Service f629e6
	     once, in Newfoundland, 1988-10-30 02:00 -> 00:00.  */
Packit Service f629e6
	  time_t ot = t - 2 * 60 * 60 * dst_diff;
Packit Service f629e6
	  while (--remaining_probes != 0)
Packit Service f629e6
	    {
Packit Service f629e6
	      struct tm otm;
Packit Service f629e6
	      if (! (dt = ydhms_tm_diff (year, yday, hour, min, sec,
Packit Service f629e6
					 (*convert) (&ot, &otm))))
Packit Service f629e6
		{
Packit Service f629e6
		  t = ot;
Packit Service f629e6
		  tm = otm;
Packit Service f629e6
		  break;
Packit Service f629e6
		}
Packit Service f629e6
	      if ((ot += dt) == t)
Packit Service f629e6
		break;  /* Avoid a redundant probe.  */
Packit Service f629e6
	    }
Packit Service f629e6
	}
Packit Service f629e6
    }
Packit Service f629e6
Packit Service f629e6
  *offset = t - t0;
Packit Service f629e6
Packit Service f629e6
#if LEAP_SECONDS_POSSIBLE
Packit Service f629e6
  if (sec_requested != tm.tm_sec)
Packit Service f629e6
    {
Packit Service f629e6
      /* Adjust time to reflect the tm_sec requested, not the normalized value.
Packit Service f629e6
	 Also, repair any damage from a false match due to a leap second.  */
Packit Service f629e6
      t += sec_requested - sec + (sec == 0 && tm.tm_sec == 60);
Packit Service f629e6
      (*convert) (&t, &tm;;
Packit Service f629e6
    }
Packit Service f629e6
#endif
Packit Service f629e6
Packit Service f629e6
  if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
Packit Service f629e6
    {
Packit Service f629e6
      /* time_t isn't large enough to rule out overflows in ydhms_tm_diff,
Packit Service f629e6
	 so check for major overflows.  A gross check suffices,
Packit Service f629e6
	 since if t has overflowed, it is off by a multiple of
Packit Service f629e6
	 TIME_T_MAX - TIME_T_MIN + 1.  So ignore any component of
Packit Service f629e6
	 the difference that is bounded by a small value.  */
Packit Service f629e6
Packit Service f629e6
      double dyear = (double) year_requested + mon_years - tm.tm_year;
Packit Service f629e6
      double dday = 366 * dyear + mday;
Packit Service f629e6
      double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
Packit Service f629e6
Packit Service f629e6
      if (TIME_T_MAX / 3 - TIME_T_MIN / 3 < (dsec < 0 ? - dsec : dsec))
Packit Service f629e6
	return -1;
Packit Service f629e6
    }
Packit Service f629e6
Packit Service f629e6
  *tp = tm;
Packit Service f629e6
  return t;
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
#ifdef weak_alias
Packit Service f629e6
weak_alias (mktime, timelocal)
Packit Service f629e6
#endif
Packit Service f629e6

Packit Service f629e6
#if DEBUG
Packit Service f629e6
Packit Service f629e6
static int
Packit Service f629e6
not_equal_tm (a, b)
Packit Service f629e6
     struct tm *a;
Packit Service f629e6
     struct tm *b;
Packit Service f629e6
{
Packit Service f629e6
  return ((a->tm_sec ^ b->tm_sec)
Packit Service f629e6
	  | (a->tm_min ^ b->tm_min)
Packit Service f629e6
	  | (a->tm_hour ^ b->tm_hour)
Packit Service f629e6
	  | (a->tm_mday ^ b->tm_mday)
Packit Service f629e6
	  | (a->tm_mon ^ b->tm_mon)
Packit Service f629e6
	  | (a->tm_year ^ b->tm_year)
Packit Service f629e6
	  | (a->tm_mday ^ b->tm_mday)
Packit Service f629e6
	  | (a->tm_yday ^ b->tm_yday)
Packit Service f629e6
	  | (a->tm_isdst ^ b->tm_isdst));
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
static void
Packit Service f629e6
print_tm (tp)
Packit Service f629e6
     struct tm *tp;
Packit Service f629e6
{
Packit Service f629e6
  printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
Packit Service f629e6
	  tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
Packit Service f629e6
	  tp->tm_hour, tp->tm_min, tp->tm_sec,
Packit Service f629e6
	  tp->tm_yday, tp->tm_wday, tp->tm_isdst);
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
static int
Packit Service f629e6
check_result (tk, tmk, tl, tml)
Packit Service f629e6
     time_t tk;
Packit Service f629e6
     struct tm tmk;
Packit Service f629e6
     time_t tl;
Packit Service f629e6
     struct tm tml;
Packit Service f629e6
{
Packit Service f629e6
  if (tk != tl || not_equal_tm (&tmk, &tml))
Packit Service f629e6
    {
Packit Service f629e6
      printf ("mktime (");
Packit Service f629e6
      print_tm (&tmk);
Packit Service f629e6
      printf (")\nyields (");
Packit Service f629e6
      print_tm (&tml);
Packit Service f629e6
      printf (") == %ld, should be %ld\n", (long) tl, (long) tk);
Packit Service f629e6
      return 1;
Packit Service f629e6
    }
Packit Service f629e6
Packit Service f629e6
  return 0;
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
int
Packit Service f629e6
main (argc, argv)
Packit Service f629e6
     int argc;
Packit Service f629e6
     char **argv;
Packit Service f629e6
{
Packit Service f629e6
  int status = 0;
Packit Service f629e6
  struct tm tm, tmk, tml;
Packit Service f629e6
  time_t tk, tl;
Packit Service f629e6
  char trailer;
Packit Service f629e6
Packit Service f629e6
  if ((argc == 3 || argc == 4)
Packit Service f629e6
      && (sscanf (argv[1], "%d-%d-%d%c",
Packit Service f629e6
		  &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
Packit Service f629e6
	  == 3)
Packit Service f629e6
      && (sscanf (argv[2], "%d:%d:%d%c",
Packit Service f629e6
		  &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
Packit Service f629e6
	  == 3))
Packit Service f629e6
    {
Packit Service f629e6
      tm.tm_year -= TM_YEAR_BASE;
Packit Service f629e6
      tm.tm_mon--;
Packit Service f629e6
      tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
Packit Service f629e6
      tmk = tm;
Packit Service f629e6
      tl = mktime (&tmk);
Packit Service f629e6
      tml = *localtime (&tl;;
Packit Service f629e6
      printf ("mktime returns %ld == ", (long) tl);
Packit Service f629e6
      print_tm (&tmk);
Packit Service f629e6
      printf ("\n");
Packit Service f629e6
      status = check_result (tl, tmk, tl, tml);
Packit Service f629e6
    }
Packit Service f629e6
  else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
Packit Service f629e6
    {
Packit Service f629e6
      time_t from = atol (argv[1]);
Packit Service f629e6
      time_t by = atol (argv[2]);
Packit Service f629e6
      time_t to = atol (argv[3]);
Packit Service f629e6
Packit Service f629e6
      if (argc == 4)
Packit Service f629e6
	for (tl = from; tl <= to; tl += by)
Packit Service f629e6
	  {
Packit Service f629e6
	    tml = *localtime (&tl;;
Packit Service f629e6
	    tmk = tml;
Packit Service f629e6
	    tk = mktime (&tmk);
Packit Service f629e6
	    status |= check_result (tk, tmk, tl, tml);
Packit Service f629e6
	  }
Packit Service f629e6
      else
Packit Service f629e6
	for (tl = from; tl <= to; tl += by)
Packit Service f629e6
	  {
Packit Service f629e6
	    /* Null benchmark.  */
Packit Service f629e6
	    tml = *localtime (&tl;;
Packit Service f629e6
	    tmk = tml;
Packit Service f629e6
	    tk = tl;
Packit Service f629e6
	    status |= check_result (tk, tmk, tl, tml);
Packit Service f629e6
	  }
Packit Service f629e6
    }
Packit Service f629e6
  else
Packit Service f629e6
    printf ("Usage:\
Packit Service f629e6
\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
Packit Service f629e6
\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
Packit Service f629e6
\t%s FROM BY TO - # Do not test those values (for benchmark).\n",
Packit Service f629e6
	    argv[0], argv[0], argv[0]);
Packit Service f629e6
Packit Service f629e6
  return status;
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
#endif /* DEBUG */
Packit Service f629e6

Packit Service f629e6
/*
Packit Service f629e6
Local Variables:
Packit Service f629e6
compile-command: "gcc -DDEBUG=1 -Wall -O -g mktime.c -o mktime"
Packit Service f629e6
End:
Packit Service f629e6
*/