]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add fr_dns_label_from_value_box_dbuff()
authorAlan T. DeKok <aland@freeradius.org>
Mon, 24 Aug 2020 18:40:25 +0000 (14:40 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 24 Aug 2020 18:40:25 +0000 (14:40 -0400)
which returns <0 when it needs more data

src/lib/util/dns.c
src/lib/util/dns.h
src/lib/util/misc.c

index 563bf4ab731aee86254e0ccd2bf5bc69203c3798..187b782590eab87c2d8c30a53d613bf5a7d55056 100644 (file)
@@ -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
index 3a67595f7d17176f083cf8e224b1ff6278e49c53..231c83dbf471f0fe793b1fd0d0c5a771b7afe285 100644 (file)
@@ -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);
index d2223e3de4c5c2fdc00390278bb3135a24874a3a..22f4ac1a50227e1a9192e45c500c40b81bc09b48 100644 (file)
@@ -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));