/* * Verify the result of the map. */ static int csv_map_verify(CONF_SECTION *cs, void *mod_inst, UNUSED void *proc_inst, vp_tmpl_t const *src, vp_map_t const *maps) { rlm_csv_t *inst = mod_inst; vp_map_t const *map; if (!src) { cf_log_err(cs, "Missing file name"); return -1; } for (map = maps; map != NULL; map = map->next) { if (map->rhs->type != TMPL_TYPE_UNPARSED) continue; if (fieldname2offset(inst, map->rhs->name) < 0) { cf_log_err(map->ci, "Unknown field '%s'", map->rhs->name); return -1; } } return 0; }
/** Perform a search and map the result of the search to server attributes * * @param[in] mod_inst #rlm_csv_t * @param[in] proc_inst mapping map entries to field numbers. * @param[in,out] request The current request. * @param[in] key key to look for * @param[in] maps Head of the map list. * @return * - #RLM_MODULE_NOOP no rows were returned. * - #RLM_MODULE_UPDATED if one or more #VALUE_PAIR were added to the #REQUEST. * - #RLM_MODULE_FAIL if an error occurred. */ static rlm_rcode_t mod_map_proc(void *mod_inst, UNUSED void *proc_inst, REQUEST *request, char const *key, vp_map_t const *maps) { rlm_csv_t *inst = mod_inst; rlm_csv_entry_t *e, my_entry; vp_map_t const *map; my_entry.key = key; e = rbtree_finddata(inst->tree, &my_entry); if (!e) return RLM_MODULE_NOOP; RINDENT(); for (map = maps; map != NULL; map = map->next) { int field; char *field_name; /* * Avoid memory allocations if possible. */ if (map->rhs->type != TMPL_TYPE_LITERAL) { if (tmpl_aexpand(request, &field_name, request, map->rhs, NULL, NULL) < 0) { RDEBUG("Failed expanding RHS at %s", map->lhs->name); return RLM_MODULE_FAIL; } } else { memcpy(&field_name, &map->rhs->name, sizeof(field_name)); /* const */ } field = fieldname2offset(inst, field_name); if (field_name != map->rhs->name) talloc_free(field_name); if (field < 0) { RDEBUG("No such field name %s", map->rhs->name); return RLM_MODULE_FAIL; } /* * Pass the raw data to the callback, which will * create the VP and add it to the map. */ if (map_to_request(request, map, csv_map_getvalue, e->data[field]) < 0) { return RLM_MODULE_FAIL; } } return RLM_MODULE_UPDATED; }
/* * Verify the result of the map. */ static int csv_map_verify(UNUSED void *proc_inst, void *mod_inst, UNUSED vp_tmpl_t const *src, vp_map_t const *maps) { rlm_csv_t *inst = mod_inst; vp_map_t const *map; for (map = maps; map != NULL; map = map->next) { if (map->rhs->type != TMPL_TYPE_LITERAL) continue; if (fieldname2offset(inst, map->rhs->name) < 0) { cf_log_err(map->ci, "Unknown field '%s'", map->rhs->name); return -1; } } return 0; }