diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c index dcfc4b97764db1a97edfd712a9a0c95d8c1408cf..c2a3c8fcbfa31d223d398314d6b1bec131f89949 100644 --- a/components/libc/compilers/common/time.c +++ b/components/libc/compilers/common/time.c @@ -183,10 +183,12 @@ char* ctime(const time_t *tim_p) } RTM_EXPORT(ctime); -static void get_timeval(struct timeval *tv) +/*-1 failure; 1 success*/ +static int get_timeval(struct timeval *tv) { if (tv == RT_NULL) - return; + return -1; + /* default is not available */ tv->tv_sec = -1; /* default is 0 */ @@ -217,8 +219,11 @@ static void get_timeval(struct timeval *tv) { /* LOG_W will cause a recursive printing if ulog timestamp function is turned on */ rt_kprintf("Cannot find a RTC device to provide time!\r\n"); - errno = ENOSYS; + tv->tv_sec = 0; + return -1; } + + return 1; } /** @@ -234,13 +239,19 @@ RT_WEAK time_t time(time_t *t) { struct timeval now; - get_timeval(&now); - - if (t) + if(get_timeval(&now)>0) { - *t = now.tv_sec; + if (t) + { + *t = now.tv_sec; + } + return now.tv_sec; + } + else + { + errno = EFAULT; + return -1; } - return now.tv_sec; } RTM_EXPORT(time); @@ -265,13 +276,13 @@ int stime(const time_t *t) else { LOG_W("Cannot find a RTC device to provide time!"); - errno = ENOSYS; + errno = EFAULT; return -1; } return 0; #else LOG_W("Cannot find a RTC device to provide time!"); - errno = ENOSYS; + errno = EFAULT; return -1; #endif /* RT_USING_RTC */ } @@ -355,15 +366,13 @@ RTM_EXPORT(timegm); /* TODO: timezone */ int gettimeofday(struct timeval *tv, struct timezone *tz) { - get_timeval(tv); - - if (tv != RT_NULL && tv->tv_sec != (time_t) -1) + if (tv != RT_NULL && get_timeval(tv)>0) { return 0; } else { - errno = ENOSYS; + errno = EFAULT; return -1; } } @@ -374,11 +383,19 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz) { if (tv != RT_NULL) { - return stime((const time_t *)&tv->tv_sec); + if(tv->tv_sec >= 0 && tv->tv_usec >= 0) + { + return stime((const time_t *)&tv->tv_sec); + } + else + { + errno = EINVAL; + return -1; + } } else { - errno = ENOSYS; + errno = EFAULT; return -1; } }