#include "dns.h"
#include <ctype.h>
static DNS_ERROR LabelList( TALLOC_CTX *mem_ctx,
const char *name,
struct dns_domain_label **presult )
{
struct dns_domain_label *result;
const char *dot;
for (dot = name; *dot != '\0'; dot += 1) {
if (*dot == '.') {
break;
}
}
if ((dot - name) > 63) {
return ERROR_DNS_INVALID_NAME;
}
if (!(result = TALLOC_ZERO_P(mem_ctx, struct dns_domain_label))) {
return ERROR_DNS_NO_MEMORY;
}
if (*dot == '\0') {
if (!(result->label = talloc_strdup(result, name))) {
TALLOC_FREE(result);
return ERROR_DNS_NO_MEMORY;
}
result->len = strlen(result->label);
*presult = result;
return ERROR_DNS_SUCCESS;
}
if (dot[1] == '.') {
TALLOC_FREE(result);
return ERROR_DNS_INVALID_NAME;
}
if (dot[1] != '\0') {
DNS_ERROR err = LabelList(result, dot+1, &result->next);
if (!ERR_DNS_IS_OK(err)) {
TALLOC_FREE(result);
return err;
}
}
result->len = (dot - name);
if (!(result->label = talloc_strndup(result, name, result->len))) {
TALLOC_FREE(result);
return ERROR_DNS_NO_MEMORY;
}
*presult = result;
return ERROR_DNS_SUCCESS;
}
DNS_ERROR dns_domain_name_from_string( TALLOC_CTX *mem_ctx,
const char *pszDomainName,
struct dns_domain_name **presult )
{
struct dns_domain_name *result;
DNS_ERROR err;
if (!(result = talloc(mem_ctx, struct dns_domain_name))) {
return ERROR_DNS_NO_MEMORY;
}
err = LabelList( result, pszDomainName, &result->pLabelList );
if (!ERR_DNS_IS_OK(err)) {
TALLOC_FREE(result);
return err;
}
*presult = result;
return ERROR_DNS_SUCCESS;
}
char *dns_generate_keyname( TALLOC_CTX *mem_ctx )
{
char *result = NULL;
#if defined(WITH_DNS_UPDATES)
uuid_t uuid;
if (!(result = TALLOC_ARRAY(mem_ctx, char, 37))) {
return NULL;
}
uuid_generate( uuid );
uuid_unparse( uuid, result );
#endif
return result;
}