continue;
}
- if (tmpl_request(attr->lhs) != tmpl_request(map->lhs)) {
+ if (tmpl_request_ref_list_cmp(tmpl_request(attr->lhs), tmpl_request(map->lhs)) != 0) {
+ char *attr_request;
+ char *map_request;
+
+ tmpl_request_ref_list_aprint(NULL, &attr_request, tmpl_request(attr->lhs));
+ tmpl_request_ref_list_aprint(NULL, &map_request, tmpl_request(map->lhs));
+
RWDEBUG("valuepair \"%pV\" has conflicting request qualifier (%s vs %s), skipping...",
fr_box_strvalue_len(self->values[i]->bv_val, self->values[i]->bv_len),
- fr_table_str_by_value(tmpl_request_ref_table, tmpl_request(attr->lhs), "<INVALID>"),
- fr_table_str_by_value(tmpl_request_ref_table, tmpl_request(map->lhs), "<INVALID>"));
+ attr_request, map_request);
+
+ talloc_free(attr_request);
+ talloc_free(map_request);
+
next_pair:
talloc_free(attr);
continue;
/** @name Print the contents of a #tmpl_t
* @{
*/
-ssize_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull(1));
+fr_slen_t tmpl_request_ref_list_print(fr_sbuff_t *out, FR_DLIST_HEAD(tmpl_request_list) const *rql)
+ CC_HINT(nonnull(1,2));
-ssize_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt,
- tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) CC_HINT(nonnull(1));
+static inline fr_slen_t tmpl_request_ref_list_aprint(TALLOC_CTX *ctx, char **out, FR_DLIST_HEAD(tmpl_request_list) const *rql)
+ SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_request_ref_list_print, rql)
-ssize_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull);
+fr_slen_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull(1,2));
+
+static inline fr_slen_t tmpl_attr_aprint(TALLOC_CTX *ctx, char **out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix)
+ SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_attr_print, vpt, ar_prefix)
+
+fr_slen_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt,
+ tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) CC_HINT(nonnull(1,2));
+
+static inline fr_slen_t tmpl_aprint(TALLOC_CTX *ctx, char **out, tmpl_t const *vpt,
+ tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules)
+ SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_print, vpt, ar_prefix, e_rules)
+
+fr_slen_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull);
+
+static inline fr_slen_t tmpl_aprint_quoted(TALLOC_CTX *ctx, char **out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix)
+ SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_print_quoted, vpt, ar_prefix)
/** @} */
/** @name Expand the tmpl, returning one or more values
/** @name Print the contents of a #tmpl_t
* @{
*/
+fr_slen_t tmpl_request_ref_list_print(fr_sbuff_t *out, FR_DLIST_HEAD(tmpl_request_list) const *rql)
+{
+ fr_sbuff_t our_out = FR_SBUFF(out);
+ tmpl_request_t *rr = tmpl_request_list_head(rql);
+
+ /*
+ * Print request references
+ */
+ while (rr) {
+ FR_SBUFF_IN_TABLE_STR_RETURN(&our_out, tmpl_request_ref_table, rr->request, "<INVALID>");
+ rr = tmpl_request_list_next(rql, rr);
+ if (rr) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.');
+ }
+
+ return fr_sbuff_set(out, &our_out);
+}
/** Print an attribute or list #tmpl_t to a string
*
* - 0 invalid argument.
* - <0 the number of bytes we would have needed to complete the print.
*/
-ssize_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix)
+fr_slen_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix)
{
- tmpl_request_t *rr = NULL;
tmpl_attr_t *ar = NULL;
fr_da_stack_t stack;
char printed_rr = false;
fr_sbuff_t our_out = FR_SBUFF(out);
-
- if (unlikely(!vpt)) return 0;
+ fr_slen_t slen;
TMPL_VERIFY(vpt);
/*
* Print request references
*/
- while ((rr = tmpl_request_list_next(&vpt->data.attribute.rr, rr))) {
- if (rr->request == REQUEST_CURRENT) continue; /* Don't print the default request */
-
- FR_SBUFF_IN_TABLE_STR_RETURN(&our_out, tmpl_request_ref_table, rr->request, "<INVALID>");
- printed_rr = true;
- }
+ slen = tmpl_request_ref_list_print(&our_out, &vpt->data.attribute.rr);
+ if (slen > 0) printed_rr = true;
+ if (slen < 0) return slen;
/*
* Print list
* - 0 invalid argument.
* - <0 the number of bytes we would have needed to complete the print.
*/
-ssize_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt,
- tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules)
+fr_slen_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt,
+ tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules)
{
fr_sbuff_t our_out = FR_SBUFF(out);
* - 0 invalid argument.
* - <0 the number of bytes we would have needed to complete the print.
*/
-ssize_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix)
+fr_slen_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix)
{
fr_sbuff_t our_out = FR_SBUFF(out);