我正在研究FreeRADIUS项目的rlm_perl模块。此模块处理属性值对到/从perl解释器的编组/解组。它允许在perl中编写AAA策略。
为了简化这些策略的管理,用户提供了一个补丁,该补丁创建了一个多维哈希表,表示多维用户特定的配置部分。
例如
foo {
bar {
dink = 'donk'
}
baz = 'boink'
}
会变成
%RAD_PERLCONF = {
foo => {
bar => {
dink = 'donk'
}
},
baz => 'boink'
};
问题是,当用户指定将由解释器运行的perl脚本时,需要加载它(它当前仅在运行时调用子程序时可用)。
允许类似:
use constant FOO_DIR => $RAD_PERLCONF{'foo'};
在文件正文中的子程序之外指定。
当前的C代码如下所示:
MEM(embed_c = talloc_zero_array(inst, char const *, 4));
memcpy(&embed, &embed_c, sizeof(embed));
# inst->module here means the path to the script to be parsed
embed_c[0] = NULL;
if (inst->perl_flags) {
embed_c[1] = inst->perl_flags;
embed_c[2] = inst->module;
embed_c[3] = arg;
argc = 4;
} else {
embed_c[1] = inst->module;
embed_c[2] = arg;
argc = 3;
}
PERL_SYS_INIT3(&argc, &embed, &envp);
if ((inst->perl = perl_alloc()) == NULL) {
ERROR("rlm_perl: No memory for allocating new perl !");
return -1;
}
perl_construct(inst->perl);
#ifdef USE_ITHREADS
PL_perl_destruct_level = 2;
{
dTHXa(inst->perl);
}
PERL_SET_CONTEXT(inst->perl);
#endif
#if PERL_REVISION >= 5 && PERL_VERSION >=8
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
#endif
exitstatus = perl_parse(inst->perl, xs_init, argc, embed, NULL);
if (exitstatus) return -1;
perl_run(inst->perl);
我正在提供它,以便可以引用perl设置过程的各个部分,而不是用于评论或样式或破坏。
我猜测在perl_construct
和perl_parse
之间我应该能够定义其他全局变量,以便它们在解析的文件范围内可用。任何人都可以给出一个这样做的例子,或建议另一种从模块制作配置数据的方法,解析后的perl脚本可以使用吗?
很抱歉,如果这个问题含糊不清。我对嵌入perl的概念并不熟悉。