You need to sign in or sign up before continuing.
未验证 提交 1125b1c1 编写于 作者: O openharmony_ci 提交者: Gitee

!1065 【挑单3.2Release】内核time模块RTC与settimeofday接口逻辑修复

Merge pull request !1065 from zhangdengyu/RTC_3.2Release_0516
...@@ -617,11 +617,22 @@ struct tm *gmtime(const time_t *timer) ...@@ -617,11 +617,22 @@ struct tm *gmtime(const time_t *timer)
struct tm *localtime_r(const time_t *timep, struct tm *result) struct tm *localtime_r(const time_t *timep, struct tm *result)
{ {
INT32 ret;
if ((timep == NULL) || (result == NULL)) { if ((timep == NULL) || (result == NULL)) {
errno = EFAULT; errno = EFAULT;
return NULL; return NULL;
} }
if (!ConvertSecs2Utc(*timep, -g_timezone, result)) {
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
INT32 tempTimezone = 0;
g_rtcTimeFunc.RtcGetTimezoneHook(&tempTimezone);
ret = ConvertSecs2Utc(*timep, -tempTimezone, result);
} else {
ret = ConvertSecs2Utc(*timep, -g_timezone, result);
}
if (!ret) {
errno = EINVAL; errno = EINVAL;
return NULL; return NULL;
} }
...@@ -664,7 +675,14 @@ static time_t ConvertUtc2Secs(struct tm *tm) ...@@ -664,7 +675,14 @@ static time_t ConvertUtc2Secs(struct tm *tm)
seconds += (tm->tm_mday - 1) * SECS_PER_DAY; seconds += (tm->tm_mday - 1) * SECS_PER_DAY;
seconds += tm->tm_hour * SECS_PER_HOUR + tm->tm_min * SECS_PER_MIN + tm->tm_sec; seconds += tm->tm_hour * SECS_PER_HOUR + tm->tm_min * SECS_PER_MIN + tm->tm_sec;
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
INT32 tempTimezone = 0;
g_rtcTimeFunc.RtcGetTimezoneHook(&tempTimezone);
seconds += tempTimezone;
} else {
seconds += g_timezone; seconds += g_timezone;
}
return seconds; return seconds;
} }
...@@ -690,7 +708,14 @@ time_t mktime(struct tm *tmptr) ...@@ -690,7 +708,14 @@ time_t mktime(struct tm *tmptr)
} }
timeInSeconds = ConvertUtc2Secs(tmptr); timeInSeconds = ConvertUtc2Secs(tmptr);
/* normalize tm_wday and tm_yday */ /* normalize tm_wday and tm_yday */
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
INT32 tempTimezone = 0;
g_rtcTimeFunc.RtcGetTimezoneHook(&tempTimezone);
ConvertSecs2Utc(timeInSeconds, -tempTimezone, tmptr);
} else {
ConvertSecs2Utc(timeInSeconds, -g_timezone, tmptr); ConvertSecs2Utc(timeInSeconds, -g_timezone, tmptr);
}
return timeInSeconds; return timeInSeconds;
} }
...@@ -742,12 +767,12 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz) ...@@ -742,12 +767,12 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
{ {
struct timespec ts; struct timespec ts;
if (tv == NULL) { if ((tv == NULL) && (tz == NULL)) {
errno = EFAULT; errno = EFAULT;
return -1; return -1;
} }
if (tv->tv_usec >= OS_SYS_US_PER_SECOND) { if ((tv != NULL) && (tv->tv_usec >= OS_SYS_US_PER_SECOND)) {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
...@@ -766,20 +791,22 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz) ...@@ -766,20 +791,22 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
} }
} }
if (tv != NULL) {
if (g_rtcTimeFunc.RtcSetTimeHook != NULL) { if (g_rtcTimeFunc.RtcSetTimeHook != NULL) {
UINT64 usec; UINT64 usec;
g_rtcTimeBase = tv->tv_sec * OS_SYS_MS_PER_SECOND + tv->tv_usec / OS_SYS_MS_PER_SECOND; g_rtcTimeBase = tv->tv_sec * OS_SYS_MS_PER_SECOND + tv->tv_usec / OS_SYS_MS_PER_SECOND;
usec = tv->tv_sec * OS_SYS_US_PER_SECOND + tv->tv_usec; usec = tv->tv_sec * OS_SYS_US_PER_SECOND + tv->tv_usec;
if (-1 == g_rtcTimeFunc.RtcSetTimeHook(g_rtcTimeBase, &usec)) { if (g_rtcTimeFunc.RtcSetTimeHook(g_rtcTimeBase, &usec) < 0) {
return -1; return -1;
} }
} else { } else {
ts.tv_sec = tv->tv_sec; ts.tv_sec = tv->tv_sec;
ts.tv_nsec = tv->tv_usec * OS_SYS_NS_PER_US; ts.tv_nsec = tv->tv_usec * OS_SYS_NS_PER_US;
if (-1 == clock_settime(CLOCK_REALTIME, &ts)) { if (clock_settime(CLOCK_REALTIME, &ts) < 0) {
return -1; return -1;
} }
} }
}
if (g_rtcTimeFunc.RtcGetTickHook != NULL) { if (g_rtcTimeFunc.RtcGetTickHook != NULL) {
g_systickBase = g_rtcTimeFunc.RtcGetTickHook(); g_systickBase = g_rtcTimeFunc.RtcGetTickHook();
......
...@@ -288,6 +288,42 @@ LITE_TEST_CASE(PosixTimeFuncTestSuite, testTimeLocaltime002, Function | MediumTe ...@@ -288,6 +288,42 @@ LITE_TEST_CASE(PosixTimeFuncTestSuite, testTimeLocaltime002, Function | MediumTe
return 0; return 0;
} }
/* *
* @tc.number SUB_KERNEL_TIME_LOCALTIME_003
* @tc.name test settimeofday api
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE(PosixTimeFuncTestSuite, testTimeLocaltime003, Function | MediumTest | Level1)
{
char cTime[32]; /* 32, no special meaning */
time_t tStart;
time_t tEnd;
struct timezone tz;
struct timeval timeSet = {
.tv_sec = 86399, /* 86399, no special meaning */
.tv_usec = 0
};
int ret = gettimeofday(NULL, &tz);
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
ret = settimeofday(&timeSet, &tz);
time(&tStart);
sleep(2); /* 2, no special meaning */
time(&tEnd);
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
struct tm *tmStart = localtime(&tStart);
strftime(cTime, sizeof(cTime), "%H:%M:%S", tmStart);
ICUNIT_ASSERT_STRING_EQUAL(cTime, "07:59:59", 0);
LOG("\n time_t=%lld, first time:%s", tStart, cTime);
struct tm *tmEnd = localtime(&tEnd);
strftime(cTime, sizeof(cTime), "%H:%M:%S", tmEnd);
ICUNIT_ASSERT_STRING_EQUAL(cTime, "08:00:01", 0);
LOG("\n time_t=%lld, first time:%s", tEnd, cTime);
return 0;
}
/* * /* *
* @tc.number SUB_KERNEL_TIME_LOCALTIMER_001 * @tc.number SUB_KERNEL_TIME_LOCALTIMER_001
* @tc.name localtime_r api base test * @tc.name localtime_r api base test
...@@ -579,6 +615,7 @@ void PosixTimeFuncTest(void) ...@@ -579,6 +615,7 @@ void PosixTimeFuncTest(void)
#if (LOSCFG_LIBC_MUSL == 1) #if (LOSCFG_LIBC_MUSL == 1)
RUN_ONE_TESTCASE(testTimeLocaltime001); RUN_ONE_TESTCASE(testTimeLocaltime001);
RUN_ONE_TESTCASE(testTimeLocaltime002); RUN_ONE_TESTCASE(testTimeLocaltime002);
RUN_ONE_TESTCASE(testTimeLocaltime003);
RUN_ONE_TESTCASE(testTimeLocaltimer001); RUN_ONE_TESTCASE(testTimeLocaltimer001);
RUN_ONE_TESTCASE(testTimeLocaltimer002); RUN_ONE_TESTCASE(testTimeLocaltimer002);
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册