Beispiel #1
0
int dnsproxy_load(struct query_plan *plan, struct query_module *self)
{
	if (plan == NULL || self == NULL) {
		return KNOT_EINVAL;
	}

	struct dnsproxy *proxy = mm_alloc(self->mm, sizeof(struct dnsproxy));
	if (proxy == NULL) {
		MODULE_ERR("not enough memory");
		return KNOT_ENOMEM;
	}
	memset(proxy, 0, sizeof(struct dnsproxy));

	conf_val_t val = conf_mod_get(self->config, MOD_REMOTE, self->id);
	if (val.code != KNOT_EOK) {
		if (val.code == KNOT_EINVAL) {
			MODULE_ERR("no remote proxy address for '%s'",
			           self->id->data);
		}
		mm_free(self->mm, proxy);
		return val.code;
	}
	proxy->remote = conf_addr(&val, NULL);

	self->ctx = proxy;

	return query_plan_step(plan, QPLAN_BEGIN, dnsproxy_fwd, self->ctx);
}
Beispiel #2
0
int rosedb_load(struct query_plan *plan, struct query_module *self)
{
	if (self == NULL || plan == NULL) {
		return KNOT_EINVAL;
	}
	
	struct cache *cache = cache_open(self->param, 0, self->mm);
	if (cache == NULL) {
		MODULE_ERR("couldn't open db '%s'", self->param);
		return KNOT_ENOMEM;
	}

	self->ctx = cache;

	return query_plan_step(plan, QPLAN_BEGIN, rosedb_query, cache);
}
Beispiel #3
0
int dnsproxy_load(struct query_plan *plan, struct query_module *self)
{
	struct dnsproxy *proxy = mm_alloc(self->mm, sizeof(struct dnsproxy));
	if (proxy == NULL) {
		MODULE_ERR("not enough memory");
		return KNOT_ENOMEM;
	}
	memset(proxy, 0, sizeof(struct dnsproxy));

	/* Determine IPv4/IPv6 */
	int family = AF_INET;
	if (strchr(self->param, ':')) {
		family = AF_INET6;
	}

	int ret = sockaddr_set(&proxy->remote.addr, family, self->param, 53);
	if (ret != KNOT_EOK) {
		MODULE_ERR("invalid proxy address: '%s'", self->param);
		mm_free(self->mm, proxy);
		return KNOT_EINVAL;
	}

	return query_plan_step(plan, QPLAN_BEGIN, dnsproxy_fwd, proxy);
}
Beispiel #4
0
int synth_record_load(struct query_plan *plan, struct query_module *self)
{
	/* Parse first token. */
	char *saveptr = NULL;
	char *token = strtok_r(self->param, " ", &saveptr);
	if (token == NULL) {
		return KNOT_EFEWDATA;
	}

	/* Create synthesis template. */
	struct synth_template *tpl = mm_alloc(self->mm, sizeof(struct synth_template));
	if (tpl == NULL) {
		return KNOT_ENOMEM;
	}

	/* Save in query module, it takes ownership from now on. */
	self->ctx = tpl;

	/* Supported types: reverse, forward */
	if (strcmp(token, "reverse") == 0) {
		tpl->type = SYNTH_REVERSE;
	} else if (strcmp(token, "forward") == 0) {
		tpl->type = SYNTH_FORWARD;
	} else {
		MODULE_ERR("invalid type '%s'.\n", token);
		return KNOT_ENOTSUP;
	}

	/* Parse format string. */
	tpl->prefix = strtok_r(NULL, " ", &saveptr);
	if (strchr(tpl->prefix, '.') != NULL) {
		MODULE_ERR("dots '.' are not allowed in the prefix.\n");
		return KNOT_EMALF;
	}

	/* Parse zone if generating reverse record. */
	if (tpl->type == SYNTH_REVERSE) {
		tpl->zone = strtok_r(NULL, " ", &saveptr);
		knot_dname_t *check_name = knot_dname_from_str(tpl->zone);
		if (check_name == NULL) {
			MODULE_ERR("invalid zone '%s'.\n", tpl->zone);
			return KNOT_EMALF;
		}
		knot_dname_free(&check_name, NULL);
	}

	/* Parse TTL. */
	tpl->ttl = strtol(strtok_r(NULL, " ", &saveptr), NULL, 10);

	/* Parse address. */
	token = strtok_r(NULL, " ", &saveptr);
	char *subnet = strchr(token, '/');
	if (subnet) {
		subnet[0] = '\0';
		tpl->subnet.prefix = strtol(subnet + 1, NULL, 10);
	}

	/* Estimate family. */
	int family = AF_INET;
	int prefix_max = IPV4_PREFIXLEN;
	if (strchr(token, ':') != NULL) {
		family = AF_INET6;
		prefix_max = IPV6_PREFIXLEN;
	}

	/* Check subnet. */
	if (tpl->subnet.prefix > prefix_max) {
		MODULE_ERR("invalid address prefix '%s'.\n", subnet);
		return KNOT_EMALF;
	}

	int ret = sockaddr_set(&tpl->subnet.ss, family, token, 0);
	if (ret != KNOT_EOK) {
		MODULE_ERR("invalid address '%s'.\n", token);
		return KNOT_EMALF;
	}

	return query_plan_step(plan, QPLAN_ANSWER, solve_synth_record, tpl);
}