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_t
 
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 *list_name, fr_dict_attr_t const *parent, bool dbg_print)
 
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 *list_name, fr_dict_attr_t const *parent, bool dbg_print)
 
static void perl_parse_config (CONF_SECTION *cs, int lvl, HV *rad_hv)
 
static void perl_store_vps (request_t *request, fr_pair_list_t *vps, HV *rad_hv, const char *hash_name, bool dbg_print)
 
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 *vp, int *i, const char *hash_name, bool dbg_print)
 
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 []
 
static const conf_parser_t replace_config []
 
module_rlm_t rlm_perl
 
 rlm_perl_replace_t
 
static _Thread_local request_trlm_perl_request
 

Detailed Description

Translates requests between the server an a perl interpreter.

Id
376354d83c641a8e972de243b8460fb991d95f7e

Definition in file rlm_perl.c.


Data Structure Documentation

◆ rlm_perl_t

struct rlm_perl_t

Definition at line 71 of file rlm_perl.c.

Data Fields
char const * func_accounting
char const * func_authenticate
char const * func_authorize
char const * func_detach
char const * func_post_auth
char const * func_preacct
char const * module
PerlInterpreter * perl
char const * perl_flags
bool perl_parsed
HV * rad_perlconf_hv holds "config" items (perl RAD_PERLCONF hash).
rlm_perl_replace_t replace

◆ rlm_perl_thread_t

struct rlm_perl_thread_t

Definition at line 90 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 134 of file rlm_perl.c.

◆ dl_modules

#define dl_modules   "DynaLoader::dl_modules"

Definition at line 135 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:709
@ 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
@ T_INVALID
Definition: token.h:39

Definition at line 107 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->mi->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:836
eap_aka_sim_process_conf_t * inst

Definition at line 947 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)

< Should the request list be replaced after module call

< Should the reply list be replaced after module call

< Should the control list be replaced after module call

< Should the session list be replaced after module call

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 836 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 *  list_name,
fr_dict_attr_t const *  parent,
bool  dbg_print 
)
static

Definition at line 801 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 1156 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 1120 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 1042 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_load()

static int mod_load ( void  )
static

Definition at line 1166 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 1019 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 992 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ mod_unload()

static void mod_unload ( void  )
static

Definition at line 1207 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 *  list_name,
fr_dict_attr_t const *  parent,
bool  dbg_print 
)
static

Definition at line 738 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 543 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 ( request_t request,
fr_pair_list_t vps,
HV *  rad_hv,
const char *  hash_name,
bool  dbg_print 
)
static

Definition at line 655 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 328 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 274 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 vp,
int *  i,
const char *  hash_name,
bool  dbg_print 
)
static

Definition at line 605 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 136 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 178 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 144 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 964 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 199 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 227 of file rlm_perl.c.

+ Here is the call graph for this function:

◆ xs_init()

static void xs_init ( pTHX  )
static

Definition at line 252 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) },
{ FR_CONF_OFFSET_SUBSECTION("replace", 0, rlm_perl_t, replace, replace_config) },
}
#define CONF_PARSER_TERMINATOR
Definition: cf_parse.h:627
#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
#define FR_CONF_OFFSET_SUBSECTION(_name, _flags, _struct, _field, _subcs)
conf_parser_t which populates a sub-struct using a CONF_SECTION
Definition: cf_parse.h:297
@ CONF_FLAG_REQUIRED
Error out if no matching CONF_PAIR is found, and no dflt value is set.
Definition: cf_parse.h:405
@ CONF_FLAG_FILE_INPUT
File matching value must exist, and must be readable.
Definition: cf_parse.h:411
static const conf_parser_t replace_config[]
Definition: rlm_perl.c:96
#define RLM_PERL_CONF(_x)
Definition: rlm_perl.c:107

Definition at line 110 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 94 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 435 of file rlm_perl.c.

◆ replace_config

const conf_parser_t replace_config[]
static
Initial value:
= {
{ FR_CONF_OFFSET("request", rlm_perl_replace_t, request) },
{ FR_CONF_OFFSET("reply", rlm_perl_replace_t, reply) },
{ FR_CONF_OFFSET("session", rlm_perl_replace_t, session) },
}
static fr_control_t * control
Definition: control_test.c:50
rlm_perl_replace_t
Definition: rlm_perl.c:62

Definition at line 96 of file rlm_perl.c.

◆ rlm_perl

module_rlm_t rlm_perl

Definition at line 1223 of file rlm_perl.c.

◆ rlm_perl_replace_t

rlm_perl_replace_t

Definition at line 62 of file rlm_perl.c.

◆ rlm_perl_request

_Thread_local request_t* rlm_perl_request
static

Definition at line 132 of file rlm_perl.c.