diff --git a/Makefile b/Makefile index 201ea623..2d29019a 100644 --- a/Makefile +++ b/Makefile @@ -414,8 +414,7 @@ OBJLIST = \ ${OBJDIR}httplib_pthread_mutex_unlock${OBJEXT} \ ${OBJDIR}httplib_pthread_self${OBJEXT} \ ${OBJDIR}httplib_pthread_setspecific${OBJEXT} \ - ${OBJDIR}wince_gmtime${OBJEXT} \ - ${OBJDIR}wince_gmtime_s${OBJEXT} \ + ${OBJDIR}httplib_gmtime_r${OBJEXT} \ ${OBJDIR}httplib_localtime_r${OBJEXT} \ ${OBJDIR}wince_rename${OBJEXT} \ ${OBJDIR}wince_stat${OBJEXT} \ @@ -1482,11 +1481,7 @@ ${OBJDIR}httplib_pthread_setspecific${OBJEXT} : ${SRCDIR}httplib_pthread_sets ${SRCDIR}httplib_main.h \ ${INCDIR}libhttp.h -${OBJDIR}wince_gmtime${OBJEXT} : ${SRCDIR}wince_gmtime.c \ - ${SRCDIR}httplib_main.h \ - ${INCDIR}libhttp.h - -${OBJDIR}wince_gmtime_s${OBJEXT} : ${SRCDIR}wince_gmtime_s.c \ +${OBJDIR}httplib_gmtime_r${OBJEXT} : ${SRCDIR}httplib_gmtime_r.c \ ${SRCDIR}httplib_main.h \ ${SRCDIR}httplib_utils.h \ ${INCDIR}libhttp.h diff --git a/include/libhttp.h b/include/libhttp.h index 89a333b9..15727e27 100644 --- a/include/libhttp.h +++ b/include/libhttp.h @@ -917,6 +917,7 @@ LIBHTTP_API enum debug_level_t httplib_get_debug_level( struct httplib_context LIBHTTP_API const char * httplib_get_option( const struct httplib_context *ctx, const char *name, char *buffer, size_t buflen ); LIBHTTP_API uint64_t httplib_get_random( void ); LIBHTTP_API void * httplib_get_user_connection_data( const struct httplib_connection *conn ); +LIBHTTP_API struct tm * httplib_gmtime_r( const time_t *clock, struct tm *result ); LIBHTTP_API int httplib_kill( pid_t pid, int sig_num ); LIBHTTP_API struct tm * httplib_localtime_r( const time_t *clock, struct tm *result ); LIBHTTP_API int httplib_mkdir( const char *path, int mode ); diff --git a/src/httplib_gmt_time_string.c b/src/httplib_gmt_time_string.c index c02681b6..c9093077 100644 --- a/src/httplib_gmt_time_string.c +++ b/src/httplib_gmt_time_string.c @@ -33,13 +33,11 @@ * included in all responses other than 100, 101, 5xx. */ void XX_httplib_gmt_time_string( char *buf, size_t buf_len, time_t *t ) { - struct tm *tm; + struct tm tmm; if ( buf == NULL || buf_len < 1 ) return; - tm = ( t != NULL ) ? gmtime(t) : NULL; - - if ( tm != NULL ) strftime( buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", tm ); + if ( httplib_gmtime_r( t, &tmm ) != NULL ) strftime( buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", &tmm ); else { httplib_strlcpy( buf, "Thu, 01 Jan 1970 00:00:00 GMT", buf_len ); diff --git a/src/wince_gmtime_s.c b/src/httplib_gmtime_r.c similarity index 56% rename from src/wince_gmtime_s.c rename to src/httplib_gmtime_r.c index 4d138523..42d8c886 100644 --- a/src/wince_gmtime_s.c +++ b/src/httplib_gmtime_r.c @@ -28,46 +28,54 @@ #include "httplib_main.h" #include "httplib_utils.h" -#if defined(_WIN32_WCE) - /* - * struct tm *gmtime_s( const time_t *ptime, struct tm *ptm ); + * struct tm *httplib_gmtime_r( const time_t *clock, struct tm *result ); * - * The function gmtime_s() converts a number of seconds since the EPOCH to - * a tm time structure. This standard function is not available on all - * platforms and this implementation provides the functionality for Windows CE. + * The function httplib_gmtime_r() returns a converted time to tm structure. + * No timezone conversion takes place. UTC as zone is assumed. */ -struct tm * gmtime_s( const time_t *ptime, struct tm *ptm ) { +struct tm * httplib_gmtime_r( const time_t *clock, struct tm *result ) { + +#if defined(_WIN32_CE) int a; int doy; FILETIME ft; SYSTEMTIME st; - if ( ptime == NULL || ptm == NULL ) return NULL; + if ( clock == NULL || result == NULL ) return NULL; - *(int64_t)&ft = ((int64_t)*ptime) * RATE_DIFF * EPOCH_DIFF; + *(int64_t)&ft = ((int64_t)*clock) * RATE_DIFF * EPOCH_DIFF; FileTimeToSystemTime( & ft, & st ); - ptm->tm_year = st.wYear - 1900; - ptm->tm_mon = st.wMonth - 1; - ptm->tm_wday = st.wDayOfWeek; - ptm->tm_mday = st.wDay; - ptm->tm_hour = st.wHour; - ptm->tm_min = st.wMinute; - ptm->tm_sec = st.wSecond; - ptm->tm_isdst = false; + result->tm_year = st.wYear - 1900; + result->tm_mon = st.wMonth - 1; + result->tm_wday = st.wDayOfWeek; + result->tm_mday = st.wDay; + result->tm_hour = st.wHour; + result->tm_min = st.wMinute; + result->tm_sec = st.wSecond; + result->tm_isdst = false; - doy = ptm->tm_mday; - for (a=0; atm_mon; a++) doy += days_per_month[a]; - if ( ptm->tm_mon >= 2 && LEAP_YEAR( ptm->tm_year+1900 ) ) doy++; + doy = result->tm_mday; + for (a=0; atm_mon; a++) doy += days_per_month[a]; + if ( result->tm_mon >= 2 && LEAP_YEAR( result->tm_year+1900 ) ) doy++; - ptm->tm_yday = doy; + result->tm_yday = doy; - return ptm; + return result; -} /* gmtime_s */ +#elif defined(_WIN32) -#endif /* defined(_WIN32_WCE) */ + if ( gmtime_s( result, clock ) == 0 ) return result; + return NULL; + +#else + + return gmtime_r( clock, result ); + +#endif + +} /* httplib_gmtime_r */ diff --git a/src/wince_gmtime.c b/src/wince_gmtime.c deleted file mode 100644 index 53067f65..00000000 --- a/src/wince_gmtime.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2016 Lammert Bies - * Copyright (c) 2013-2016 the Civetweb developers - * Copyright (c) 2004-2013 Sergey Lyubka - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * ============ - * Release: 2.0 - */ - -#include "httplib_main.h" - -#if defined(_WIN32_WCE) - -/* - * struct tm *gmtime( const time_t *ptime ); - * - * The function gmtime() is a system function which converts the number since - * EPOCH to a time structure based on UTC. This function is not available on - * all platforms and the implementation here can be used on Windows CE. Please - * note that this implementation is nut fully thread safe if the function is - * also called from threads which have been started outside of LibHTTP. - */ - -struct tm *gmtime( const time_t *ptime ) { - - int i; - - i = XX_httplib_atomic_inc(&XX_httplib_tm_index) % MAX_WORKER_THREADS; - return gmtime_s( ptime, XX_httplib_tm_array + i ); - -} /* gmtime */ - -#endif /* defined(_WIN32_WCE) */