Author: file
Date: Wed Mar  4 17:04:41 2015
New Revision: 432477

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432477
Log:
Implement ast_dns_resolver_set_result and ast_dns_resolver_add_record.

Modified:
    team/group/dns/include/asterisk/dns_internal.h
    team/group/dns/main/dns_core.c

Modified: team/group/dns/include/asterisk/dns_internal.h
URL: 
http://svnview.digium.com/svn/asterisk/team/group/dns/include/asterisk/dns_internal.h?view=diff&rev=432477&r1=432476&r2=432477
==============================================================================
--- team/group/dns/include/asterisk/dns_internal.h (original)
+++ team/group/dns/include/asterisk/dns_internal.h Wed Mar  4 17:04:41 2015
@@ -31,12 +31,12 @@
        int rr_class;
        /*! \brief Time-to-live of the record */
        int ttl;
-       /*! \brief The raw DNS record */
-       char *data;
        /*! \brief The size of the raw DNS record */
        size_t data_len;
        /*! \brief Linked list information */
        AST_LIST_ENTRY(ast_dns_record) list;
+       /*! \brief The raw DNS record */
+       char data[0];
 };
 
 /*! \brief An SRV record */
@@ -79,10 +79,10 @@
        unsigned int secure;
        /*! \brief Whether the result is bogus */
        unsigned int bogus;
-       /*! \brief The canonical name */
-       const char *canonical;
        /*! \brief Records returned */
        AST_LIST_HEAD_NOLOCK(, ast_dns_record) records;
+       /*! \brief The canonical name */
+       char canonical[0];
 };
 
 /*! \brief A DNS query */

Modified: team/group/dns/main/dns_core.c
URL: 
http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_core.c?view=diff&rev=432477&r1=432476&r2=432477
==============================================================================
--- team/group/dns/main/dns_core.c (original)
+++ team/group/dns/main/dns_core.c Wed Mar  4 17:04:41 2015
@@ -101,6 +101,7 @@
 
 void ast_dns_result_free(struct ast_dns_result *result)
 {
+       ao2_cleanup(result);
 }
 
 int ast_dns_record_get_rr_type(const struct ast_dns_record *record)
@@ -333,6 +334,17 @@
        return query->resolver_data;
 }
 
+/*! \brief Destructor for DNS result */
+static void dns_result_destroy(void *obj)
+{
+       struct ast_dns_result *result = obj;
+       struct ast_dns_record *record;
+
+       while ((record = AST_LIST_REMOVE_HEAD(&result->records, list))) {
+               ast_free(record);
+       }
+}
+
 int ast_dns_resolver_set_result(struct ast_dns_query *query, unsigned int 
nxdomain, unsigned int secure, unsigned int bogus,
        const char *canonical)
 {
@@ -340,17 +352,41 @@
                ast_dns_result_free(query->result);
        }
 
-       query->result = NULL;
+       query->result = ao2_alloc_options(sizeof(*query->result) + 
strlen(canonical) + 1, dns_result_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
+       if (!query->result) {
+               return -1;
+       }
+
+       query->result->nxdomain = nxdomain;
+       query->result->secure = secure;
+       query->result->bogus = bogus;
+       strcpy(query->result->canonical, canonical); /* SAFE */
+
        return 0;
 }
 
 int ast_dns_resolver_add_record(struct ast_dns_query *query, int rr_type, int 
rr_class, int ttl, const char *data, const size_t size)
 {
+       struct ast_dns_record *record;
+
        if (!query->result) {
                return -1;
        }
 
-       return -1;
+       record = ast_calloc(1, sizeof(*record) + size);
+       if (!record) {
+               return -1;
+       }
+
+       record->rr_type = rr_type;
+       record->rr_class = rr_class;
+       record->ttl = ttl;
+       memcpy(record->data, data, size);
+       record->data_len = size;
+
+       AST_LIST_INSERT_TAIL(&query->result->records, record, list);
+
+       return 0;
 }
 
 void ast_dns_resolver_completed(const struct ast_dns_query *query)


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to