Example #1
0
File: conf.c Project: idtek/knot
int64_t conf_int(
	conf_val_t *val)
{
	assert(val != NULL && val->item != NULL);
	assert(val->item->type == YP_TINT ||
	       (val->item->type == YP_TREF &&
	        val->item->var.r.ref->var.g.id->type == YP_TINT));

	if (val->code == KNOT_EOK) {
		conf_val(val);
		return yp_int(val->data);
	} else {
		return val->item->var.i.dflt;
	}
}
Example #2
0
File: conf.c Project: idtek/knot
struct sockaddr_storage conf_addr_range(
	conf_val_t *val,
	struct sockaddr_storage *max_ss,
	int *prefix_len)
{
	assert(val != NULL && val->item != NULL && max_ss != NULL &&
	       prefix_len != NULL);
	assert(val->item->type == YP_TDATA ||
	       (val->item->type == YP_TREF &&
	        val->item->var.r.ref->var.g.id->type == YP_TDATA));

	struct sockaddr_storage out = { AF_UNSPEC };

	if (val->code == KNOT_EOK) {
		conf_val(val);
		out = yp_addr_noport(val->data);
		// addr_type, addr, format, formatted_data (port| addr| empty).
		const uint8_t *format = val->data + sizeof(uint8_t) +
		                        ((out.ss_family == AF_INET) ?
		                        IPV4_PREFIXLEN / 8 : IPV6_PREFIXLEN / 8);
		// See addr_range_to_bin.
		switch (*format) {
		case 1:
			max_ss->ss_family = AF_UNSPEC;
			*prefix_len = yp_int(format + sizeof(uint8_t));
			break;
		case 2:
			*max_ss = yp_addr_noport(format + sizeof(uint8_t));
			*prefix_len = -1;
			break;
		default:
			max_ss->ss_family = AF_UNSPEC;
			*prefix_len = -1;
			break;
		}
	} else {
		max_ss->ss_family = AF_UNSPEC;
		*prefix_len = -1;
	}

	return out;
}
Example #3
0
struct sockaddr_storage yp_addr(
	const uint8_t *data,
	size_t data_len,
	int *num)
{
	struct sockaddr_storage ss = { AF_UNSPEC };

	uint8_t type = *data;
	data += sizeof(type);
	data_len -= sizeof(type);

	// Set binary address length.
	int family;
	size_t bin_addr_len;
	switch (type) {
	case 0:
		family = AF_UNIX;
		bin_addr_len = data_len;
		break;
	case 4:
		family = AF_INET;
		bin_addr_len = sizeof(((struct in_addr *)NULL)->s_addr);
		break;
	case 6:
		family = AF_INET6;
		bin_addr_len = sizeof(((struct in6_addr *)NULL)->s6_addr);
		break;
	default:
		*num = -1;
		return ss;
	}

	sockaddr_set_raw(&ss, family, data, bin_addr_len);
	data += bin_addr_len;
	data_len -= bin_addr_len;

	*num = (data_len == 0) ? -1 : yp_int(data, data_len);

	return ss;
}
Example #4
0
static void str_test(void)
{
	yp_item_t *scheme;
	yp_check_ctx_t *ctx = NULL;

	int ret = yp_scheme_copy(&scheme, static_scheme);
	ok(ret == KNOT_EOK, "scheme copy");
	if (ret != KNOT_EOK) {
		goto error_str;
	}

	ctx = yp_scheme_check_init(scheme);
	ok(ctx != NULL, "create check ctx");
	if (ctx == NULL) {
		goto error_str;
	}

	yp_node_t *node;
	yp_node_t *parent;
	const yp_item_t *id;

	diag("str key0 test");
	STR_CHECK(0, "option", NULL, NULL, "one");
	ok(strcmp(node->item->name + 1, "option") == 0, "name check");
	ok(node->item->type == YP_TOPT, "type check");
	ok(yp_opt(node->data) == 1, "value check");

	diag("str group test");
	STR_CHECK(0, "group", NULL, NULL, NULL);
	ok(strcmp(node->item->name + 1, "group") == 0, "name check");
	ok(node->item->type == YP_TGRP, "type check");
	ok(node->data_len == 0, "value length check");
	STR_CHECK(1, "group", "integer", NULL, "20");
	ok(strcmp(node->item->name + 1, "integer") == 0, "name check");
	ok(node->item->type == YP_TINT, "type check");
	ok(yp_int(node->data) == 20, "value check");
	STR_CHECK(1, "group", "string", NULL, "short");
	ok(strcmp(node->item->name + 1, "string") == 0, "name check");
	ok(node->item->type == YP_TSTR, "type check");
	ok(strcmp(yp_str(node->data), "short") == 0, "value check");
	STR_CHECK(1, "group", "string", NULL, "long string");
	ok(strcmp(node->item->name + 1, "string") == 0, "name check");
	ok(node->item->type == YP_TSTR, "type check");
	ok(strcmp(yp_str(node->data), "long string") == 0, "value check");

	diag("str multi-group test");
	STR_CHECK(0, "multi-group", NULL, NULL, NULL);
	ok(strcmp(node->item->name + 1, "multi-group") == 0, "name check");
	ok(node->item->type == YP_TGRP, "type check");
	ok(node->data_len == 0, "value length check");
	STR_CHECK(0, "multi-group", NULL, "foo", NULL);
	ok(node->id_len > 0, "id check");
	ok(strcmp(node->item->name + 1, "multi-group") == 0, "name check");
	ok(node->item->type == YP_TGRP, "type check");
	ok(node->data_len == 0, "value length check");
	id = node->item->var.g.id;
	ok(strcmp(id->name + 1, "id") == 0, "name check");
	ok(id->type == YP_TSTR, "type check");
	ok(strcmp(yp_str(node->id), "foo") == 0, "value check");
	STR_CHECK(1, "multi-group", "base64", "foo", "Zm9vYmFy");
	id = parent->item->var.g.id;
	ok(strcmp(parent->item->name + 1, "multi-group") == 0, "name check");
	ok(parent->item->type == YP_TGRP, "type check");
	ok(parent->data_len == 0, "value length check");
	ok(strcmp(yp_str(parent->id), "foo") == 0, "value check");
	ok(strcmp(id->name + 1, "id") == 0, "name check");
	ok(id->type == YP_TSTR, "type check");
	ok(strcmp(node->item->name + 1, "base64") == 0, "name check");
	ok(node->item->type == YP_TB64, "type check");
	ok(memcmp(yp_bin(node->data), "foobar", yp_bin_len(node->data)) == 0,
	   "value check");
	ok(node->id_len == 0, "id length check");
	STR_CHECK(0, "reference", NULL, NULL, "foo");
	ok(strcmp(node->item->name + 1, "reference") == 0, "name check");
	ok(node->item->type == YP_TREF, "type check");
	ok(strcmp(yp_str(node->data), "foo") == 0, "value check");

	diag("str check return");
	STR_RET_CHECK(KNOT_YP_EINVAL_ITEM,  "",        "",        "",   "");
	STR_RET_CHECK(KNOT_YP_EINVAL_ITEM,  NULL,      NULL,      NULL, NULL);
	STR_RET_CHECK(KNOT_YP_EINVAL_ITEM,  "unknown", NULL,      NULL, NULL);
	STR_RET_CHECK(KNOT_YP_EINVAL_ITEM,  NULL,      "unknown", NULL, NULL);
	STR_RET_CHECK(KNOT_EINVAL,          "dname",   "",        "",   "");
	STR_RET_CHECK(KNOT_EOK,             "dname",   NULL,      NULL, NULL);
	STR_RET_CHECK(KNOT_EOK,             "dname",   NULL,      NULL, ".");
	STR_RET_CHECK(KNOT_EINVAL,          "dname",   NULL,      NULL, "..");
	STR_RET_CHECK(KNOT_YP_ENOTSUP_ID,   "dname",   NULL,      "id", NULL);
	STR_RET_CHECK(KNOT_YP_EINVAL_ITEM,  "dname",   "unknown", NULL, NULL);

	STR_RET_CHECK(KNOT_EOK,             "group",   "",        "",   "");
	STR_RET_CHECK(KNOT_EOK,             "group",   NULL,      NULL, NULL);
	STR_RET_CHECK(KNOT_YP_ENOTSUP_DATA, "group",   "",        "",   "data");
	STR_RET_CHECK(KNOT_YP_EINVAL_ITEM,  "group",   "unknown", NULL, NULL);
	STR_RET_CHECK(KNOT_EOK,             "group",   "string",  NULL, NULL);
	STR_RET_CHECK(KNOT_EOK,             "group",   "string",  NULL, "data");
	STR_RET_CHECK(KNOT_EOK,             "group",   "string",  NULL, "");
	STR_RET_CHECK(KNOT_YP_ENOTSUP_ID,   "group",   "",        "id", NULL);
	STR_RET_CHECK(KNOT_YP_ENOTSUP_ID,   "group",   "string",  "id", NULL);

	STR_RET_CHECK(KNOT_EOK,             "multi-group", "",    "",      "");
	STR_RET_CHECK(KNOT_EOK,             "multi-group", NULL,  NULL,    NULL);
	STR_RET_CHECK(KNOT_YP_ENOTSUP_DATA, "multi-group", NULL,  NULL,    "data");
	STR_RET_CHECK(KNOT_EOK,             "multi-group", NULL,  "idval", NULL);
	STR_RET_CHECK(KNOT_YP_ENOTSUP_DATA, "multi-group", NULL,  "idval", "data");
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "hex", "idval", NULL);
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "hex", "idval", "data");
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "hex", NULL,    NULL);
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "hex", NULL,    "data");
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "id",  "",      NULL);
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "id",  NULL,    "idval");
	STR_RET_CHECK(KNOT_EOK,             "multi-group", "id",  "idval", NULL);
	STR_RET_CHECK(KNOT_YP_ENOTSUP_DATA, "multi-group", "id",  "idval", "data");

