Docs / SDK / C / DNS

C — módulo DNS

dns.h / dns.c. Envuelve la API de DNS (/v1/dns/*): zonas y registros. Cada función devuelve un tri-estado: 0 éxito, 1 error de la API (con mensaje), -1 error de transporte.

Compilar y crear el objeto

make
cc miprograma.c -Lruta/a/webability-c -lwebability_api -lcurl -lcrypto -o miprograma
#include "webability_api.h"
#include "dns.h"

wa_api_t api = wa_api_new("tu-client-id", "tu-token-secreto");
wa_dns_t dns = wa_dns_new(&api);
/* ... */
wa_api_free(&api); /* al terminar */

wa_dns_list_zones(const wa_dns_t *dns, wa_dns_zone_list_t *out, char **out_error)

GET /v1/dns/zone — lista las zonas (dominios) del cliente.

wa_dns_zone_list_t zones;
char *err = NULL;
if (wa_dns_list_zones(&dns, &zones, &err) != 0) {
    fprintf(stderr, "error: %s\n", err);
    free(err);
} else {
    for (size_t i = 0; i < zones.count; i++) {
        printf("%ld %s %s\n", zones.zones[i].key, zones.zones[i].name, zones.zones[i].primaryns);
    }
    wa_dns_zone_list_free(&zones);
}

wa_dns_get_zone(const wa_dns_t *dns, const char *key_or_domain, wa_dns_zone_detail_t *out, char **out_error)

GET /v1/dns/zone/{key|domain} — detalle de una zona y sus registros. Acepta la clave numérica o el nombre de dominio.

wa_dns_zone_detail_t zone;
char *err = NULL;
if (wa_dns_get_zone(&dns, "midominio.com", &zone, &err) == 0) {
    printf("%s %ld\n", zone.zone.name, zone.zone.status);
    for (size_t i = 0; i < zone.records_count; i++) {
        printf("%s %s %s\n", zone.records[i].name, zone.records[i].rrtypename, zone.records[i].data);
    }
    wa_dns_zone_detail_free(&zone);
}

wa_dns_add_zone(const wa_dns_t *dns, const char *name, long *out_key, char **out_error)

POST /v1/dns/zone — crea una nueva zona (dominio). Los NS de la cuenta se agregan automáticamente.

long zone_key;
char *err = NULL;
if (wa_dns_add_zone(&dns, "midominio.com", &zone_key, &err) == 0) {
    printf("zona creada: %ld\n", zone_key);
}

wa_dns_add_record(const wa_dns_t *dns, long zone_key, const wa_dns_record_input_t *record, long *out_key, char **out_error)

POST /v1/dns/zone/{key}/record — agrega un registro a una zona.

wa_dns_record_input_t record = {
    .name = "@", .rrtype = "A", .ttl = 1800, .data = "203.0.113.10",
};
long record_key;
char *err = NULL;
if (wa_dns_add_record(&dns, zone_key, &record, &record_key, &err) == 0) {
    printf("registro creado: %ld\n", record_key);
}

wa_dns_record_input_t también tiene priority, weight, port y tag (para MX, SRV, CAA, etc.; 0/NULL equivale a "no aplica").

wa_dns_update_record(const wa_dns_t *dns, long record_key, const wa_dns_record_update_t *fields, char **out_error)

PUT /v1/dns/record/{key} — modifica un registro existente. wa_dns_record_update_t usa un flag has_* por campo: solo los marcados con 1 se envían.

wa_dns_record_update_t fields = {0};
fields.has_ttl = 1;  fields.ttl = 3600;
fields.has_data = 1; fields.data = "203.0.113.20";
char *err = NULL;
wa_dns_update_record(&dns, record_key, &fields, &err);

wa_dns_delete_record(const wa_dns_t *dns, long record_key, char **out_error)

DELETE /v1/dns/record/{key} — elimina un registro.

char *err = NULL;
wa_dns_delete_record(&dns, record_key, &err);

wa_dns_delete_zone(const wa_dns_t *dns, long zone_key, char **out_error)

DELETE /v1/dns/zone/{key} — elimina una zona y todos sus registros.

char *err = NULL;
wa_dns_delete_zone(&dns, zone_key, &err);

Todo out_error que se reserve (código de retorno 1 o -1) debe liberarse con free(). Referencia completa de la API HTTP (headers, códigos de error, formato de respuesta): /documentacion/dns.