gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r28839 - in gnunet/src: dns include


From: gnunet
Subject: [GNUnet-SVN] r28839 - in gnunet/src: dns include
Date: Sat, 24 Aug 2013 11:02:49 +0200

Author: grothoff
Date: 2013-08-24 11:02:49 +0200 (Sat, 24 Aug 2013)
New Revision: 28839

Modified:
   gnunet/src/dns/dnsparser.c
   gnunet/src/include/gnunet_dnsparser_lib.h
Log:
-exposing dnsparser record packing API

Modified: gnunet/src/dns/dnsparser.c
===================================================================
--- gnunet/src/dns/dnsparser.c  2013-08-24 08:46:28 UTC (rev 28838)
+++ gnunet/src/dns/dnsparser.c  2013-08-24 09:02:49 UTC (rev 28839)
@@ -311,7 +311,7 @@
     return GNUNET_OK;
   case GNUNET_DNSPARSER_TYPE_SOA:
     old_off = *off;
-    r->data.soa = GNUNET_malloc (sizeof (struct GNUNET_DNSPARSER_SoaRecord));
+    r->data.soa = GNUNET_new (struct GNUNET_DNSPARSER_SoaRecord);
     r->data.soa->mname = parse_name (udp_payload,
                                     udp_payload_length,
                                     off, 0);
@@ -338,7 +338,7 @@
       return GNUNET_SYSERR;
     memcpy (&mxpref, &udp_payload[*off], sizeof (uint16_t));    
     (*off) += sizeof (uint16_t);
-    r->data.mx = GNUNET_malloc (sizeof (struct GNUNET_DNSPARSER_MxRecord));
+    r->data.mx = GNUNET_new (struct GNUNET_DNSPARSER_MxRecord);
     r->data.mx->preference = ntohs (mxpref);
     r->data.mx->mxhost = parse_name (udp_payload,
                                     udp_payload_length,
@@ -356,7 +356,7 @@
       return GNUNET_SYSERR;
     memcpy (&srv, &udp_payload[*off], sizeof (struct 
GNUNET_TUN_DnsSrvRecord));    
     (*off) += sizeof (struct GNUNET_TUN_DnsSrvRecord);
-    r->data.srv = GNUNET_malloc (sizeof (struct GNUNET_DNSPARSER_SrvRecord));
+    r->data.srv = GNUNET_new (struct GNUNET_DNSPARSER_SrvRecord);
     r->data.srv->priority = ntohs (srv.prio);
     r->data.srv->weight = ntohs (srv.weight);
     r->data.srv->port = ntohs (srv.port);
@@ -534,6 +534,11 @@
 }
 
 
