The FreeRADIUS server  $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Data Structures | Macros | Functions | Variables
rlm_perl.c File Reference

Translates requests between the server an a perl interpreter. More...

#include <freeradius-devel/server/base.h>
#include <freeradius-devel/server/module_rlm.h>
#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/unlang/xlat_func.h>
#include <freeradius-devel/unlang/xlat.h>
#include <freeradius-devel/radius/radius.h>
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
#include <dlfcn.h>
#include <semaphore.h>
+ Include dependency graph for rlm_perl.c:

Go to the source code of this file.

Data Structures

struct  rlm_perl_thread_t
 

Macros

#define dl_librefs   "DynaLoader::dl_librefs"
 
#define dl_modules   "DynaLoader::dl_modules"
 
#define LOAD_INFO(_fmt, ...)   fr_log(LOG_DST, L_INFO, __FILE__, __LINE__, "rlm_perl - " _fmt, ## __VA_ARGS__)
 
#define LOAD_WARN(_fmt, ...)
 
#define LOG_PREFIX   "perl"
 
#define RLM_PERL_CONF(_x)
 
#define RLM_PERL_FUNC(_x)
 

Functions

EXTERN_C void boot_DynaLoader (pTHX_ CV *cv)
 
 DIAG_OFF (compound-token-split-by-macro) typedef struct
 
static unlang_action_t do_perl (rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request, PerlInterpreter *interp, char const *function_name)
 
static int get_hv_content (TALLOC_CTX *ctx, request_t *request, HV *my_hv, fr_pair_list_t *vps, const char *hash_name, const char *list_name)
 
static int mod_bootstrap (module_inst_ctx_t const *mctx)
 
static int mod_detach (module_detach_ctx_t const *mctx)
 
static int mod_instantiate (module_inst_ctx_t const *mctx)
 
static int mod_load (void)
 
static int mod_thread_detach (module_thread_inst_ctx_t const *mctx)
 
static int mod_thread_instantiate (module_thread_inst_ctx_t const *mctx)
 
static void mod_unload (void)
 
static int pairadd_sv (TALLOC_CTX *ctx, request_t *request, fr_pair_list_t *vps, char *key, SV *sv, const char *hash_name, const char *list_name)
 
static void perl_parse_config (CONF_SECTION *cs, int lvl, HV *rad_hv)
 
static void perl_store_vps (UNUSED TALLOC_CTX *ctx, request_t *request, fr_pair_list_t *vps, HV *rad_hv, const char *hash_name, const char *list_name)
 
static int perl_sv_to_vblist (TALLOC_CTX *ctx, fr_value_box_list_t *list, request_t *request, SV *sv)
 Parse a Perl SV and create value boxes, appending to a list. More...
 
static int perl_vblist_to_av (AV *av, fr_value_box_list_t *head)
 Convert a list of value boxes to a Perl array for passing to subroutines. More...
 
static void perl_vp_to_svpvn_element (request_t *request, AV *av, fr_pair_t const *vp, int *i, const char *hash_name, const char *list_name)
 
static xlat_action_t perl_xlat (TALLOC_CTX *ctx, fr_dcursor_t *out, xlat_ctx_t const *xctx, request_t *request, fr_value_box_list_t *in)
 Call perl code using an xlat. More...
 
static void rlm_perl_clear_handles (pTHX)
 
static void rlm_perl_close_handles (void **handles)
 
static void ** rlm_perl_get_handles (pTHX)
 
static void rlm_perl_interp_free (PerlInterpreter *perl)
 
static XS (XS_radiusd_log)
 
static XS (XS_radiusd_xlat)
 
static void xs_init (pTHX)
 

Variables

static const conf_parser_t module_config []
 
static void * perl_dlhandle
 To allow us to load perl's symbols into the global symbol table. More...
 
static xlat_arg_parser_t const perl_xlat_args []
 
module_rlm_t rlm_perl
 
static _Thread_local request_trlm_perl_request
 
 rlm_perl_t
 

Detailed Description

Translates requests between the server an a perl interpreter.

Id
64b2292bf1634f7f9edc4fdacd1f3cd649184b36

Definition in file rlm_perl.c.


Data Structure Documentation

◆ rlm_perl_thread_t

struct rlm_perl_thread_t

Definition at line 82 of file rlm_perl.c.

Data Fields
PerlInterpreter * perl Thread specific perl interpreter.

Macro Definition Documentation

◆ dl_librefs

#define dl_librefs   "DynaLoader::dl_librefs"

Definition at line 116 of file rlm_perl.c.

◆ dl_modules

#define dl_modules   "DynaLoader::dl_modules"

Definition at line 117 of file rlm_perl.c.

◆ LOAD_INFO

#define LOAD_INFO (   _fmt,
  ... 
)    fr_log(LOG_DST, L_INFO, __FILE__, __LINE__, "rlm_perl - " _fmt, ## __VA_ARGS__)

◆ LOAD_WARN

#define LOAD_WARN (   _fmt,
  ... 
)
Value:
fr_log_perror(LOG_DST, L_WARN, __FILE__, __LINE__, \
.first_prefix = "rlm_perl - ", \
.subsq_prefix = "rlm_perl - ", \
}, \
_fmt, ## __VA_ARGS__)
#define LOG_DST
Definition: network.c:29
void fr_log_perror(fr_log_t const *log, fr_log_type_t type, char const *file, int line, fr_log_perror_format_t const *rules, char const *fmt,...)
Drain any outstanding messages from the fr_strerror buffers.
Definition: log.c:725
@ L_WARN
Warning.
Definition: log.h:57

◆ LOG_PREFIX

#define LOG_PREFIX   "perl"

Definition at line 27 of file rlm_perl.c.

◆ RLM_PERL_CONF

