char const *program;
char const *input;
char const *output;
- fr_dict_attr_t const *input_list;
- fr_dict_attr_t const *output_list;
+ tmpl_t *input_list;
+ tmpl_t *output_list;
bool shell_escape;
bool env_inherit;
fr_time_delta_t timeout;
fr_exec_state_t *exec;
if (inst->input_list) {
- env_pairs = tmpl_list_head(request, inst->input_list);
+ env_pairs = tmpl_list_head(request, tmpl_list(inst->input_list));
if (!env_pairs) {
REDEBUG("Failed to find input pairs for xlat");
return XLAT_ACTION_FAIL;
rlm_exec_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_exec_t);
CONF_SECTION *conf = mctx->inst->conf;
xlat_t *xlat;
- char const *p;
+ tmpl_rules_t list_rules = (tmpl_rules_t) {
+ .attr = {
+ .dict_def = fr_dict_internal(),
+ .list_def = request_attr_request,
+ .prefix = TMPL_ATTR_REF_PREFIX_AUTO
+ }
+ };
xlat = xlat_register_module(NULL, mctx, mctx->inst->name, exec_xlat, FR_TYPE_STRING, 0);
xlat_func_args(xlat, exec_xlat_args);
if (inst->input) {
- p = inst->input;
- p += tmpl_pair_list_name(&inst->input_list, p, NULL);
- if (!inst->input_list || (*p != '\0')) {
- cf_log_err(conf, "Invalid input list '%s'", inst->input);
+ if ((tmpl_afrom_attr_substr(inst, NULL, &inst->input_list,
+ &FR_SBUFF_IN(inst->input, strlen(inst->input)), NULL, &list_rules) < 0) ||
+ !tmpl_is_list(inst->input_list)) {
+ cf_log_perr(conf, "Invalid input list '%s'", inst->input);
return -1;
}
}
if (inst->output) {
- p = inst->output;
- p += tmpl_pair_list_name(&inst->output_list, p, NULL);
- if (!inst->output_list || (*p != '\0')) {
+ if ((tmpl_afrom_attr_substr(inst, NULL, &inst->output_list,
+ &FR_SBUFF_IN(inst->output, strlen(inst->output)), NULL, &list_rules) < 0) ||
+ !tmpl_is_list(inst->output_list)) {
cf_log_err(conf, "Invalid output list '%s'", inst->output);
return -1;
}
* Decide what input/output the program takes.
*/
if (inst->input) {
- env_pairs = tmpl_list_head(request, inst->input_list);
+ env_pairs = tmpl_list_head(request, tmpl_list(inst->input_list));
if (!env_pairs) {
RETURN_MODULE_INVALID;
}
fr_value_box_t *box = fr_value_box_list_head(&m->box);
fr_pair_list_init(&vps);
- output_pairs = tmpl_list_head(request, inst->output_list);
+ output_pairs = tmpl_list_head(request, tmpl_list(inst->output_list));
fr_assert(output_pairs != NULL);
- ctx = tmpl_list_ctx(request, inst->output_list);
+ ctx = tmpl_list_ctx(request, tmpl_list(inst->output_list));
fr_pair_list_afrom_box(ctx, &vps, request->dict, box);
if (!fr_pair_list_empty(&vps)) fr_pair_list_move_op(output_pairs, &vps, T_OP_ADD_EQ);
* Decide what input/output the program takes.
*/
if (inst->input) {
- env_pairs = tmpl_list_head(request, inst->input_list);
+ env_pairs = tmpl_list_head(request, tmpl_list(inst->input_list));
if (!env_pairs) RETURN_MODULE_INVALID;
}
if (inst->output) {
- if (!tmpl_list_head(request, inst->output_list)) {
+ if (!tmpl_list_head(request, tmpl_list(inst->output_list))) {
RETURN_MODULE_INVALID;
}
}