The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
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_replace_t
 
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)
 
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.
 
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.
 
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.
 
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.
 
static xlat_arg_parser_t const perl_xlat_args []
 
static const conf_parser_t replace_config []
 
module_rlm_t rlm_perl
 
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_replace_t

struct rlm_perl_replace_t

Definition at line 57 of file rlm_perl.c.

Data Fields
bool control Should the control list be replaced after module call.
bool reply Should the reply list be replaced after module call.
bool request Should the request list be replaced after module call.
bool session Should the session list be replaced after module call.

◆ rlm_perl_t

struct rlm_perl_t

Definition at line 71 of file rlm_perl.c.

+ Collaboration diagram for rlm_perl_t:
Data Fields
char const * func_accounting
char const * func_authenticate
char const *char const * func_authorize
char const * func_detach
char const * func_post_auth
char const * func_preacct
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:197
#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:

◆ 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 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:642
#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:418
@ CONF_FLAG_FILE_INPUT
File matching value must exist, and must be readable.
Definition cf_parse.h:424
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.
@ FR_TYPE_VOID
User data.
@ XLAT_ARG_VARIADIC_EMPTY_KEEP
Empty argument groups are left alone, and either passed through as empty groups or null boxes.
Definition xlat.h:139
#define XLAT_ARG_PARSER_TERMINATOR
Definition xlat.h:168

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("control", rlm_perl_replace_t, control) },
{ FR_CONF_OFFSET("session", rlm_perl_replace_t, session) },
}

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_request

_Thread_local request_t* rlm_perl_request
static

Definition at line 132 of file rlm_perl.c.