17b5038d7SDag-Erling Smørgrav /* 27b5038d7SDag-Erling Smørgrav * $Id: duration.c 4518 2011-02-24 15:39:09Z matthijs $ 37b5038d7SDag-Erling Smørgrav * 47b5038d7SDag-Erling Smørgrav * Copyright (c) 2009 NLNet Labs. All rights reserved. 57b5038d7SDag-Erling Smørgrav * 67b5038d7SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 77b5038d7SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 87b5038d7SDag-Erling Smørgrav * are met: 97b5038d7SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 107b5038d7SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer. 117b5038d7SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 127b5038d7SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 137b5038d7SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 147b5038d7SDag-Erling Smørgrav * 157b5038d7SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 167b5038d7SDag-Erling Smørgrav * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 177b5038d7SDag-Erling Smørgrav * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 187b5038d7SDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 197b5038d7SDag-Erling Smørgrav * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 207b5038d7SDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 217b5038d7SDag-Erling Smørgrav * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 227b5038d7SDag-Erling Smørgrav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 237b5038d7SDag-Erling Smørgrav * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 247b5038d7SDag-Erling Smørgrav * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 257b5038d7SDag-Erling Smørgrav * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 267b5038d7SDag-Erling Smørgrav * 277b5038d7SDag-Erling Smørgrav */ 287b5038d7SDag-Erling Smørgrav 297b5038d7SDag-Erling Smørgrav /** 307b5038d7SDag-Erling Smørgrav * 317b5038d7SDag-Erling Smørgrav * This file is copied from the OpenDNSSEC source repository 327b5038d7SDag-Erling Smørgrav * and only slightly adapted to make it fit. 337b5038d7SDag-Erling Smørgrav */ 347b5038d7SDag-Erling Smørgrav 357b5038d7SDag-Erling Smørgrav /** 367b5038d7SDag-Erling Smørgrav * 377b5038d7SDag-Erling Smørgrav * Durations. 387b5038d7SDag-Erling Smørgrav */ 397b5038d7SDag-Erling Smørgrav 407b5038d7SDag-Erling Smørgrav #include <ldns/config.h> 417b5038d7SDag-Erling Smørgrav #include <ldns/duration.h> 427b5038d7SDag-Erling Smørgrav 437b5038d7SDag-Erling Smørgrav #include <stdio.h> 447b5038d7SDag-Erling Smørgrav #include <stdlib.h> 457b5038d7SDag-Erling Smørgrav #include <string.h> 467b5038d7SDag-Erling Smørgrav #include <time.h> 477b5038d7SDag-Erling Smørgrav 487b5038d7SDag-Erling Smørgrav 497b5038d7SDag-Erling Smørgrav /** 507b5038d7SDag-Erling Smørgrav * Create a new 'instant' duration. 517b5038d7SDag-Erling Smørgrav * 527b5038d7SDag-Erling Smørgrav */ 537b5038d7SDag-Erling Smørgrav ldns_duration_type* 547b5038d7SDag-Erling Smørgrav ldns_duration_create(void) 557b5038d7SDag-Erling Smørgrav { 567b5038d7SDag-Erling Smørgrav ldns_duration_type* duration; 577b5038d7SDag-Erling Smørgrav 587b5038d7SDag-Erling Smørgrav duration = malloc(sizeof(ldns_duration_type)); 597b5038d7SDag-Erling Smørgrav if (!duration) { 607b5038d7SDag-Erling Smørgrav return NULL; 617b5038d7SDag-Erling Smørgrav } 627b5038d7SDag-Erling Smørgrav duration->years = 0; 637b5038d7SDag-Erling Smørgrav duration->months = 0; 647b5038d7SDag-Erling Smørgrav duration->weeks = 0; 657b5038d7SDag-Erling Smørgrav duration->days = 0; 667b5038d7SDag-Erling Smørgrav duration->hours = 0; 677b5038d7SDag-Erling Smørgrav duration->minutes = 0; 687b5038d7SDag-Erling Smørgrav duration->seconds = 0; 697b5038d7SDag-Erling Smørgrav return duration; 707b5038d7SDag-Erling Smørgrav } 717b5038d7SDag-Erling Smørgrav 727b5038d7SDag-Erling Smørgrav 737b5038d7SDag-Erling Smørgrav /** 747b5038d7SDag-Erling Smørgrav * Compare durations. 757b5038d7SDag-Erling Smørgrav * 767b5038d7SDag-Erling Smørgrav */ 777b5038d7SDag-Erling Smørgrav int 78*986ba33cSDag-Erling Smørgrav ldns_duration_compare(const ldns_duration_type* d1, const ldns_duration_type* d2) 797b5038d7SDag-Erling Smørgrav { 807b5038d7SDag-Erling Smørgrav if (!d1 && !d2) { 817b5038d7SDag-Erling Smørgrav return 0; 827b5038d7SDag-Erling Smørgrav } 837b5038d7SDag-Erling Smørgrav if (!d1 || !d2) { 847b5038d7SDag-Erling Smørgrav return d1?-1:1; 857b5038d7SDag-Erling Smørgrav } 867b5038d7SDag-Erling Smørgrav 877b5038d7SDag-Erling Smørgrav if (d1->years != d2->years) { 887b5038d7SDag-Erling Smørgrav return (int) (d1->years - d2->years); 897b5038d7SDag-Erling Smørgrav } 907b5038d7SDag-Erling Smørgrav if (d1->months != d2->months) { 917b5038d7SDag-Erling Smørgrav return (int) (d1->months - d2->months); 927b5038d7SDag-Erling Smørgrav } 937b5038d7SDag-Erling Smørgrav if (d1->weeks != d2->weeks) { 947b5038d7SDag-Erling Smørgrav return (int) (d1->weeks - d2->weeks); 957b5038d7SDag-Erling Smørgrav } 967b5038d7SDag-Erling Smørgrav if (d1->days != d2->days) { 977b5038d7SDag-Erling Smørgrav return (int) (d1->days - d2->days); 987b5038d7SDag-Erling Smørgrav } 997b5038d7SDag-Erling Smørgrav if (d1->hours != d2->hours) { 1007b5038d7SDag-Erling Smørgrav return (int) (d1->hours - d2->hours); 1017b5038d7SDag-Erling Smørgrav } 1027b5038d7SDag-Erling Smørgrav if (d1->minutes != d2->minutes) { 1037b5038d7SDag-Erling Smørgrav return (int) (d1->minutes - d2->minutes); 1047b5038d7SDag-Erling Smørgrav } 1057b5038d7SDag-Erling Smørgrav if (d1->seconds != d2->seconds) { 1067b5038d7SDag-Erling Smørgrav return (int) (d1->seconds - d2->seconds); 1077b5038d7SDag-Erling Smørgrav } 1087b5038d7SDag-Erling Smørgrav 1097b5038d7SDag-Erling Smørgrav return 0; 1107b5038d7SDag-Erling Smørgrav } 1117b5038d7SDag-Erling Smørgrav 1127b5038d7SDag-Erling Smørgrav 1137b5038d7SDag-Erling Smørgrav /** 1147b5038d7SDag-Erling Smørgrav * Create a duration from string. 1157b5038d7SDag-Erling Smørgrav * 1167b5038d7SDag-Erling Smørgrav */ 1177b5038d7SDag-Erling Smørgrav ldns_duration_type* 1187b5038d7SDag-Erling Smørgrav ldns_duration_create_from_string(const char* str) 1197b5038d7SDag-Erling Smørgrav { 1207b5038d7SDag-Erling Smørgrav ldns_duration_type* duration = ldns_duration_create(); 1217b5038d7SDag-Erling Smørgrav char* P, *X, *T, *W; 1227b5038d7SDag-Erling Smørgrav int not_weeks = 0; 1237b5038d7SDag-Erling Smørgrav 1247b5038d7SDag-Erling Smørgrav if (!duration) { 1257b5038d7SDag-Erling Smørgrav return NULL; 1267b5038d7SDag-Erling Smørgrav } 1277b5038d7SDag-Erling Smørgrav if (!str) { 1287b5038d7SDag-Erling Smørgrav return duration; 1297b5038d7SDag-Erling Smørgrav } 1307b5038d7SDag-Erling Smørgrav 1317b5038d7SDag-Erling Smørgrav P = strchr(str, 'P'); 1327b5038d7SDag-Erling Smørgrav if (!P) { 1337b5038d7SDag-Erling Smørgrav ldns_duration_cleanup(duration); 1347b5038d7SDag-Erling Smørgrav return NULL; 1357b5038d7SDag-Erling Smørgrav } 1367b5038d7SDag-Erling Smørgrav 1377b5038d7SDag-Erling Smørgrav T = strchr(str, 'T'); 1387b5038d7SDag-Erling Smørgrav X = strchr(str, 'Y'); 1397b5038d7SDag-Erling Smørgrav if (X) { 1407b5038d7SDag-Erling Smørgrav duration->years = (time_t) atoi(str+1); 1417b5038d7SDag-Erling Smørgrav str = X; 1427b5038d7SDag-Erling Smørgrav not_weeks = 1; 1437b5038d7SDag-Erling Smørgrav } 1447b5038d7SDag-Erling Smørgrav X = strchr(str, 'M'); 1457b5038d7SDag-Erling Smørgrav if (X && (!T || (size_t) (X-P) < (size_t) (T-P))) { 1467b5038d7SDag-Erling Smørgrav duration->months = (time_t) atoi(str+1); 1477b5038d7SDag-Erling Smørgrav str = X; 1487b5038d7SDag-Erling Smørgrav not_weeks = 1; 1497b5038d7SDag-Erling Smørgrav } 1507b5038d7SDag-Erling Smørgrav X = strchr(str, 'D'); 1517b5038d7SDag-Erling Smørgrav if (X) { 1527b5038d7SDag-Erling Smørgrav duration->days = (time_t) atoi(str+1); 1537b5038d7SDag-Erling Smørgrav str = X; 1547b5038d7SDag-Erling Smørgrav not_weeks = 1; 1557b5038d7SDag-Erling Smørgrav } 1567b5038d7SDag-Erling Smørgrav if (T) { 1577b5038d7SDag-Erling Smørgrav str = T; 1587b5038d7SDag-Erling Smørgrav not_weeks = 1; 1597b5038d7SDag-Erling Smørgrav } 1607b5038d7SDag-Erling Smørgrav X = strchr(str, 'H'); 1617b5038d7SDag-Erling Smørgrav if (X && T) { 1627b5038d7SDag-Erling Smørgrav duration->hours = (time_t) atoi(str+1); 1637b5038d7SDag-Erling Smørgrav str = X; 1647b5038d7SDag-Erling Smørgrav not_weeks = 1; 1657b5038d7SDag-Erling Smørgrav } 1667b5038d7SDag-Erling Smørgrav X = strrchr(str, 'M'); 1677b5038d7SDag-Erling Smørgrav if (X && T && (size_t) (X-P) > (size_t) (T-P)) { 1687b5038d7SDag-Erling Smørgrav duration->minutes = (time_t) atoi(str+1); 1697b5038d7SDag-Erling Smørgrav str = X; 1707b5038d7SDag-Erling Smørgrav not_weeks = 1; 1717b5038d7SDag-Erling Smørgrav } 1727b5038d7SDag-Erling Smørgrav X = strchr(str, 'S'); 1737b5038d7SDag-Erling Smørgrav if (X && T) { 1747b5038d7SDag-Erling Smørgrav duration->seconds = (time_t) atoi(str+1); 1757b5038d7SDag-Erling Smørgrav str = X; 1767b5038d7SDag-Erling Smørgrav not_weeks = 1; 1777b5038d7SDag-Erling Smørgrav } 1787b5038d7SDag-Erling Smørgrav 1797b5038d7SDag-Erling Smørgrav W = strchr(str, 'W'); 1807b5038d7SDag-Erling Smørgrav if (W) { 1817b5038d7SDag-Erling Smørgrav if (not_weeks) { 1827b5038d7SDag-Erling Smørgrav ldns_duration_cleanup(duration); 1837b5038d7SDag-Erling Smørgrav return NULL; 1847b5038d7SDag-Erling Smørgrav } else { 1857b5038d7SDag-Erling Smørgrav duration->weeks = (time_t) atoi(str+1); 1867b5038d7SDag-Erling Smørgrav str = W; 1877b5038d7SDag-Erling Smørgrav } 1887b5038d7SDag-Erling Smørgrav } 1897b5038d7SDag-Erling Smørgrav return duration; 1907b5038d7SDag-Erling Smørgrav } 1917b5038d7SDag-Erling Smørgrav 1927b5038d7SDag-Erling Smørgrav 1937b5038d7SDag-Erling Smørgrav /** 1947b5038d7SDag-Erling Smørgrav * Get the number of digits in a number. 1957b5038d7SDag-Erling Smørgrav * 1967b5038d7SDag-Erling Smørgrav */ 1977b5038d7SDag-Erling Smørgrav static size_t 1987b5038d7SDag-Erling Smørgrav digits_in_number(time_t duration) 1997b5038d7SDag-Erling Smørgrav { 2007b5038d7SDag-Erling Smørgrav uint32_t period = (uint32_t) duration; 2017b5038d7SDag-Erling Smørgrav size_t count = 0; 2027b5038d7SDag-Erling Smørgrav 2037b5038d7SDag-Erling Smørgrav while (period > 0) { 2047b5038d7SDag-Erling Smørgrav count++; 2057b5038d7SDag-Erling Smørgrav period /= 10; 2067b5038d7SDag-Erling Smørgrav } 2077b5038d7SDag-Erling Smørgrav return count; 2087b5038d7SDag-Erling Smørgrav } 2097b5038d7SDag-Erling Smørgrav 2107b5038d7SDag-Erling Smørgrav 2117b5038d7SDag-Erling Smørgrav /** 2127b5038d7SDag-Erling Smørgrav * Convert a duration to a string. 2137b5038d7SDag-Erling Smørgrav * 2147b5038d7SDag-Erling Smørgrav */ 2157b5038d7SDag-Erling Smørgrav char* 216*986ba33cSDag-Erling Smørgrav ldns_duration2string(const ldns_duration_type* duration) 2177b5038d7SDag-Erling Smørgrav { 2187b5038d7SDag-Erling Smørgrav char* str = NULL, *num = NULL; 2197b5038d7SDag-Erling Smørgrav size_t count = 2; 2207b5038d7SDag-Erling Smørgrav int T = 0; 2217b5038d7SDag-Erling Smørgrav 2227b5038d7SDag-Erling Smørgrav if (!duration) { 2237b5038d7SDag-Erling Smørgrav return NULL; 2247b5038d7SDag-Erling Smørgrav } 2257b5038d7SDag-Erling Smørgrav 2267b5038d7SDag-Erling Smørgrav if (duration->years > 0) { 2277b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->years); 2287b5038d7SDag-Erling Smørgrav } 2297b5038d7SDag-Erling Smørgrav if (duration->months > 0) { 2307b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->months); 2317b5038d7SDag-Erling Smørgrav } 2327b5038d7SDag-Erling Smørgrav if (duration->weeks > 0) { 2337b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->weeks); 2347b5038d7SDag-Erling Smørgrav } 2357b5038d7SDag-Erling Smørgrav if (duration->days > 0) { 2367b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->days); 2377b5038d7SDag-Erling Smørgrav } 2387b5038d7SDag-Erling Smørgrav if (duration->hours > 0) { 2397b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->hours); 2407b5038d7SDag-Erling Smørgrav T = 1; 2417b5038d7SDag-Erling Smørgrav } 2427b5038d7SDag-Erling Smørgrav if (duration->minutes > 0) { 2437b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->minutes); 2447b5038d7SDag-Erling Smørgrav T = 1; 2457b5038d7SDag-Erling Smørgrav } 2467b5038d7SDag-Erling Smørgrav if (duration->seconds > 0) { 2477b5038d7SDag-Erling Smørgrav count = count + 1 + digits_in_number(duration->seconds); 2487b5038d7SDag-Erling Smørgrav T = 1; 2497b5038d7SDag-Erling Smørgrav } 2507b5038d7SDag-Erling Smørgrav if (T) { 2517b5038d7SDag-Erling Smørgrav count++; 2527b5038d7SDag-Erling Smørgrav } 2537b5038d7SDag-Erling Smørgrav 2547b5038d7SDag-Erling Smørgrav str = (char*) calloc(count, sizeof(char)); 2557b5038d7SDag-Erling Smørgrav str[0] = 'P'; 2567b5038d7SDag-Erling Smørgrav str[1] = '\0'; 2577b5038d7SDag-Erling Smørgrav 2587b5038d7SDag-Erling Smørgrav if (duration->years > 0) { 2597b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->years); 2607b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 2617b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uY", (unsigned int) duration->years); 2627b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 2637b5038d7SDag-Erling Smørgrav free((void*) num); 2647b5038d7SDag-Erling Smørgrav } 2657b5038d7SDag-Erling Smørgrav if (duration->months > 0) { 2667b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->months); 2677b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 2687b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uM", (unsigned int) duration->months); 2697b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 2707b5038d7SDag-Erling Smørgrav free((void*) num); 2717b5038d7SDag-Erling Smørgrav } 2727b5038d7SDag-Erling Smørgrav if (duration->weeks > 0) { 2737b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->weeks); 2747b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 2757b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uW", (unsigned int) duration->weeks); 2767b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 2777b5038d7SDag-Erling Smørgrav free((void*) num); 2787b5038d7SDag-Erling Smørgrav } 2797b5038d7SDag-Erling Smørgrav if (duration->days > 0) { 2807b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->days); 2817b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 2827b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uD", (unsigned int) duration->days); 2837b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 2847b5038d7SDag-Erling Smørgrav free((void*) num); 2857b5038d7SDag-Erling Smørgrav } 2867b5038d7SDag-Erling Smørgrav if (T) { 2877b5038d7SDag-Erling Smørgrav str = strncat(str, "T", 1); 2887b5038d7SDag-Erling Smørgrav } 2897b5038d7SDag-Erling Smørgrav if (duration->hours > 0) { 2907b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->hours); 2917b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 2927b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uH", (unsigned int) duration->hours); 2937b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 2947b5038d7SDag-Erling Smørgrav free((void*) num); 2957b5038d7SDag-Erling Smørgrav } 2967b5038d7SDag-Erling Smørgrav if (duration->minutes > 0) { 2977b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->minutes); 2987b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 2997b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uM", (unsigned int) duration->minutes); 3007b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 3017b5038d7SDag-Erling Smørgrav free((void*) num); 3027b5038d7SDag-Erling Smørgrav } 3037b5038d7SDag-Erling Smørgrav if (duration->seconds > 0) { 3047b5038d7SDag-Erling Smørgrav count = digits_in_number(duration->seconds); 3057b5038d7SDag-Erling Smørgrav num = (char*) calloc(count+2, sizeof(char)); 3067b5038d7SDag-Erling Smørgrav snprintf(num, count+2, "%uS", (unsigned int) duration->seconds); 3077b5038d7SDag-Erling Smørgrav str = strncat(str, num, count+2); 3087b5038d7SDag-Erling Smørgrav free((void*) num); 3097b5038d7SDag-Erling Smørgrav } 3107b5038d7SDag-Erling Smørgrav return str; 3117b5038d7SDag-Erling Smørgrav } 3127b5038d7SDag-Erling Smørgrav 3137b5038d7SDag-Erling Smørgrav 3147b5038d7SDag-Erling Smørgrav /** 3157b5038d7SDag-Erling Smørgrav * Convert a duration to a time. 3167b5038d7SDag-Erling Smørgrav * 3177b5038d7SDag-Erling Smørgrav */ 3187b5038d7SDag-Erling Smørgrav time_t 319*986ba33cSDag-Erling Smørgrav ldns_duration2time(const ldns_duration_type* duration) 3207b5038d7SDag-Erling Smørgrav { 3217b5038d7SDag-Erling Smørgrav time_t period = 0; 3227b5038d7SDag-Erling Smørgrav 3237b5038d7SDag-Erling Smørgrav if (duration) { 3247b5038d7SDag-Erling Smørgrav period += (duration->seconds); 3257b5038d7SDag-Erling Smørgrav period += (duration->minutes)*60; 3267b5038d7SDag-Erling Smørgrav period += (duration->hours)*3600; 3277b5038d7SDag-Erling Smørgrav period += (duration->days)*86400; 3287b5038d7SDag-Erling Smørgrav period += (duration->weeks)*86400*7; 3297b5038d7SDag-Erling Smørgrav period += (duration->months)*86400*31; 3307b5038d7SDag-Erling Smørgrav period += (duration->years)*86400*365; 3317b5038d7SDag-Erling Smørgrav 3327b5038d7SDag-Erling Smørgrav /* [TODO] calculate correct number of days in this month/year */ 3337b5038d7SDag-Erling Smørgrav /* 3347b5038d7SDag-Erling Smørgrav if (duration->months || duration->years) { 3357b5038d7SDag-Erling Smørgrav } 3367b5038d7SDag-Erling Smørgrav */ 3377b5038d7SDag-Erling Smørgrav } 3387b5038d7SDag-Erling Smørgrav return period; 3397b5038d7SDag-Erling Smørgrav } 3407b5038d7SDag-Erling Smørgrav 3417b5038d7SDag-Erling Smørgrav 3427b5038d7SDag-Erling Smørgrav /** 3437b5038d7SDag-Erling Smørgrav * Clean up duration. 3447b5038d7SDag-Erling Smørgrav * 3457b5038d7SDag-Erling Smørgrav */ 3467b5038d7SDag-Erling Smørgrav void 3477b5038d7SDag-Erling Smørgrav ldns_duration_cleanup(ldns_duration_type* duration) 3487b5038d7SDag-Erling Smørgrav { 3497b5038d7SDag-Erling Smørgrav if (!duration) { 3507b5038d7SDag-Erling Smørgrav return; 3517b5038d7SDag-Erling Smørgrav } 3527b5038d7SDag-Erling Smørgrav free(duration); 3537b5038d7SDag-Erling Smørgrav return; 3547b5038d7SDag-Erling Smørgrav } 355