提交 1bf508c9 编写于 作者: D Dr. Stephen Henson

new function to diff tm structures

上级 799668c1
...@@ -4,6 +4,11 @@ ...@@ -4,6 +4,11 @@
Changes between 1.0.0 and 1.1.0 [xx XXX xxxx] 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 *) New -sigopt option to the ca, req and x509 utilities. Additional
signature parameters can be passed using this option and in signature parameters can be passed using this option and in
particular PSS. particular PSS.
......
...@@ -228,9 +228,73 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) ...@@ -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 long date_to_julian(int y, int m, int d);
static void julian_to_date(long jd, 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 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; int offset_hms, offset_day;
long time_jd; long time_jd;
int time_year, time_month, time_day; int time_year, time_month, time_day;
...@@ -268,26 +332,11 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) ...@@ -268,26 +332,11 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec)
if (time_jd < 0) if (time_jd < 0)
return 0; return 0;
/* Convert Julian day back to date */ *pday = time_jd;
*psec = offset_hms;
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;
return 1; return 1;
}
}
/* Convert date to and from julian day /* Convert date to and from julian day
* Uses Fliegel & Van Flandern algorithm * Uses Fliegel & Van Flandern algorithm
...@@ -339,28 +388,42 @@ int main(int argc, char **argv) ...@@ -339,28 +388,42 @@ int main(int argc, char **argv)
int check_time(long offset) 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_t t1, t2;
time(&t1); time(&t1);
t2 = t1 + offset; t2 = t1 + offset;
OPENSSL_gmtime(&t2, &tm2); OPENSSL_gmtime(&t2, &tm2);
OPENSSL_gmtime(&t1, &tm1); OPENSSL_gmtime(&t1, &tm1);
o1 = tm1;
OPENSSL_gmtime_adj(&tm1, 0, offset); OPENSSL_gmtime_adj(&tm1, 0, offset);
if ((tm1.tm_year == tm2.tm_year) && if ((tm1.tm_year != tm2.tm_year) ||
(tm1.tm_mon == tm2.tm_mon) && (tm1.tm_mon != tm2.tm_mon) ||
(tm1.tm_mday == tm2.tm_mday) && (tm1.tm_mday != tm2.tm_mday) ||
(tm1.tm_hour == tm2.tm_hour) && (tm1.tm_hour != tm2.tm_hour) ||
(tm1.tm_min == tm2.tm_min) && (tm1.tm_min != tm2.tm_min) ||
(tm1.tm_sec == tm2.tm_sec)) (tm1.tm_sec != tm2.tm_sec))
return 1; {
fprintf(stderr, "TIME ERROR!!\n"); fprintf(stderr, "TIME ERROR!!\n");
fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n",
tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900,
tm2.tm_hour, tm2.tm_min, tm2.tm_sec); tm2.tm_hour, tm2.tm_min, tm2.tm_sec);
fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n", fprintf(stderr, "Time2: %d/%d/%d, %d:%02d:%02d\n",
tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900, tm1.tm_mday, tm1.tm_mon + 1, tm1.tm_year + 1900,
tm1.tm_hour, tm1.tm_min, tm1.tm_sec); tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
return 0; 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 #endif
...@@ -63,5 +63,6 @@ ...@@ -63,5 +63,6 @@
struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); 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_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 #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册