new function to diff tm structures
This commit is contained in:
parent
799668c1ce
commit
1bf508c9cf
5
CHANGES
5
CHANGES
@ -4,6 +4,11 @@
|
||||
|
||||
Changes between 1.0.0 and 1.1.0 [xx XXX xxxx]
|
||||
|
||||
*) New function OPENSSL_gmtime_diff to find the difference in days
|
||||
and seconds between two tm structures. This will be used to provide
|
||||
additional functionality for ASN1_TIME.
|
||||
[Steve Henson]
|
||||
|
||||
*) New -sigopt option to the ca, req and x509 utilities. Additional
|
||||
signature parameters can be passed using this option and in
|
||||
particular PSS.
|
||||
|
133
crypto/o_time.c
133
crypto/o_time.c
@ -228,9 +228,73 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
|
||||
|
||||
static long date_to_julian(int y, int m, int d);
|
||||
static void julian_to_date(long jd, int *y, int *m, int *d);
|
||||
static int julian_adj(struct tm *tm, int off_day, long offset_sec,
|
||||
long *pday, int *psec);
|
||||
|
||||
int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec)
|
||||
{
|
||||
int time_sec, time_year, time_month, time_day;
|
||||
long time_jd;
|
||||
|
||||
/* Convert time and offset into julian day and seconds */
|
||||
if (!julian_adj(tm, off_day, offset_sec, &time_jd, &time_sec))
|
||||
return 0;
|
||||
|
||||
/* Convert Julian day back to date */
|
||||
|
||||
julian_to_date(time_jd, &time_year, &time_month, &time_day);
|
||||
|
||||
if (time_year < 1900 || time_year > 9999)
|
||||
return 0;
|
||||
|
||||
/* Update tm structure */
|
||||
|
||||
tm->tm_year = time_year - 1900;
|
||||
tm->tm_mon = time_month - 1;
|
||||
tm->tm_mday = time_day;
|
||||
|
||||
tm->tm_hour = time_sec / 3600;
|
||||
tm->tm_min = (time_sec / 60) % 60;
|
||||
tm->tm_sec = time_sec % 60;
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec)
|
||||
{
|
||||
int from_sec, to_sec, diff_sec;
|
||||
long from_jd, to_jd, diff_day;
|
||||
if (!julian_adj(from, 0, 0, &from_jd, &from_sec))
|
||||
return 0;
|
||||
if (!julian_adj(to, 0, 0, &to_jd, &to_sec))
|
||||
return 0;
|
||||
diff_day = to_jd - from_jd;
|
||||
diff_sec = to_sec - from_sec;
|
||||
/* Adjust differences so both positive or both negative */
|
||||
if (diff_day > 0 && diff_sec < 0)
|
||||
{
|
||||
diff_day--;
|
||||
diff_sec += SECS_PER_DAY;
|
||||
}
|
||||
if (diff_day < 0 && diff_sec > 0)
|
||||
{
|
||||
diff_day++;
|
||||
diff_sec -= SECS_PER_DAY;
|
||||
}
|
||||
|
||||
*pday = (int)diff_day;
|
||||
*psec = diff_sec;
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Convert tm structure and offset into julian day and seconds */
|
||||
static int julian_adj(struct tm *tm, int off_day, long offset_sec,
|
||||
long *pday, int *psec)
|
||||
{
|
||||
int offset_hms, offset_day;
|
||||
long time_jd;
|
||||
int time_year, time_month, time_day;
|
||||
@ -268,26 +332,11 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec)
|
||||
if (time_jd < 0)
|
||||
return 0;
|
||||
|
||||
/* Convert Julian day back to date */
|
||||
|
||||
julian_to_date(time_jd, &time_year, &time_month, &time_day);
|
||||
|
||||
if (time_year < 1900 || time_year > 9999)
|
||||
return 0;
|
||||
|
||||
/* Update tm structure */
|
||||
|
||||
tm->tm_year = time_year - 1900;
|
||||
tm->tm_mon = time_month - 1;
|
||||
tm->tm_mday = time_day;
|
||||
|
||||
tm->tm_hour = offset_hms / 3600;
|
||||
tm->tm_min = (offset_hms / 60) % 60;
|
||||
tm->tm_sec = offset_hms % 60;
|
||||
|
||||
*pday = time_jd;
|
||||
*psec = offset_hms;
|
||||
return 1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Convert date to and from julian day
|
||||
* Uses Fliegel & Van Flandern algorithm
|
||||
@ -339,28 +388,42 @@ int main(int argc, char **argv)
|
||||
|
||||
int check_time(long offset)
|
||||
{
|
||||
struct tm tm1, tm2;
|
||||
struct tm tm1, tm2, o1;
|
||||
int off_day, off_sec;
|
||||
long toffset;
|
||||
time_t t1, t2;
|
||||
time(&t1);
|
||||
t2 = t1 + offset;
|
||||
OPENSSL_gmtime(&t2, &tm2);
|
||||
OPENSSL_gmtime(&t1, &tm1);
|
||||
o1 = tm1;
|
||||
OPENSSL_gmtime_adj(&tm1, 0, offset);
|
||||
if ((tm1.tm_year == tm2.tm_year) &&
|
||||
(tm1.tm_mon == tm2.tm_mon) &&
|
||||
(tm1.tm_mday == tm2.tm_mday) &&
|
||||
(tm1.tm_hour == tm2.tm_hour) &&
|
||||
(tm1.tm_min == tm2.tm_min) &&
|
||||
(tm1.tm_sec == tm2.tm_sec))
|
||||
return 1;
|
||||
fprintf(stderr, "TIME ERROR!!\n");
|
||||
fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n",
|
||||
tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900,
|
||||
tm2.tm_hour, tm2.tm_min, tm2.tm_sec);
|
||||
fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n",
|
||||
tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900,
|
||||
tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
|
||||
return 0;
|
||||
if ((tm1.tm_year != tm2.tm_year) ||
|
||||
(tm1.tm_mon != tm2.tm_mon) ||
|
||||
(tm1.tm_mday != tm2.tm_mday) ||
|
||||
(tm1.tm_hour != tm2.tm_hour) ||
|
||||
(tm1.tm_min != tm2.tm_min) ||
|
||||
(tm1.tm_sec != tm2.tm_sec))
|
||||
{
|
||||
fprintf(stderr, "TIME ERROR!!\n");
|
||||
fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n",
|
||||
tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900,
|
||||
tm2.tm_hour, tm2.tm_min, tm2.tm_sec);
|
||||
fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n",
|
||||
tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900,
|
||||
tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
|
||||
return 0;
|
||||
}
|
||||
OPENSSL_gmtime_diff(&o1, &tm1, &off_day, &off_sec);
|
||||
toffset = (long)off_day * SECS_PER_DAY + off_sec;
|
||||
if (offset != toffset)
|
||||
{
|
||||
fprintf(stderr, "TIME OFFSET ERROR!!\n");
|
||||
fprintf(stderr, "Expected %ld, Got %ld (%d:%d)\n",
|
||||
offset, toffset, off_day, off_sec);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -63,5 +63,6 @@
|
||||
|
||||
struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result);
|
||||
int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec);
|
||||
int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user