return sig;
}
+/**
+ * Checks if a name is wellformed
+ *
+ * @param name the name to check
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_NAMESTORE_check_name (const char * name)
+{
+ if (name == NULL)
+ return GNUNET_SYSERR;
+ if (strlen (name) > 63)
+ return GNUNET_SYSERR;
+ return GNUNET_OK;
+}
+
/**
* Convert the 'value' of a record to a string.
{
char tmp[INET6_ADDRSTRLEN];
struct GNUNET_CRYPTO_ShortHashAsciiEncoded enc;
+ uint16_t mx_pref;
+ char* result;
+ char* soa_rname;
+ char* soa_mname;
+ uint32_t* soa_data;
+ uint32_t soa_serial;
+ uint32_t soa_refresh;
+ uint32_t soa_retry;
+ uint32_t soa_expire;
+ uint32_t soa_min;
switch (type)
{
case GNUNET_DNSPARSER_TYPE_CNAME:
return GNUNET_strndup (data, data_size);
case GNUNET_DNSPARSER_TYPE_SOA:
- GNUNET_break (0);
- // FIXME
- return NULL;
+ soa_rname = (char*)data;
+ soa_mname = (char*)data+strlen(soa_rname)+1;
+ soa_data = (uint32_t*)(soa_mname+strlen(soa_mname)+1);
+ soa_serial = ntohl(soa_data[0]);
+ soa_refresh = ntohl(soa_data[1]);
+ soa_retry = ntohl(soa_data[2]);
+ soa_expire = ntohl(soa_data[3]);
+ soa_min = ntohl(soa_data[4]);
+ if (GNUNET_asprintf(&result, "rname=%s mname=%s %lu,%lu,%lu,%lu,%lu",
+ soa_rname, soa_mname,
+ soa_serial, soa_refresh, soa_retry, soa_expire, soa_min))
+ return result;
+ else
+ return NULL;
case GNUNET_DNSPARSER_TYPE_PTR:
- GNUNET_break (0);
- // FIXME
- return NULL;
+ return GNUNET_strndup (data, data_size);
case GNUNET_DNSPARSER_TYPE_MX:
- GNUNET_break (0);
- // FIXME
- return NULL;
+ mx_pref = ntohs(*((uint16_t*)data));
+ if (GNUNET_asprintf(&result, "%hu,%s", mx_pref, data+sizeof(uint16_t))
+ != 0)
+ return result;
+ else
+ return NULL;
case GNUNET_DNSPARSER_TYPE_TXT:
return GNUNET_strndup (data, data_size);
case GNUNET_DNSPARSER_TYPE_AAAA:
return GNUNET_strdup ((const char*) enc.short_encoding);
case GNUNET_NAMESTORE_TYPE_PSEU:
return GNUNET_strndup (data, data_size);
+ case GNUNET_NAMESTORE_TYPE_LEHO:
+ return GNUNET_strndup (data, data_size);
default:
GNUNET_break (0);
}
{
struct in_addr value_a;
struct in6_addr value_aaaa;
- GNUNET_HashCode pkey;
-
+ struct GNUNET_CRYPTO_ShortHashCode pkey;
+ uint16_t mx_pref;
+ uint16_t mx_pref_n;
+ uint32_t soa_data[5];
+ char result[253];
+ char soa_rname[63];
+ char soa_mname[63];
+ uint32_t soa_serial;
+ uint32_t soa_refresh;
+ uint32_t soa_retry;
+ uint32_t soa_expire;
+ uint32_t soa_min;
+
switch (type)
{
case 0:
*data_size = strlen (s);
return GNUNET_OK;
case GNUNET_DNSPARSER_TYPE_SOA:
- GNUNET_break (0);
- // FIXME
- return GNUNET_SYSERR;
+
+ if (SSCANF(s, "rname=%s mname=%s %u,%u,%u,%u,%u",
+ soa_rname, soa_mname,
+ &soa_serial, &soa_refresh, &soa_retry, &soa_expire, &soa_min)
+ != 7)
+ return GNUNET_SYSERR;
+
+ *data_size = sizeof (soa_data)+strlen(soa_rname)+strlen(soa_mname)+2;
+ *data = GNUNET_malloc (*data_size);
+ soa_data[0] = htonl(soa_serial);
+ soa_data[1] = htonl(soa_refresh);
+ soa_data[2] = htonl(soa_retry);
+ soa_data[3] = htonl(soa_expire);
+ soa_data[4] = htonl(soa_min);
+ strcpy(*data, soa_rname);
+ strcpy(*data+strlen(*data)+1, soa_mname);
+ memcpy(*data+strlen(*data)+1+strlen(soa_mname)+1,
+ soa_data, sizeof(soa_data));
+ return GNUNET_OK;
+
case GNUNET_DNSPARSER_TYPE_PTR:
- GNUNET_break (0);
- // FIXME
- return GNUNET_SYSERR;
+ *data = GNUNET_strdup (s);
+ *data_size = strlen (s);
+ return GNUNET_OK;
case GNUNET_DNSPARSER_TYPE_MX:
- GNUNET_break (0);
- // FIXME
- return GNUNET_SYSERR;
+ if (SSCANF(s, "%hu,%s", &mx_pref, result) != 2)
+ return GNUNET_SYSERR;
+ *data_size = sizeof (uint16_t)+strlen(result)+1;
+ *data = GNUNET_malloc (*data_size);
+ mx_pref_n = htons(mx_pref);
+ memcpy(*data, &mx_pref_n, sizeof (uint16_t));
+ strcpy((*data)+sizeof (uint16_t), result);
+ return GNUNET_OK;
case GNUNET_DNSPARSER_TYPE_TXT:
*data = GNUNET_strdup (s);
*data_size = strlen (s);
if (1 != inet_pton (AF_INET6, s, &value_aaaa))
return GNUNET_SYSERR;
*data = GNUNET_malloc (sizeof (struct in6_addr));
+ *data_size = sizeof (struct in6_addr);
memcpy (*data, &value_aaaa, sizeof (value_aaaa));
return GNUNET_OK;
case GNUNET_NAMESTORE_TYPE_PKEY:
if (GNUNET_OK !=
- GNUNET_CRYPTO_hash_from_string (s, &pkey))
+ GNUNET_CRYPTO_short_hash_from_string (s, &pkey))
return GNUNET_SYSERR;
- *data = GNUNET_malloc (sizeof (GNUNET_HashCode));
+ *data = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode));
memcpy (*data, &pkey, sizeof (pkey));
- *data_size = sizeof (GNUNET_HashCode);
+ *data_size = sizeof (struct GNUNET_CRYPTO_ShortHashCode);
return GNUNET_OK;
case GNUNET_NAMESTORE_TYPE_PSEU:
*data = GNUNET_strdup (s);
*data_size = strlen (s);
return GNUNET_OK;
+ case GNUNET_NAMESTORE_TYPE_LEHO:
+ *data = GNUNET_strdup (s);
+ *data_size = strlen (s);
+ return GNUNET_OK;
default:
GNUNET_break (0);
}
{ "AAAA", GNUNET_DNSPARSER_TYPE_AAAA },
{ "PKEY", GNUNET_NAMESTORE_TYPE_PKEY },
{ "PSEU", GNUNET_NAMESTORE_TYPE_PSEU },
+ { "LEHO", GNUNET_NAMESTORE_TYPE_LEHO },
{ NULL, UINT32_MAX }
};