char rdata[2 * 65536];
} send_ctx_t;
-static send_ctx_t *create_send_ctx(const knot_dname_t *zone_name, ctl_args_t *args)
+static int create_send_ctx(send_ctx_t **out, const knot_dname_t *zone_name,
+ ctl_args_t *args)
{
send_ctx_t *ctx = mm_calloc(&args->mm, 1, sizeof(*ctx));
if (ctx == NULL) {
- return NULL;
+ return KNOT_ENOMEM;
}
ctx->args = args;
// Set the ZONE.
if (knot_dname_to_str(ctx->zone, zone_name, sizeof(ctx->zone)) == NULL) {
mm_free(&args->mm, ctx);
- return NULL;
+ return KNOT_EINVAL;
}
// Set the TYPE filter.
uint16_t type;
if (knot_rrtype_from_string(args->data[KNOT_CTL_IDX_TYPE], &type) != 0) {
mm_free(&args->mm, ctx);
- return NULL;
+ return KNOT_EINVAL;
}
ctx->type_filter = type;
} else {
ctx->type_filter = -1;
}
- return ctx;
+ *out = ctx;
+
+ return KNOT_EOK;
}
static int send_rrset(knot_rrset_t *rrset, send_ctx_t *ctx)
static int zone_read(zone_t *zone, ctl_args_t *args)
{
- send_ctx_t *ctx = create_send_ctx(zone->name, args);
- if (ctx == NULL) {
- return KNOT_ENOMEM;
+ send_ctx_t *ctx;
+ int ret = create_send_ctx(&ctx, zone->name, args);
+ if (ret != KNOT_EOK) {
+ return ret;
}
- int ret = KNOT_EOK;
-
if (args->data[KNOT_CTL_IDX_OWNER] != NULL) {
uint8_t owner[KNOT_DNAME_MAXLEN];
return KNOT_TXN_ENOTEXISTS;
}
- send_ctx_t *ctx = create_send_ctx(zone->name, args);
- if (ctx == NULL) {
- return KNOT_ENOMEM;
+ send_ctx_t *ctx;
+ int ret = create_send_ctx(&ctx, zone->name, args);
+ if (ret != KNOT_EOK) {
+ return ret;
}
ctx->data[KNOT_CTL_IDX_FLAGS] = flag;
- int ret = KNOT_EOK;
-
if (args->data[KNOT_CTL_IDX_OWNER] != NULL) {
uint8_t owner[KNOT_DNAME_MAXLEN];
return zone_flag_txn_get(zone, args, CTL_FLAG_ADD);
}
- send_ctx_t *ctx = create_send_ctx(zone->name, args);
- if (ctx == NULL) {
- return KNOT_ENOMEM;
+ send_ctx_t *ctx;
+ int ret = create_send_ctx(&ctx, zone->name, args);
+ if (ret != KNOT_EOK) {
+ return ret;
}
- int ret = send_changeset(&zone->control_update->change, ctx);
+ ret = send_changeset(&zone->control_update->change, ctx);
mm_free(&args->mm, ctx);
return ret;
}
#include "knot/zone/zone-load.h"
#include "contrib/macros.h"
#include "contrib/string.h"
+#include "contrib/strtonum.h"
#include "contrib/openbsd/strlcat.h"
#include "utils/knotc/commands.h"
#include "utils/knotc/estimator.h"
// Set TTL only with an editing operation.
if (args->argc > idx) {
+ uint32_t num;
uint16_t type;
- if (knot_rrtype_from_string(args->argv[idx], &type) != 0) {
+ if (knot_rrtype_from_string(args->argv[idx], &type) != 0 &&
+ str_to_u32(args->argv[idx], &num) == KNOT_EOK) {
switch (args->desc->cmd) {
case CTL_ZONE_SET:
case CTL_ZONE_UNSET:
idx++;
break;
default:
- return KNOT_EINVAL;
+ break;
}
}
}