From: Alan T. DeKok Date: Mon, 24 Aug 2020 18:40:25 +0000 (-0400) Subject: add fr_dns_label_from_value_box_dbuff() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=091a7b77f018d2c004018a95be6fafb577b7baca;p=thirdparty%2Ffreeradius-server.git add fr_dns_label_from_value_box_dbuff() which returns <0 when it needs more data --- diff --git a/src/lib/util/dns.c b/src/lib/util/dns.c index 563bf4ab731..187b782590e 100644 --- a/src/lib/util/dns.c +++ b/src/lib/util/dns.c @@ -482,6 +482,32 @@ static bool dns_label_compress(uint8_t const *start, uint8_t const *end, uint8_t return false; } + +/** Encode a single value box of type string, serializing its contents to a dns label + * in a dbuff + * + * @param[in] dbuff Buffer where labels are written + * @param[in] compression Whether or not to do DNS label compression. + * @param[in] value to encode. + * @return + * - >0 the number of bytes written to the dbuff + * - 0 could not encode anything, an error has occurred. + * - <0 the number of bytes the dbuff should have had, instead of "remaining". + */ +ssize_t fr_dns_label_from_value_box_dbuff(fr_dbuff_t *dbuff, bool compression, fr_value_box_t const *value) +{ + ssize_t slen; + size_t need; + + slen = fr_dns_label_from_value_box(&need, dbuff->p, fr_dbuff_remaining(dbuff), dbuff->p, compression, value); + if (slen < 0) return 0; + + if (slen == 0) return -need; + + fr_dbuff_advance(dbuff, slen); + return slen; +} + /** Encode a single value box of type string, serializing its contents to a dns label * * This functions takes a large buffer and encodes the label in part diff --git a/src/lib/util/dns.h b/src/lib/util/dns.h index 3a67595f7d1..231c83dbf47 100644 --- a/src/lib/util/dns.h +++ b/src/lib/util/dns.h @@ -29,6 +29,8 @@ extern "C" { ssize_t fr_dns_label_from_value_box(size_t *need, uint8_t *buf, size_t buflen, uint8_t *where, bool compression, fr_value_box_t const *value); +ssize_t fr_dns_label_from_value_box_dbuff(fr_dbuff_t *dbuff, bool compression, fr_value_box_t const *value); + ssize_t fr_dns_label_uncompressed_length(uint8_t const *buf, size_t buf_len, uint8_t const **p_label); ssize_t fr_dns_label_network_network_length(uint8_t const *buf, size_t buf_len); diff --git a/src/lib/util/misc.c b/src/lib/util/misc.c index d2223e3de4c..22f4ac1a502 100644 --- a/src/lib/util/misc.c +++ b/src/lib/util/misc.c @@ -583,7 +583,7 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str) char *f[4]; char *tail = NULL; fr_time_delta_t gmtoff = 0; - + /* * Test for unix timestamp, which is just a number and * nothing else. @@ -687,7 +687,7 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str) if (*tail == '-') tz *= -1; done: - t = timegm(tm); + t = fr_time_from_utc(tm); if (t == (time_t) -1) { fr_strerror_printf("Failed calling system function to parse time - %s", fr_syserror(errno)); @@ -834,7 +834,7 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str) /* * Returns -1 on failure. */ - t = timegm(tm); + t = fr_time_from_utc(tm); if (t == (time_t) -1) { fr_strerror_printf("Failed calling system function to parse time - %s", fr_syserror(errno));