error_str:
	yp_scheme_check_deinit(ctx);
	yp_scheme_free(scheme);
}
Example #5
0
static void parser_test(void)
{
	yp_parser_t yparser;
	yp_parser_t *yp = &yparser;
	yp_item_t *scheme = NULL;
	yp_check_ctx_t *ctx = NULL;

	yp_init(yp);

	int ret = yp_scheme_copy(&scheme, static_scheme);
	ok(ret == KNOT_EOK, "scheme copy");
	if (ret != KNOT_EOK) {
		goto error_parser;
	}

	ctx = yp_scheme_check_init(scheme);
	ok(ctx != NULL, "create check ctx");
	if (ctx == NULL) {
		goto error_parser;
	}

	yp_node_t *node;
	yp_node_t *parent;
	const yp_item_t *id;

	diag("parser key0 test");
	SET_INPUT_STR("option: one");
	PARSER_CHECK(0);
	ok(strcmp(node->item->name + 1, "option") == 0, "name check");
	ok(node->item->type == YP_TOPT, "type check");
	ok(yp_opt(node->data) == 1, "value check");

	diag("parser group test");
	SET_INPUT_STR("group:\n integer: 20\n string: [short, \"long string\"]");
	PARSER_CHECK(0);
	ok(strcmp(node->item->name + 1, "group") == 0, "name check");
	ok(node->item->type == YP_TGRP, "type check");
	ok(node->data_len == 0, "value length check");
	PARSER_CHECK(1);
	ok(strcmp(node->item->name + 1, "integer") == 0, "name check");
	ok(node->item->type == YP_TINT, "type check");
	ok(yp_int(node->data) == 20, "value check");
	PARSER_CHECK(1);
	ok(strcmp(node->item->name + 1, "string") == 0, "name check");
	ok(node->item->type == YP_TSTR, "type check");
	ok(strcmp(yp_str(node->data), "short") == 0, "value check");
	PARSER_CHECK(1);
	ok(strcmp(node->item->name + 1, "string") == 0, "name check");
	ok(node->item->type == YP_TSTR, "type check");
	ok(strcmp(yp_str(node->data), "long string") == 0, "value check");

	diag("parser multi-group test");
	SET_INPUT_STR("multi-group:\n - id: foo\n   base64: Zm9vYmFy\nreference: foo");
	PARSER_CHECK(0);
	ok(strcmp(node->item->name + 1, "multi-group") == 0, "name check");
	ok(node->item->type == YP_TGRP, "type check");
	ok(node->data_len == 0, "value length check");
	PARSER_CHECK(0);
	ok(node->id_len > 0, "id check");
	ok(strcmp(node->item->name + 1, "multi-group") == 0, "name check");
	ok(node->item->type == YP_TGRP, "type check");
	ok(node->data_len == 0, "value length check");
	id = node->item->var.g.id;
	ok(strcmp(id->name + 1, "id") == 0, "name check");
	ok(id->type == YP_TSTR, "type check");
	ok(strcmp(yp_str(node->id), "foo") == 0, "value check");
	PARSER_CHECK(1);
	id = parent->item->var.g.id;
	ok(strcmp(parent->item->name + 1, "multi-group") == 0, "name check");
	ok(parent->item->type == YP_TGRP, "type check");
	ok(parent->data_len == 0, "value length check");
	ok(strcmp(yp_str(parent->id), "foo") == 0, "value check");
	ok(strcmp(id->name + 1, "id") == 0, "name check");
	ok(id->type == YP_TSTR, "type check");
	ok(strcmp(node->item->name + 1, "base64") == 0, "name check");
	ok(node->item->type == YP_TB64, "type check");
	ok(memcmp(yp_bin(node->data), "foobar", yp_bin_len(node->data)) == 0,
	   "value check");
	ok(node->id_len == 0, "id length check");
	PARSER_CHECK(0);
	ok(strcmp(node->item->name + 1, "reference") == 0, "name check");
	ok(node->item->type == YP_TREF, "type check");
	ok(strcmp(yp_str(node->data), "foo") == 0, "value check");

	diag("parser check return");
	SET_INPUT_STR("unknown:");
	PARSER_RET_CHECK(KNOT_YP_EINVAL_ITEM);

	SET_INPUT_STR("group:\n unknown:");
	PARSER_RET_CHECK(KNOT_EOK);
	PARSER_RET_CHECK(KNOT_YP_EINVAL_ITEM);

	SET_INPUT_STR("group:\n - unknown: data");
	PARSER_RET_CHECK(KNOT_EOK);
	PARSER_RET_CHECK(KNOT_YP_EINVAL_ITEM);

	SET_INPUT_STR("group:\n - hex: data");
	PARSER_RET_CHECK(KNOT_EOK);
	PARSER_RET_CHECK(KNOT_YP_EINVAL_ITEM);

	SET_INPUT_STR("dname:");
	PARSER_RET_CHECK(KNOT_EINVAL);

	SET_INPUT_STR("group: data");
	PARSER_RET_CHECK(KNOT_YP_ENOTSUP_DATA);

	SET_INPUT_STR("group:\n integer:");
	PARSER_RET_CHECK(KNOT_EOK);
	PARSER_RET_CHECK(KNOT_EINVAL);

	SET_INPUT_STR("multi-group:\n id:");
	PARSER_RET_CHECK(KNOT_EOK);
	PARSER_RET_CHECK(KNOT_YP_ENODATA);

	SET_INPUT_STR("multi-group:\n hex:");
	PARSER_RET_CHECK(KNOT_EOK);
	PARSER_RET_CHECK(KNOT_YP_ENOID);

error_parser:
	yp_scheme_check_deinit(ctx);
	yp_scheme_free(scheme);
	yp_deinit(yp);
}