* No parent means we need to go hunting through all the dictionaries
*/
if (!parent) {
- slen = fr_dict_attr_by_qualified_name_substr(&dict_err, &da,
- rules->dict_def, name, !rules->disallow_internal);
+ slen = fr_dict_attr_by_qualified_oid_substr(&dict_err, &da,
+ rules->dict_def, name, !rules->disallow_internal);
/*
* Otherwise we're resolving in the context of the last component,
* or its reference in the case of group attributes.
*/
ar = fr_dlist_head(&vpt->data.attribute.ar);
if (ar->type == TMPL_ATTR_TYPE_UNRESOLVED) {
- if (fr_dict_attr_by_qualified_name(&da, vpt->rules.dict_def,
- ar->ar_unresolved, true) != FR_DICT_ATTR_OK) {
+ da = fr_dict_attr_by_qualified_oid(NULL, vpt->rules.dict_def,
+ ar->ar_unresolved, true);
+ if (!da) {
parent = fr_dict_root(vpt->rules.dict_def);
goto unknown;
}
fr_dict_attr_t const *fr_dict_attr_by_name(fr_dict_attr_err_t *err, fr_dict_attr_t const *parent, char const *attr)
CC_HINT(nonnull(2,3));
-ssize_t fr_dict_attr_by_qualified_name_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out,
- fr_dict_t const *dict_def,
- fr_sbuff_t *name, bool fallback);
+ssize_t fr_dict_attr_by_qualified_oid_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out,
+ fr_dict_t const *dict_def,
+ fr_sbuff_t *name, bool fallback);
-fr_dict_attr_err_t fr_dict_attr_by_qualified_name(fr_dict_attr_t const **out,
- fr_dict_t const *dict_def, char const *attr, bool fallback);
+fr_dict_attr_t const *fr_dict_attr_by_qualified_oid(fr_dict_attr_err_t *err,
+ fr_dict_t const *dict_def, char const *attr, bool fallback)
+ CC_HINT(nonnull(3));
fr_dict_attr_t const *fr_dict_attr_by_type(fr_dict_attr_t const *da, fr_type_t type);
* - <= 0 on failure.
* - The number of bytes of name consumed on success.
*/
-ssize_t fr_dict_attr_by_qualified_name_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out,
- fr_dict_t const *dict_def, fr_sbuff_t *name, bool fallback)
+ssize_t fr_dict_attr_by_qualified_oid_substr(fr_dict_attr_err_t *err, fr_dict_attr_t const **out,
+ fr_dict_t const *dict_def, fr_sbuff_t *name, bool fallback)
{
fr_dict_t *dict = NULL;
fr_dict_t *dict_iter = NULL;
/** Locate a qualified #fr_dict_attr_t by its name and a dictionary qualifier
*
- * @param[out] out Dictionary found attribute.
+ * @param[out] err Why parsing failed. May be NULL.
+ * @see fr_dict_attr_err_t.
* @param[in] dict_def Default dictionary for non-qualified dictionaries.
* @param[in] name Dictionary/Attribute name.
* @param[in] fallback If true, fallback to the internal dictionary.
* @return an #fr_dict_attr_err_t value.
*/
-fr_dict_attr_err_t fr_dict_attr_by_qualified_name(fr_dict_attr_t const **out, fr_dict_t const *dict_def,
- char const *name, bool fallback)
+fr_dict_attr_t const *fr_dict_attr_by_qualified_oid(fr_dict_attr_err_t *err, fr_dict_t const *dict_def,
+ char const *name, bool fallback)
{
ssize_t slen;
- fr_dict_attr_err_t err = FR_DICT_ATTR_PARSE_ERROR;
fr_sbuff_t our_name;
+ fr_dict_attr_t const *da;
fr_sbuff_init(&our_name, name, strlen(name) + 1);
- slen = fr_dict_attr_by_qualified_name_substr(&err, out, dict_def, &our_name, fallback);
- if (slen <= 0) return err;
+ slen = fr_dict_attr_by_qualified_oid_substr(err, &da, dict_def, &our_name, fallback);
+ if (slen <= 0) return NULL;
if ((size_t)slen != fr_sbuff_len(&our_name)) {
fr_strerror_printf("Trailing garbage after attr string \"%s\"", name);
- return FR_DICT_ATTR_PARSE_ERROR;
+ if (err) *err = FR_DICT_ATTR_PARSE_ERROR;
+ return NULL;
}
- return FR_DICT_ATTR_OK;
+ return da;
}
/** Lookup a attribute by its its vendor and attribute numbers and data type
* It's not found in the dictionary, so we use
* another method to create the attribute.
*/
- if (fr_dict_attr_by_qualified_name(&da, dict, attrname, true) != FR_DICT_ATTR_OK) {
+ da = fr_dict_attr_by_qualified_oid(NULL, dict, attrname, true);
+ if (da) {
vp = fr_pair_make_unknown(ctx, dict, attrname, value, op);
if (!vp) return NULL;
attr = cf_pair_attr(cf_item_to_pair(ci));
if (!attr) continue; /* pair-anoia */
- if (fr_dict_attr_by_qualified_name(&da, dict_radius, attr, false) != FR_DICT_ATTR_OK) {
+ da = fr_dict_attr_by_qualified_oid(NULL, dict_radius, attr, false);
+ if (da) {
cf_log_perr(conf, "Failed resolving attribute");
return -1;
}
return -1;
}
- if (fr_dict_attr_by_qualified_name(&da, dict_freeradius,
- inst->pwd_fmt->field[key_field], true) != FR_DICT_ATTR_OK) {
+ da = fr_dict_attr_by_qualified_oid(NULL, dict_freeradius,
+ inst->pwd_fmt->field[key_field], true);
+ if (!da) {
PERROR("Unable to resolve attribute");
release_ht(inst->ht);
inst->ht = NULL;
goto error;
}
- if (fr_dict_attr_by_qualified_name(&inst->group_da, dict_freeradius,
- group_attribute, false) != FR_DICT_ATTR_OK) {
+ inst->group_da = fr_dict_attr_by_qualified_oid(NULL, dict_freeradius, group_attribute, false);
+ if (!inst->group_da) {
PERROR("Failed resolving group attribute");
goto error;
}
return -1;
}
- if (fr_dict_attr_by_qualified_name(&inst->allocated_address_da,
- dict_freeradius, inst->allocated_address_attr, false) != FR_DICT_ATTR_OK) {
+ inst->allocated_address_da = fr_dict_attr_by_qualified_oid(NULL, dict_freeradius,
+ inst->allocated_address_attr, false);
+ if (!inst->allocated_address_da) {
cf_log_perr(conf, "Failed resolving attribute");
return -1;
}