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; } }
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; }
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; }
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); }
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); }