#define RLM_PERL_CONF (   _x)
Value:
{ FR_CONF_OFFSET("func_" STRINGIFY(_x), rlm_perl_t, func_##_x), \
.data = NULL, .dflt = STRINGIFY(_x), .quote = T_INVALID }
#define STRINGIFY(x)
Definition: build.h:195
#define FR_CONF_OFFSET(_name, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
Definition: cf_parse.h:268
rlm_perl_t
Definition: rlm_perl.c:80
@ T_INVALID
Definition: token.h:39

Definition at line 91 of file rlm_perl.c.

◆ RLM_PERL_FUNC

#define RLM_PERL_FUNC (   _x)
Value:
static unlang_action_t mod_##_x(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request) \
{ \
rlm_perl_t *inst = talloc_get_type_abort(mctx->inst->data, rlm_perl_t); \
return do_perl(p_result, mctx, request, \
((rlm_perl_thread_t *)talloc_get_type_abort(mctx->thread, rlm_perl_thread_t))->perl, \
inst->func_##_x); \
}
unlang_action_t
Returned by unlang_op_t calls, determine the next action of the interpreter.
Definition: action.h:35
Temporary structure to hold arguments for module calls.
Definition: module_ctx.h:41
rlm_rcode_t
Return codes indicating the result of the module call.
Definition: rcode.h:40
static unlang_action_t do_perl(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request, PerlInterpreter *interp, char const *function_name)
Definition: rlm_perl.c:799
eap_aka_sim_process_conf_t * inst

Definition at line 902 of file rlm_perl.c.

Function Documentation

◆ boot_DynaLoader()

EXTERN_C void boot_DynaLoader ( pTHX_ CV *  cv)
+ Here is the caller graph for this function:

◆ DIAG_OFF()

DIAG_OFF ( compound-token-split-by-  macro)

< holds "config" items (perl RAD_PERLCONF hash).

Definition at line 37 of file rlm_perl.c.

◆ do_perl()

static unlang_action_t do_perl ( rlm_rcode_t p_result,
module_ctx_t const *  mctx,
request_t request,
PerlInterpreter *  interp,
char const *  function_name 
)
static

Definition at line 799 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ get_hv_content()

static int get_hv_content ( TALLOC_CTX *  ctx,
request_t request,
HV *  my_hv,
fr_pair_list_t vps,
const char *  hash_name,
const char *  list_name 
)
static

Definition at line 764 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mod_bootstrap()

static int mod_bootstrap ( module_inst_ctx_t const *  mctx)
static

Definition at line 584 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_detach()

static int mod_detach ( module_detach_ctx_t const *  mctx)
static

Definition at line 1075 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_instantiate()

static int mod_instantiate ( module_inst_ctx_t const *  mctx)
static

Definition at line 997 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_load()

static int mod_load ( void  )
static

Definition at line 1111 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_thread_detach()

static int mod_thread_detach ( module_thread_inst_ctx_t const *  mctx)
static

Definition at line 974 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_thread_instantiate()

static int mod_thread_instantiate ( module_thread_inst_ctx_t const *  mctx)
static

Definition at line 947 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_unload()

static void mod_unload ( void  )
static

Definition at line 1152 of file rlm_perl.c.

◆ pairadd_sv()

static int pairadd_sv ( TALLOC_CTX *  ctx,
request_t request,
fr_pair_list_t vps,
char *  key,
SV *  sv,
const char *  hash_name,
const char *  list_name 
)
static

Definition at line 716 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ perl_parse_config()

static void perl_parse_config ( CONF_SECTION cs,
int  lvl,
HV *  rad_hv 
)
static

Definition at line 525 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ perl_store_vps()

static void perl_store_vps ( UNUSED TALLOC_CTX *  ctx,
request_t request,
fr_pair_list_t vps,
HV *  rad_hv,
const char *  hash_name,
const char *  list_name 
)
static

Definition at line 640 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ perl_sv_to_vblist()

static int perl_sv_to_vblist ( TALLOC_CTX *  ctx,
fr_value_box_list_t *  list,
request_t request,
SV *  sv 
)
static

Parse a Perl SV and create value boxes, appending to a list.

For parsing values passed back from a Perl subroutine

When hashes are returned, first the key is added as a value box then the value

Parameters
[in]ctxto allocate boxes in.
[out]listto append value boxes to.
[in]requestbeing handled - only used for debug messages
[in]svto parse
Returns
  • 0 on success
  • -1 on failure

Definition at line 310 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ perl_vblist_to_av()

static int perl_vblist_to_av ( AV *  av,
fr_value_box_list_t *  head 
)
static

Convert a list of value boxes to a Perl array for passing to subroutines.

The Perl array object should be created before calling this to populate it.

Parameters
[in,out]avPerl array object to append values to.
[in]headof VB list.
Returns
  • 0 on success
  • -1 on failure

Definition at line 256 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ perl_vp_to_svpvn_element()

static void perl_vp_to_svpvn_element ( request_t request,
AV *  av,
fr_pair_t const *  vp,
int *  i,
const char *  hash_name,
const char *  list_name 
)
static

Definition at line 594 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ rlm_perl_clear_handles()

static void rlm_perl_clear_handles ( pTHX  )
static

Definition at line 118 of file rlm_perl.c.

+ Here is the caller graph for this function:

◆ rlm_perl_close_handles()

static void rlm_perl_close_handles ( void **  handles)
static

Definition at line 160 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ rlm_perl_get_handles()

static void** rlm_perl_get_handles ( pTHX  )
static

Definition at line 126 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ rlm_perl_interp_free()

static void rlm_perl_interp_free ( PerlInterpreter *  perl)
static

Definition at line 919 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ XS() [1/2]

static XS ( XS_radiusd_log  )
static

Definition at line 181 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ XS() [2/2]

static XS ( XS_radiusd_xlat  )
static

Definition at line 209 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ xs_init()

static void xs_init ( pTHX  )
static

Definition at line 234 of file rlm_perl.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ module_config

const conf_parser_t module_config[]
static
Initial value:
= {
RLM_PERL_CONF(authorize),
RLM_PERL_CONF(authenticate),
RLM_PERL_CONF(post_auth),
RLM_PERL_CONF(accounting),
RLM_PERL_CONF(preacct),
RLM_PERL_CONF(detach),
{ FR_CONF_OFFSET("perl_flags", rlm_perl_t, perl_flags) },
}
#define CONF_PARSER_TERMINATOR
Definition: cf_parse.h:626
#define FR_CONF_OFFSET_FLAGS(_name, _flags, _struct, _field)
conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
Definition: cf_parse.h:256
@ CONF_FLAG_REQUIRED
Error out if no matching CONF_PAIR is found, and no dflt value is set.
Definition: cf_parse.h:406
@ CONF_FLAG_FILE_INPUT
File matching value must exist, and must be readable.
Definition: cf_parse.h:412
#define RLM_PERL_CONF(_x)
Definition: rlm_perl.c:91

Definition at line 94 of file rlm_perl.c.

◆ perl_dlhandle

void* perl_dlhandle
static

To allow us to load perl's symbols into the global symbol table.

Definition at line 86 of file rlm_perl.c.

◆ perl_xlat_args

xlat_arg_parser_t const perl_xlat_args[]
static
Initial value:
= {
{ .required = true, .single = true, .type = FR_TYPE_STRING },
{ .variadic = XLAT_ARG_VARIADIC_EMPTY_KEEP, .type = FR_TYPE_VOID },
}
@ FR_TYPE_STRING
String of printable characters.
Definition: merged_model.c:83
@ FR_TYPE_VOID
User data.
Definition: merged_model.c:127
@ XLAT_ARG_VARIADIC_EMPTY_KEEP
Empty argument groups are left alone, and either passed through as empty groups or null boxes.
Definition: xlat.h:137
#define XLAT_ARG_PARSER_TERMINATOR
Definition: xlat.h:166

Definition at line 417 of file rlm_perl.c.

◆ rlm_perl

module_rlm_t rlm_perl
Initial value:
= {
.common = {
.name = "perl",
.inst_size = sizeof(rlm_perl_t),
.onload = mod_load,
.unload = mod_unload,
.bootstrap = mod_bootstrap,
.detach = mod_detach,
.thread_inst_size = sizeof(rlm_perl_thread_t),
.thread_instantiate = mod_thread_instantiate,
.thread_detach = mod_thread_detach,
},
.method_names = (module_method_name_t[]){
{ .name1 = "authorize", .name2 = CF_IDENT_ANY, .method = mod_authorize },
{ .name1 = "recv", .name2 = "accounting-request", .method = mod_preacct },
{ .name1 = "recv", .name2 = CF_IDENT_ANY, .method = mod_authorize },
{ .name1 = "accounting", .name2 = CF_IDENT_ANY, .method = mod_accounting },
{ .name1 = "authenticate", .name2 = CF_IDENT_ANY, .method = mod_authenticate },
{ .name1 = "send", .name2 = CF_IDENT_ANY, .method = mod_post_auth },
}
}
#define CF_IDENT_ANY
Definition: cf_util.h:78
#define MODULE_MAGIC_INIT
Stop people using different module/library/server versions together.
Definition: dl_module.h:65
Specifies a module method identifier.
Definition: module_method.c:36
static const conf_parser_t config[]
Definition: base.c:188
static unlang_action_t mod_authenticate(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition: rlm_chap.c:228
static unlang_action_t mod_authorize(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition: rlm_chap.c:176
static unlang_action_t mod_accounting(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Write accounting data to Couchbase documents.
static unlang_action_t mod_post_auth(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition: rlm_detail.c:400
static int mod_detach(module_detach_ctx_t const *mctx)
Definition: rlm_perl.c:1075
static int mod_load(void)
Definition: rlm_perl.c:1111
static int mod_bootstrap(module_inst_ctx_t const *mctx)
Definition: rlm_perl.c:584
static void mod_unload(void)
Definition: rlm_perl.c:1152
static int mod_thread_instantiate(module_thread_inst_ctx_t const *mctx)
Definition: rlm_perl.c:947
static const conf_parser_t module_config[]
Definition: rlm_perl.c:94
static int mod_thread_detach(module_thread_inst_ctx_t const *mctx)
Definition: rlm_perl.c:974
static int mod_instantiate(module_inst_ctx_t const *mctx)
Definition: rlm_perl.c:997
static int instantiate(module_inst_ctx_t const *mctx)
Definition: rlm_rest.c:1312
static unlang_action_t mod_preacct(rlm_rcode_t *p_result, module_ctx_t const *mctx, UNUSED request_t *request)
Definition: rlm_test.c:248
@ MODULE_TYPE_THREAD_SAFE
Module is threadsafe.
Definition: module.h:49
#define MODULE_NAME_TERMINATOR
Definition: module.h:135

Definition at line 1169 of file rlm_perl.c.

◆ rlm_perl_request

_Thread_local request_t* rlm_perl_request
static

Definition at line 114 of file rlm_perl.c.

◆ rlm_perl_t

rlm_perl_t

Definition at line 80 of file rlm_perl.c.