+/**
+ * Free the given DNS record.
+ * 
+ * @param r record to free
+ */
 static void
 free_record (struct GNUNET_DNSPARSER_Record *r)
 {
@@ -591,22 +596,23 @@
 
 
 /**
- * Add a DNS name to the UDP packet at the given location.
+ * Add a DNS name to the UDP packet at the given location, converting
+ * the name to IDNA notation as necessary.
  *
- * @param dst where to write the name
+ * @param dst where to write the name (UDP packet)
  * @param dst_len number of bytes in @a dst
  * @param off pointer to offset where to write the name (increment by bytes 
used)
  *            must not be changed if there is an error
  * @param name name to write
  * @return #GNUNET_SYSERR if @a name is invalid
  *         #GNUNET_NO if @a name did not fit
- *         #GNUNET_OK if @a name was added to 'dst'
+ *         #GNUNET_OK if @a name was added to @a dst
  */
-static int
-add_name (char *dst,
-         size_t dst_len,
-         size_t *off,
-         const char *name)
+int
+GNUNET_DNSPARSER_builder_add_name (char *dst,
+                                  size_t dst_len,
+                                  size_t *off,
+                                  const char *name)
 {
   const char *dot;
   const char *idna_name;
@@ -670,24 +676,24 @@
  * Add a DNS query to the UDP packet at the given location.
  *
  * @param dst where to write the query
- * @param dst_len number of bytes in dst
+ * @param dst_len number of bytes in @a dst
  * @param off pointer to offset where to write the query (increment by bytes 
used)
  *            must not be changed if there is an error
  * @param query query to write
- * @return #GNUNET_SYSERR if 'query' is invalid
- *         #GNUNET_NO if 'query' did not fit
- *         #GNUNET_OK if 'query' was added to @a dst
+ * @return #GNUNET_SYSERR if @a query is invalid
+ *         #GNUNET_NO if @a query did not fit
+ *         #GNUNET_OK if @a query was added to @a dst
  */
-static int
-add_query (char *dst,
-          size_t dst_len,
-          size_t *off,
-          const struct GNUNET_DNSPARSER_Query *query)
+int
+GNUNET_DNSPARSER_builder_add_query (char *dst,
+                                   size_t dst_len,
+                                   size_t *off,
+                                   const struct GNUNET_DNSPARSER_Query *query)
 {
   int ret;
   struct GNUNET_TUN_DnsQueryLine ql;
 
-  ret = add_name (dst, dst_len - sizeof (struct GNUNET_TUN_DnsQueryLine), off, 
query->name);
+  ret = GNUNET_DNSPARSER_builder_add_name (dst, dst_len - sizeof (struct 
GNUNET_TUN_DnsQueryLine), off, query->name);
   if (ret != GNUNET_OK)
     return ret;
   ql.type = htons (query->type);
@@ -702,7 +708,7 @@
  * Add an MX record to the UDP packet at the given location.
  *
  * @param dst where to write the mx record
- * @param dst_len number of bytes in dst
+ * @param dst_len number of bytes in @a dst
  * @param off pointer to offset where to write the mx information (increment 
by bytes used);
  *            can also change if there was an error
  * @param mx mx information to write
@@ -710,11 +716,11 @@
  *         #GNUNET_NO if @a mx did not fit
  *         #GNUNET_OK if @a mx was added to @a dst
  */
-static int
-add_mx (char *dst,
-       size_t dst_len,
-       size_t *off,
-       const struct GNUNET_DNSPARSER_MxRecord *mx)
+int
+GNUNET_DNSPARSER_builder_add_mx (char *dst,
+                                size_t dst_len,
+                                size_t *off,
+                                const struct GNUNET_DNSPARSER_MxRecord *mx)
 {
   uint16_t mxpref;
 
@@ -723,7 +729,7 @@
   mxpref = htons (mx->preference);
   memcpy (&dst[*off], &mxpref, sizeof (mxpref));
   (*off) += sizeof (mxpref);
-  return add_name (dst, dst_len, off, mx->mxhost);
+  return GNUNET_DNSPARSER_builder_add_name (dst, dst_len, off, mx->mxhost);
 }
 
 
@@ -731,28 +737,28 @@
  * Add an SOA record to the UDP packet at the given location.
  *
  * @param dst where to write the SOA record
- * @param dst_len number of bytes in dst
+ * @param dst_len number of bytes in @a dst
  * @param off pointer to offset where to write the SOA information (increment 
by bytes used)
  *            can also change if there was an error
  * @param soa SOA information to write
  * @return #GNUNET_SYSERR if @a soa is invalid
  *         #GNUNET_NO if @a soa did not fit
- *         #GNUNET_OK if @a soa was added to 'dst'
+ *         #GNUNET_OK if @a soa was added to @a dst
  */
-static int
-add_soa (char *dst,
-        size_t dst_len,
-        size_t *off,
-        const struct GNUNET_DNSPARSER_SoaRecord *soa)
+int
+GNUNET_DNSPARSER_builder_add_soa (char *dst,
+                                 size_t dst_len,
+                                 size_t *off,
+                                 const struct GNUNET_DNSPARSER_SoaRecord *soa)
 {
   struct GNUNET_TUN_DnsSoaRecord sd;
   int ret;
 
-  if ( (GNUNET_OK != (ret = add_name (dst,
+  if ( (GNUNET_OK != (ret = GNUNET_DNSPARSER_builder_add_name (dst,
                                      dst_len,
                                      off,
                                      soa->mname))) ||
-       (GNUNET_OK != (ret = add_name (dst,
+       (GNUNET_OK != (ret = GNUNET_DNSPARSER_builder_add_name (dst,
                                      dst_len,
                                      off,
                                      soa->rname)) ) )
@@ -774,19 +780,19 @@
  * Add an SRV record to the UDP packet at the given location.
  *
  * @param dst where to write the SRV record
- * @param dst_len number of bytes in dst
+ * @param dst_len number of bytes in @a dst
  * @param off pointer to offset where to write the SRV information (increment 
by bytes used)
  *            can also change if there was an error
  * @param srv SRV information to write
  * @return #GNUNET_SYSERR if @a srv is invalid
  *         #GNUNET_NO if @a srv did not fit
- *         #GNUNET_OK if @a srv was added to 'dst'
+ *         #GNUNET_OK if @a srv was added to @a dst
  */
-static int
-add_srv (char *dst,
-        size_t dst_len,
-        size_t *off,
-        const struct GNUNET_DNSPARSER_SrvRecord *srv)
+int
+GNUNET_DNSPARSER_builder_add_srv (char *dst,
+                                 size_t dst_len,
+                                 size_t *off,
+                                 const struct GNUNET_DNSPARSER_SrvRecord *srv)
 {
   struct GNUNET_TUN_DnsSrvRecord sd;
   int ret;
@@ -798,7 +804,7 @@
   sd.port = htons (srv->port);
   memcpy (&dst[*off], &sd, sizeof (sd));
   (*off) += sizeof (sd);
-  if (GNUNET_OK != (ret = add_name (dst,
+  if (GNUNET_OK != (ret = GNUNET_DNSPARSER_builder_add_name (dst,
                                    dst_len,
                                    off,
                                    srv->target)))
@@ -811,13 +817,13 @@
  * Add a DNS record to the UDP packet at the given location.
  *
  * @param dst where to write the query
- * @param dst_len number of bytes in dst
+ * @param dst_len number of bytes in @a dst
  * @param off pointer to offset where to write the query (increment by bytes 
used)
  *            must not be changed if there is an error
  * @param record record to write
- * @return #GNUNET_SYSERR if 'record' is invalid
- *         #GNUNET_NO if 'record' did not fit
- *         #GNUNET_OK if 'record' was added to @a dst
+ * @return #GNUNET_SYSERR if @a record is invalid
+ *         #GNUNET_NO if @a record did not fit
+ *         #GNUNET_OK if @a record was added to @a dst
  */
 static int
 add_record (char *dst,
@@ -842,7 +848,7 @@
                     record->data.srv->service,
                     record->data.srv->proto,
                     record->data.srv->domain_name);
-  ret = add_name (dst, dst_len - sizeof (struct GNUNET_TUN_DnsRecordLine), 
off, name);
+  ret = GNUNET_DNSPARSER_builder_add_name (dst, dst_len - sizeof (struct 
GNUNET_TUN_DnsRecordLine), off, name);
   if (name != record->name)
     GNUNET_free (name);
   if (GNUNET_OK != ret)
@@ -853,18 +859,18 @@
   switch (record->type)
   { 
   case GNUNET_DNSPARSER_TYPE_MX:
-    ret = add_mx (dst, dst_len, &pos, record->data.mx);    
+    ret = GNUNET_DNSPARSER_builder_add_mx (dst, dst_len, &pos, 
record->data.mx);    
     break;
   case GNUNET_DNSPARSER_TYPE_SOA:
-    ret = add_soa (dst, dst_len, &pos, record->data.soa);
+    ret = GNUNET_DNSPARSER_builder_add_soa (dst, dst_len, &pos, 
record->data.soa);
     break;
   case GNUNET_DNSPARSER_TYPE_NS:
   case GNUNET_DNSPARSER_TYPE_CNAME:
   case GNUNET_DNSPARSER_TYPE_PTR:
-    ret = add_name (dst, dst_len, &pos, record->data.hostname);
+    ret = GNUNET_DNSPARSER_builder_add_name (dst, dst_len, &pos, 
record->data.hostname);
     break;
   case GNUNET_DNSPARSER_TYPE_SRV:
-    ret = add_srv (dst, dst_len, &pos, record->data.srv);
+    ret = GNUNET_DNSPARSER_builder_add_srv (dst, dst_len, &pos, 
record->data.srv);
     break;
   default:
     if (pos + record->data.raw.data_len > dst_len)
@@ -900,7 +906,7 @@
 
 
 /**
- * Given a DNS packet, generate the corresponding UDP payload.
+ * Given a DNS packet @a p, generate the corresponding UDP payload.
  * Note that we do not attempt to pack the strings with pointers
  * as this would complicate the code and this is about being 
  * simple and secure, not fast, fancy and broken like bind.
@@ -942,7 +948,7 @@
   trc = GNUNET_NO;
   for (i=0;i<p->num_queries;i++)
   {
-    ret = add_query (tmp, sizeof (tmp), &off, &p->queries[i]);  
+    ret = GNUNET_DNSPARSER_builder_add_query (tmp, sizeof (tmp), &off, 
&p->queries[i]);  
     if (GNUNET_SYSERR == ret)
       return GNUNET_SYSERR;
     if (GNUNET_NO == ret)

Modified: gnunet/src/include/gnunet_dnsparser_lib.h
===================================================================
--- gnunet/src/include/gnunet_dnsparser_lib.h   2013-08-24 08:46:28 UTC (rev 
28838)
+++ gnunet/src/include/gnunet_dnsparser_lib.h   2013-08-24 09:02:49 UTC (rev 
28839)
@@ -429,15 +429,18 @@
 
 
 /**
- * Given a DNS packet, generate the corresponding UDP payload.
+ * Given a DNS packet @a p, generate the corresponding UDP payload.
+ * Note that we do not attempt to pack the strings with pointers
+ * as this would complicate the code and this is about being 
+ * simple and secure, not fast, fancy and broken like bind.
  *
  * @param p packet to pack
  * @param max maximum allowed size for the resulting UDP payload
  * @param buf set to a buffer with the packed message
- * @param buf_length set to the length of buf
- * @return GNUNET_SYSERR if 'p' is invalid
- *         GNUNET_NO if 'p' was truncated (but there is still a result in 
'buf')
- *         GNUNET_OK if 'p' was packed completely into '*buf'
+ * @param buf_length set to the length of @a buf
+ * @return #GNUNET_SYSERR if @a p is invalid
+ *         #GNUNET_NO if @a p was truncated (but there is still a result in @a 
buf)
+ *         #GNUNET_OK if @a p was packed completely into @a buf
  */
 int
 GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p,
@@ -445,5 +448,102 @@
                       char **buf,
                       size_t *buf_length);
 
+/* ***************** low-level packing API ******************** */
 
+/**
+ * Add a DNS name to the UDP packet at the given location, converting
+ * the name to IDNA notation as necessary.
+ *
+ * @param dst where to write the name (UDP packet)
+ * @param dst_len number of bytes in @a dst
+ * @param off pointer to offset where to write the name (increment by bytes 
used)
+ *            must not be changed if there is an error
+ * @param name name to write
+ * @return #GNUNET_SYSERR if @a name is invalid
+ *         #GNUNET_NO if @a name did not fit
+ *         #GNUNET_OK if @a name was added to @a dst
+ */
+int
+GNUNET_DNSPARSER_builder_add_name (char *dst,
+                                  size_t dst_len,
+                                  size_t *off,
+                                  const char *name);
+
+
+/**
+ * Add a DNS query to the UDP packet at the given location.
+ *
+ * @param dst where to write the query
+ * @param dst_len number of bytes in @a dst
+ * @param off pointer to offset where to write the query (increment by bytes 
used)
+ *            must not be changed if there is an error
+ * @param query query to write
+ * @return #GNUNET_SYSERR if @a query is invalid
+ *         #GNUNET_NO if @a query did not fit
+ *         #GNUNET_OK if @a query was added to @a dst
+ */
+int
+GNUNET_DNSPARSER_builder_add_query (char *dst,
+                                   size_t dst_len,
+                                   size_t *off,
+                                   const struct GNUNET_DNSPARSER_Query *query);
+
+
+/**
+ * Add an MX record to the UDP packet at the given location.
+ *
+ * @param dst where to write the mx record
+ * @param dst_len number of bytes in @a dst
+ * @param off pointer to offset where to write the mx information (increment 
by bytes used);
+ *            can also change if there was an error
+ * @param mx mx information to write
+ * @return #GNUNET_SYSERR if @a mx is invalid
+ *         #GNUNET_NO if @a mx did not fit
+ *         #GNUNET_OK if @a mx was added to @a dst
+ */
+int
+GNUNET_DNSPARSER_builder_add_mx (char *dst,
+                                size_t dst_len,
+                                size_t *off,
+                                const struct GNUNET_DNSPARSER_MxRecord *mx);
+
+
+/**
+ * Add an SOA record to the UDP packet at the given location.
+ *
+ * @param dst where to write the SOA record
+ * @param dst_len number of bytes in @a dst
+ * @param off pointer to offset where to write the SOA information (increment 
by bytes used)
+ *            can also change if there was an error
+ * @param soa SOA information to write
+ * @return #GNUNET_SYSERR if @a soa is invalid
+ *         #GNUNET_NO if @a soa did not fit
+ *         #GNUNET_OK if @a soa was added to @a dst
+ */
+int
+GNUNET_DNSPARSER_builder_add_soa (char *dst,
+                                 size_t dst_len,
+                                 size_t *off,
+                                 const struct GNUNET_DNSPARSER_SoaRecord *soa);
+
+
+/**
+ * Add an SRV record to the UDP packet at the given location.
+ *
+ * @param dst where to write the SRV record
+ * @param dst_len number of bytes in @a dst
+ * @param off pointer to offset where to write the SRV information (increment 
by bytes used)
+ *            can also change if there was an error
+ * @param srv SRV information to write
+ * @return #GNUNET_SYSERR if @a srv is invalid
+ *         #GNUNET_NO if @a srv did not fit
+ *         #GNUNET_OK if @a srv was added to @a dst
+ */
+int
+GNUNET_DNSPARSER_builder_add_srv (char *dst,
+                                 size_t dst_len,
+                                 size_t *off,
+                                 const struct GNUNET_DNSPARSER_SrvRecord *srv);
+
+
 #endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]