isc_result_t dns_time64_totext(isc_int64_t t, isc_buffer_t *target) { struct tm tm; char buf[sizeof("YYYYMMDDHHMMSS")]; int secs; unsigned int l; isc_region_t region; REQUIRE(t >= 0); #define is_leap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) #define year_secs(y) ((is_leap(y) ? 366 : 365 ) * 86400) #define month_secs(m,y) ((days[m] + ((m == 1 && is_leap(y)) ? 1 : 0 )) * 86400) tm.tm_year = 70; while ((secs = year_secs(tm.tm_year + 1900)) <= t) { t -= secs; tm.tm_year++; if (tm.tm_year + 1900 > 9999) return (ISC_R_RANGE); } tm.tm_mon = 0; while ((secs = month_secs(tm.tm_mon, tm.tm_year + 1900)) <= t) { t -= secs; tm.tm_mon++; } tm.tm_mday = 1; while (86400 <= t) { t -= 86400; tm.tm_mday++; } tm.tm_hour = 0; while (3600 <= t) { t -= 3600; tm.tm_hour++; } tm.tm_min = 0; while (60 <= t) { t -= 60; tm.tm_min++; } tm.tm_sec = (int)t; /* yyyy mm dd HH MM SS */ snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); isc_buffer_availableregion(target, ®ion); l = strlen(buf); if (l > region.length) return (ISC_R_NOSPACE); memcpy(region.base, buf, l); isc_buffer_add(target, l); return (ISC_R_SUCCESS); }
isc_result_t dns_time64_totext(isc_int64_t t, isc_buffer_t *target) { struct tm tm; char buf[sizeof("!!!!!!YYYY!!!!!!!!MM!!!!!!!!DD!!!!!!!!HH!!!!!!!!MM!!!!!!!!SS")]; int secs; unsigned int l; isc_region_t region; /* * Warning. Do NOT use arguments with side effects with these macros. */ #define is_leap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) #define year_secs(y) ((is_leap(y) ? 366 : 365 ) * 86400) #define month_secs(m,y) ((days[m] + ((m == 1 && is_leap(y)) ? 1 : 0 )) * 86400) tm.tm_year = 70; while (t < 0) { if (tm.tm_year == 0) return (ISC_R_RANGE); tm.tm_year--; secs = year_secs(tm.tm_year + 1900); t += secs; } while ((secs = year_secs(tm.tm_year + 1900)) <= t) { t -= secs; tm.tm_year++; if (tm.tm_year + 1900 > 9999) return (ISC_R_RANGE); } tm.tm_mon = 0; while ((secs = month_secs(tm.tm_mon, tm.tm_year + 1900)) <= t) { t -= secs; tm.tm_mon++; } tm.tm_mday = 1; while (86400 <= t) { t -= 86400; tm.tm_mday++; } tm.tm_hour = 0; while (3600 <= t) { t -= 3600; tm.tm_hour++; } tm.tm_min = 0; while (60 <= t) { t -= 60; tm.tm_min++; } tm.tm_sec = (int)t; /* yyyy mm dd HH MM SS */ snprintf(buf, sizeof(buf), "%04d%02d%02d%02d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); isc_buffer_availableregion(target, ®ion); l = strlen(buf); if (l > region.length) return (ISC_R_NOSPACE); memmove(region.base, buf, l); isc_buffer_add(target, l); return (ISC_R_SUCCESS); }