📄 modcall.c
字号:
MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 2, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }, /* preacct */ { /* group */ { MOD_ACTION_RETURN, /* reject */ MOD_ACTION_RETURN, /* fail */ 2, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ 1, /* noop */ 3 /* updated */ }, /* redundant */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ }, /* append */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 2, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }, /* accounting */ { /* group */ { MOD_ACTION_RETURN, /* reject */ MOD_ACTION_RETURN, /* fail */ 2, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ 1, /* noop */ 3 /* updated */ }, /* redundant */ { 1, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ 1, /* invalid */ 1, /* userlock */ 1, /* notfound */ 2, /* noop */ 4 /* updated */ }, /* append */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 2, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }, /* checksimul */ { /* group */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ }, /* redundant */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ }, /* append */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }, /* pre-proxy */ { /* group */ { MOD_ACTION_RETURN, /* reject */ MOD_ACTION_RETURN, /* fail */ 3, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 1, /* notfound */ 2, /* noop */ 4 /* updated */ }, /* redundant */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ }, /* append */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 2, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }, /* post-proxy */ { /* group */ { MOD_ACTION_RETURN, /* reject */ MOD_ACTION_RETURN, /* fail */ 3, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 1, /* notfound */ 2, /* noop */ 4 /* updated */ }, /* redundant */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ }, /* append */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 2, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }, /* post-auth */ { /* group */ { MOD_ACTION_RETURN, /* reject */ MOD_ACTION_RETURN, /* fail */ 3, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 1, /* notfound */ 2, /* noop */ 4 /* updated */ }, /* redundant */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ MOD_ACTION_RETURN, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ }, /* append */ { MOD_ACTION_RETURN, /* reject */ 1, /* fail */ MOD_ACTION_RETURN, /* ok */ MOD_ACTION_RETURN, /* handled */ MOD_ACTION_RETURN, /* invalid */ MOD_ACTION_RETURN, /* userlock */ 2, /* notfound */ MOD_ACTION_RETURN, /* noop */ MOD_ACTION_RETURN /* updated */ } }};/* Bail out if the module in question does not supply the wanted component */static void sanity_check(int component, module_instance_t *inst, const char *filename){ if (!inst->entry->module->methods[component]) { radlog(L_ERR|L_CONS, "%s: \"%s\" modules aren't allowed in '%s' sections -- they have no such method.", filename, inst->entry->module->name, component_names[component]); exit(1); }}/* Parse a CONF_SECTION containing only result=action pairs */static void override_actions(modcallable *c, CONF_SECTION *cs, const char *filename){ CONF_ITEM *ci; CONF_PAIR *cp; const char *attr, *value; int lineno, rcode, action; for(ci=cf_item_find_next(cs, NULL); ci != NULL; ci=cf_item_find_next(cs, ci)) { if(cf_item_is_section(ci)) { radlog(L_ERR|L_CONS, "%s[%d] Subsection of module instance call " "not allowed\n", filename, cf_section_lineno(cf_itemtosection(ci))); exit(1); } cp = cf_itemtopair(ci); attr = cf_pair_attr(cp); value = cf_pair_value(cp); lineno = cf_pair_lineno(cp); rcode = str2rcode(attr, filename, lineno); action = str2action(value, filename, lineno); c->actions[rcode] = action; }}static modcallable *do_compile_modsingle(int component, CONF_ITEM *ci, const char *filename, int grouptype, const char **modname){ int lineno; const char *modrefname; modsingle *single; modcallable *csingle; module_instance_t *this; if (cf_item_is_section(ci)) { CONF_SECTION *cs = cf_itemtosection(ci); lineno = cf_section_lineno(cs); modrefname = cf_section_name1(cs); /* group{}, redundant{}, or append{} may appear where a * single module instance was expected - in that case, we * hand it off to compile_modgroup */ if (strcmp(modrefname, "group") == 0) { *modname = "UnnamedGroup"; return do_compile_modgroup(component, cs, filename, GROUPTYPE_SIMPLEGROUP, grouptype); } else if (strcmp(modrefname, "redundant") == 0) { *modname = "UnnamedGroup"; return do_compile_modgroup(component, cs, filename, GROUPTYPE_REDUNDANT, grouptype); } else if (strcmp(modrefname, "append") == 0) { *modname = "UnnamedGroup"; return do_compile_modgroup(component, cs, filename, GROUPTYPE_APPEND, grouptype); } } else { CONF_PAIR *cp = cf_itemtopair(ci); lineno = cf_pair_lineno(cp); modrefname = cf_pair_attr(cp); } single = rad_malloc(sizeof(*single)); csingle = mod_singletocallable(single); csingle->next = NULL; memcpy(csingle->actions, defaultactions[component][grouptype], sizeof csingle->actions); rad_assert(modrefname != NULL); csingle->name = modrefname; csingle->type = MOD_SINGLE; if (cf_item_is_section(ci)) { /* override default actions with what's in the CONF_SECTION */ override_actions(csingle, cf_itemtosection(ci), filename); } this = find_module_instance(modrefname); if (this == NULL) { exit(1); /* FIXME */ } sanity_check(component, this, filename); single->modinst = this; *modname = this->entry->module->name; return csingle;}modcallable *compile_modsingle(int component, CONF_ITEM *ci, const char *filename, const char **modname){ modcallable *ret = do_compile_modsingle(component, ci, filename, GROUPTYPE_SIMPLEGROUP, modname); dump_tree(component, ret); return ret;}static modcallable *do_compile_modgroup(int component, CONF_SECTION *cs, const char *filename, int grouptype, int parentgrouptype){ modgroup *g; modcallable *c; CONF_ITEM *ci; g = rad_malloc(sizeof *g); c = mod_grouptocallable(g); c->next = NULL; memcpy(c->actions, defaultactions[component][parentgrouptype], sizeof c->actions); c->name = cf_section_name1(cs); rad_assert(c->name != NULL); c->type = MOD_GROUP; g->children = NULL; for (ci=cf_item_find_next(cs, NULL); ci != NULL; ci=cf_item_find_next(cs, ci)) { if(cf_item_is_section(ci)) { const char *junk; modcallable *single; single = do_compile_modsingle(component, ci, filename, grouptype, &junk); add_child(g, single); } else { const char *attr, *value; CONF_PAIR *cp = cf_itemtopair(ci); int lineno; attr = cf_pair_attr(cp); value = cf_pair_value(cp); lineno = cf_pair_lineno(cp); /* A CONF_PAIR is either a module instance with no * actions specified... */ if(value[0]==0) { modcallable *single; const char *junk; single = do_compile_modsingle(component, cf_pairtoitem(cp), filename, grouptype, &junk); add_child(g, single); } else { /* ...or an action to be applied to this * group. */ int rcode, action; rcode = str2rcode(attr, filename, lineno); action = str2action(value, filename, lineno); c->actions[rcode] = action; } } } return mod_grouptocallable(g);}modcallable *compile_modgroup(int component, CONF_SECTION *cs, const char *filename){ modcallable *ret = do_compile_modgroup(component, cs, filename, GROUPTYPE_SIMPLEGROUP, GROUPTYPE_SIMPLEGROUP); dump_tree(component, ret); return ret;}void add_to_modcallable(modcallable **parent, modcallable *this, int component, char *name){ modgroup *g; if (*parent == NULL) { modcallable *c; g = rad_malloc(sizeof *g); c = mod_grouptocallable(g); c->next = NULL; memcpy(c->actions, defaultactions[component][GROUPTYPE_SIMPLEGROUP], sizeof c->actions); rad_assert(name != NULL); c->name = name; c->type = MOD_GROUP; g->children = NULL; *parent = mod_grouptocallable(g); } else { g = mod_callabletogroup(*parent); } add_child(g, this);}void modcallable_free(modcallable **pc){ modcallable *c, *loop, *next; c = *pc; if(c->type==MOD_GROUP) { for(loop=mod_callabletogroup(c)->children ; loop ; loop=next) { next = loop->next; modcallable_free(&loop); } } free(c); *pc = NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -