使全局变量可用于使用perl_parse解析的脚本

时间:2015-04-21 16:38:54

标签: c perl embedding freeradius

我正在研究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_constructperl_parse之间我应该能够定义其他全局变量,以便它们在解析的文件范围内可用。任何人都可以给出一个这样做的例子,或建议另一种从模块制作配置数据的方法,解析后的perl脚本可以使用吗?

很抱歉,如果这个问题含糊不清。我对嵌入perl的概念并不熟悉。

0 个答案:

没有答案