The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
cf_file.c File Reference

Read the radiusd.conf file. More...

#include <sys/errno.h>
#include <freeradius-devel/server/cf_file.h>
#include <freeradius-devel/server/cf_priv.h>
#include <freeradius-devel/server/log.h>
#include <freeradius-devel/server/tmpl.h>
#include <freeradius-devel/server/util.h>
#include <freeradius-devel/server/virtual_servers.h>
#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/util/file.h>
#include <freeradius-devel/util/misc.h>
#include <freeradius-devel/util/perm.h>
#include <freeradius-devel/util/skip.h>
#include <freeradius-devel/util/md5.h>
#include <fcntl.h>
#include <freeradius-devel/server/main_config.h>
+ Include dependency graph for cf_file.c:

Go to the source code of this file.

Data Structures

struct  cf_file_heap_t
 
struct  cf_stack_frame_t
 
union  cf_stack_frame_t.__unnamed55__
 
struct  cf_stack_frame_t.__unnamed55__.__unnamed57__
 
struct  cf_stack_t
 

Macros

#define MAX_STACK   (32)
 

Typedefs

typedef struct cf_file_heap_t cf_file_heap_t
 
typedef CONF_ITEM *(* cf_process_func_t) (cf_stack_t *)
 
typedef enum conf_property CONF_PROPERTY
 

Enumerations

enum  cf_stack_file_t { CF_STACK_FILE = 0 }
 
enum  conf_property {
  CONF_PROPERTY_INVALID = 0 ,
  CONF_PROPERTY_NAME ,
  CONF_PROPERTY_INSTANCE
}
 

Functions

static int8_t _inode_cmp (void const *one, void const *two)
 
static int add_pair (CONF_SECTION *parent, char const *attr, char const *value, fr_token_t name1_token, fr_token_t op_token, fr_token_t value_token, char *buff, char const *filename, int lineno)
 
char const * cf_expand_variables (char const *cf, int lineno, CONF_SECTION *outer_cs, char *output, size_t outsize, char const *input, ssize_t inlen, bool *soft_fail, bool soft_fail_env)
 
cf_file_check_err_t cf_file_check (CONF_PAIR *cp, bool check_perms)
 Do some checks on the file as an "input" file.
 
cf_file_check_err_t cf_file_check_effective (char const *filename, cf_file_check_err_t(*cb)(char const *filename, void *uctx), void *uctx)
 Perform an operation with the effect/group set to conf_check_gid and conf_check_uid.
 
cf_file_check_err_t cf_file_check_open_read (char const *filename, void *uctx)
 Callback for cf_file_check to open a file and check permissions.
 
void cf_file_check_set_uid_gid (uid_t uid, gid_t gid)
 Set the euid/egid used when performing file checks.
 
cf_file_check_err_t cf_file_check_unix_connect (char const *filename, UNUSED void *uctx)
 Check if we can connect to a unix socket.
 
cf_file_check_err_t cf_file_check_unix_perm (char const *filename, UNUSED void *uctx)
 Check if file exists, and is a socket.
 
static int cf_file_fill (cf_stack_t *stack)
 
void cf_file_free (CONF_SECTION *cs)
 
static int cf_file_include (cf_stack_t *stack)
 
static int cf_file_open (CONF_SECTION *cs, char const *filename, bool from_dir, FILE **fp_p)
 
int cf_file_read (CONF_SECTION *cs, char const *filename, bool root)
 
static int cf_get_token (CONF_SECTION *parent, char const **ptr_p, fr_token_t *token, char *buffer, size_t buflen, char const *filename, int lineno)
 
static char const * cf_local_file (char const *base, char const *filename, char *buffer, size_t bufsize)
 
void cf_md5_final (uint8_t *digest)
 
void cf_md5_init (void)
 
static void cf_md5_update (char const *p)
 
int cf_pair_write (FILE *fp, CONF_PAIR *cp)
 
CONF_ITEMcf_reference_item (CONF_SECTION const *parent_cs, CONF_SECTION const *outer_cs, char const *ptr)
 
int cf_section_pass2 (CONF_SECTION *cs)
 
void cf_section_set_unlang (CONF_SECTION *cs)
 
int cf_section_write (FILE *fp, CONF_SECTION *cs, int depth)
 
int cf_section_write_children (FILE *fp, CONF_SECTION *cs, int depth)
 Emit the children of a section at depth without an enclosing { ... }.
 
static void cf_stack_cleanup (cf_stack_t *stack)
 
static ssize_t cf_string_write (FILE *fp, char const *string, size_t len, fr_token_t t)
 
static bool cf_template_merge (CONF_SECTION *cs, CONF_SECTION const *template)
 
static int8_t filename_cmp (void const *one, void const *two)
 
static int frame_readdir (cf_stack_t *stack)
 
static int parse_error (cf_stack_t *stack, char const *ptr, char const *message)
 
static int parse_input (cf_stack_t *stack)
 
static int parse_type_name (cf_stack_t *stack, char const **ptr_p, char const *type_ptr, fr_type_t *type_p)
 
static CONF_ITEMprocess_catch (cf_stack_t *stack)
 
static CONF_ITEMprocess_foreach (cf_stack_t *stack)
 
static CONF_ITEMprocess_if (cf_stack_t *stack)
 
static int process_include (cf_stack_t *stack, CONF_SECTION *parent, char const *ptr, bool required, bool relative)
 
static CONF_ITEMprocess_map (cf_stack_t *stack)
 
static CONF_ITEMprocess_subrequest (cf_stack_t *stack)
 
static CONF_ITEMprocess_switch (cf_stack_t *stack)
 
static int process_template (cf_stack_t *stack)
 

Variables

static fr_md5_ctx_tcf_md5_ctx = NULL
 
static const bool cf_name_char1 [SBUFF_CHAR_CLASS]
 Convert tokens back to a quoting character.
 
bool check_config = false
 
static gid_t conf_check_gid = (gid_t)-1
 
static uid_t conf_check_uid = (uid_t)-1
 
static fr_table_num_sorted_t const conf_property_name []
 
static size_t conf_property_name_len = NUM_ELEMENTS(conf_property_name)
 
static char const parse_tabs [] = " "
 
static fr_table_num_sorted_t const server_unlang_section []
 
static size_t server_unlang_section_len = NUM_ELEMENTS(server_unlang_section)
 
static const bool terminal_end_line [SBUFF_CHAR_CLASS]
 
static const bool terminal_end_section [SBUFF_CHAR_CLASS]
 
static fr_table_ptr_sorted_t unlang_keywords []
 
static int unlang_keywords_len = NUM_ELEMENTS(unlang_keywords)
 

Detailed Description

Read the radiusd.conf file.

Id
bab434b36eff4e07bea938dc9d7dfbfb5512e531
Note
Yep I should learn to use lex & yacc, or at least write a decent parser. I know how to do that, really :) mique.nosp@m.ls@c.nosp@m.istro.nosp@m.n.nl

Definition in file cf_file.c.


Data Structure Documentation

◆ cf_file_heap_t

struct cf_file_heap_t

Definition at line 1097 of file cf_file.c.

Data Fields
char const * filename
fr_heap_index_t heap_id

◆ cf_stack_frame_t

struct cf_stack_frame_t

Definition at line 106 of file cf_file.c.

+ Collaboration diagram for cf_stack_frame_t:
Data Fields
union cf_stack_frame_t.__unnamed55__ __unnamed__
CONF_SECTION * at_reference was this thing an @foo ?
int braces
CONF_SECTION * current sub-section we're reading
char const * filename filename we're reading
bool from_dir this file was read from $include foo/
int lineno line in that filename
CONF_SECTION * parent which started this file
cf_stack_file_t type

◆ cf_stack_frame_t.__unnamed55__

union cf_stack_frame_t.__unnamed55__

Definition at line 112 of file cf_file.c.

Data Fields
struct cf_stack_frame_t.__unnamed55__.__unnamed57__ __unnamed__

◆ cf_stack_frame_t.__unnamed55__.__unnamed57__

struct cf_stack_frame_t.__unnamed55__.__unnamed57__

Definition at line 113 of file cf_file.c.

Data Fields
FILE * fp FP we're reading.

◆ cf_stack_t

struct cf_stack_t

Definition at line 147 of file cf_file.c.

+ Collaboration diagram for cf_stack_t:
Data Fields
char ** buff buffers for reading / parsing
size_t bufsize size of the buffers
int depth stack depth
char * fill where we start filling the buffer from
cf_stack_frame_t frame[MAX_STACK] stack frames
char const * ptr current parse pointer

Macro Definition Documentation

◆ MAX_STACK

#define MAX_STACK   (32)

Definition at line 105 of file cf_file.c.

Typedef Documentation

◆ cf_file_heap_t

◆ cf_process_func_t

typedef CONF_ITEM *(* cf_process_func_t) (cf_stack_t *)

Definition at line 2336 of file cf_file.c.

◆ CONF_PROPERTY

Enumeration Type Documentation

◆ cf_stack_file_t

Enumerator
CF_STACK_FILE 

Definition at line 95 of file cf_file.c.

◆ conf_property

Enumerator
CONF_PROPERTY_INVALID 
CONF_PROPERTY_NAME 
CONF_PROPERTY_INSTANCE 

Definition at line 65 of file cf_file.c.

Function Documentation

◆ _inode_cmp()

static int8_t _inode_cmp ( void const *  one,
void const *  two 
)
static

Definition at line 558 of file cf_file.c.

+ Here is the caller graph for this function:

◆ add_pair()

static int add_pair ( CONF_SECTION parent,
char const *  attr,
char const *  value,
fr_token_t  name1_token,
fr_token_t  op_token,
fr_token_t  value_token,
char *  buff,
char const *  filename,
int  lineno 
)
static

Definition at line 2174 of file cf_file.c.

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

◆ cf_expand_variables()

char const * cf_expand_variables ( char const *  cf,
int  lineno,
CONF_SECTION outer_cs,
char *  output,
size_t  outsize,
char const *  input,
ssize_t  inlen,
bool soft_fail,
bool  soft_fail_env 
)

Definition at line 162 of file cf_file.c.

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

◆ cf_file_check()

cf_file_check_err_t cf_file_check ( CONF_PAIR cp,
bool  check_perms 
)

Do some checks on the file as an "input" file.

i.e. one read by a module.

Note
Must be called with super user privileges.
Parameters
cpcurrently being processed.
check_permsIf true - will return error if file is world readable, or not readable by the unprivileged user/group.
Returns
  • CF_FILE_OK if the socket exists and is a socket.
  • CF_FILE_NO_EXIST if the file doesn't exist.
  • CF_FILE_NO_PERMISSION if the file exists but is not accessible.
  • CF_FILE_OTHER_ERROR any other error.

Definition at line 922 of file cf_file.c.

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

◆ cf_file_check_effective()

cf_file_check_err_t cf_file_check_effective ( char const *  filename,
cf_file_check_err_t(*)(char const *filename, void *uctx)  cb,
void *  uctx 
)

Perform an operation with the effect/group set to conf_check_gid and conf_check_uid.

Parameters
filenameCONF_PAIR for the file being checked
cbcallback function to perform the check
uctxuser context for the callback
Returns
  • CF_FILE_OTHER_ERROR if there was a problem modifying permissions
  • The return value from the callback

Definition at line 693 of file cf_file.c.

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

◆ cf_file_check_open_read()

cf_file_check_err_t cf_file_check_open_read ( char const *  filename,
void *  uctx 
)

Callback for cf_file_check to open a file and check permissions.

This is used to check if a file exists, and is readable by the unprivileged user/group.

Parameters
filenamecurrently being processed.
uctxuser context, which is a pointer to cf_file_t
Returns
  • CF_FILE_OK if the file exists and is readable.
  • CF_FILE_NO_EXIST if the file does not exist.
  • CF_FILE_NO_PERMISSION if the file exists but is not accessible.
  • CF_FILE_OTHER_ERROR if there was any other error.

Definition at line 872 of file cf_file.c.

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

◆ cf_file_check_set_uid_gid()

void cf_file_check_set_uid_gid ( uid_t  uid,
gid_t  gid 
)

Set the euid/egid used when performing file checks.

Sets the euid, and egid used when cf_file_check is called to check permissions on conf items of type CONF_FLAG_FILE_READABLE

Note
This is probably only useful for the freeradius daemon itself.
Parameters
uidto set, (uid_t)-1 to use current euid.
gidto set, (gid_t)-1 to use current egid.

Definition at line 678 of file cf_file.c.

◆ cf_file_check_unix_connect()

cf_file_check_err_t cf_file_check_unix_connect ( char const *  filename,
UNUSED void *  uctx 
)

Check if we can connect to a unix socket.

Parameters
[in]filenameCONF_PAIR for the unix socket path
[in]uctxuser context, not used
Returns
  • CF_FILE_OK if the socket exists and is a socket.
  • CF_FILE_NO_EXIST if the file doesn't exist.
  • CF_FILE_NO_PERMISSION if the file exists but is not accessible.
  • CF_FILE_NO_UNIX_SOCKET if the file exists but is not a socket.
  • CF_FILE_OTHER_ERROR any other error.

Definition at line 753 of file cf_file.c.

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

◆ cf_file_check_unix_perm()

cf_file_check_err_t cf_file_check_unix_perm ( char const *  filename,
UNUSED void *  uctx 
)

Check if file exists, and is a socket.

Parameters
[in]filenameCONF_PAIR for the unix socket path
[in]uctxuser context, not used
Returns
  • CF_FILE_OK if the socket exists and is a socket.
  • CF_FILE_NO_EXIST if the file doesn't exist.
  • CF_FILE_NO_PERMISSION if the file exists but is not accessible.
  • CF_FILE_NO_UNIX_SOCKET if the file exists but is not a socket.
  • CF_FILE_OTHER_ERROR any other error.

Definition at line 826 of file cf_file.c.

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

◆ cf_file_fill()

static int cf_file_fill ( cf_stack_t stack)
static

Definition at line 3353 of file cf_file.c.

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

◆ cf_file_free()

void cf_file_free ( CONF_SECTION cs)

Definition at line 3792 of file cf_file.c.

+ Here is the call graph for this function:

◆ cf_file_include()

static int cf_file_include ( cf_stack_t stack)
static

Definition at line 3494 of file cf_file.c.

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

◆ cf_file_open()

static int cf_file_open ( CONF_SECTION cs,
char const *  filename,
bool  from_dir,
FILE **  fp_p 
)
static

Definition at line 567 of file cf_file.c.

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

◆ cf_file_read()

int cf_file_read ( CONF_SECTION cs,
char const *  filename,
bool  root 
)

Definition at line 3710 of file cf_file.c.

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

◆ cf_get_token()

static int cf_get_token ( CONF_SECTION parent,
char const **  ptr_p,
fr_token_t token,
char *  buffer,
size_t  buflen,
char const *  filename,
int  lineno 
)
static

Definition at line 1048 of file cf_file.c.

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

◆ cf_local_file()

static char const * cf_local_file ( char const *  base,
char const *  filename,
char *  buffer,
size_t  bufsize 
)
static

Definition at line 1019 of file cf_file.c.

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

◆ cf_md5_final()

void cf_md5_final ( uint8_t digest)

Definition at line 3341 of file cf_file.c.

+ Here is the caller graph for this function:

◆ cf_md5_init()

void cf_md5_init ( void  )

Definition at line 3328 of file cf_file.c.

+ Here is the caller graph for this function:

◆ cf_md5_update()

static void cf_md5_update ( char const *  p)
static

Definition at line 3334 of file cf_file.c.

+ Here is the caller graph for this function:

◆ cf_pair_write()

int cf_pair_write ( FILE *  fp,
CONF_PAIR cp 
)

Definition at line 3832 of file cf_file.c.

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

◆ cf_reference_item()

CONF_ITEM * cf_reference_item ( CONF_SECTION const *  parent_cs,
CONF_SECTION const *  outer_cs,
char const *  ptr 
)

Definition at line 3964 of file cf_file.c.

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

◆ cf_section_pass2()

int cf_section_pass2 ( CONF_SECTION cs)

Definition at line 984 of file cf_file.c.

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

◆ cf_section_set_unlang()

void cf_section_set_unlang ( CONF_SECTION cs)

Definition at line 4202 of file cf_file.c.

+ Here is the caller graph for this function:

◆ cf_section_write()

int cf_section_write ( FILE *  fp,
CONF_SECTION cs,
int  depth 
)

Definition at line 3848 of file cf_file.c.

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

◆ cf_section_write_children()

int cf_section_write_children ( FILE *  fp,
CONF_SECTION cs,
int  depth 
)

Emit the children of a section at depth without an enclosing { ... }.

cf_section_write wraps a section in name { ... }; this helper writes only the children at the requested indent, which is what tools like radjson2conf -r need: rendering a synthetic-root section as a file-scope fragment ready to be $INCLUDEd at any depth.

Blank lines in the source come back through as NULL-text CONF_ITEM_COMMENT markers, so the writer doesn't have to synthesise its own separators - just emit what's there. Consecutive blank markers collapse to a single blank line on output so artifacts from upstream tooling (deletes that left their preceding blank behind, splits that introduced extra spacers) don't accumulate as visible whitespace.

Definition at line 3903 of file cf_file.c.

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

◆ cf_stack_cleanup()

static void cf_stack_cleanup ( cf_stack_t stack)
static

Definition at line 3676 of file cf_file.c.

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

◆ cf_string_write()

static ssize_t cf_string_write ( FILE *  fp,
char const *  string,
size_t  len,
fr_token_t  t 
)
static

Definition at line 3799 of file cf_file.c.

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

◆ cf_template_merge()

static bool cf_template_merge ( CONF_SECTION cs,
CONF_SECTION const *  template 
)
static

Definition at line 482 of file cf_file.c.

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

◆ filename_cmp()

static int8_t filename_cmp ( void const *  one,
void const *  two 
)
static

Definition at line 1102 of file cf_file.c.

+ Here is the caller graph for this function:

◆ frame_readdir()

static int frame_readdir ( cf_stack_t stack)
static

Definition at line 3291 of file cf_file.c.

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

◆ parse_error()

static int parse_error ( cf_stack_t stack,
char const *  ptr,
char const *  message 
)
static

Definition at line 1918 of file cf_file.c.

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

◆ parse_input()

static int parse_input ( cf_stack_t stack)
static

Definition at line 2360 of file cf_file.c.

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

◆ parse_type_name()

static int parse_type_name ( cf_stack_t stack,
char const **  ptr_p,
char const *  type_ptr,
fr_type_t type_p 
)
static

Definition at line 1938 of file cf_file.c.

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

◆ process_catch()

static CONF_ITEM * process_catch ( cf_stack_t stack)
static

Definition at line 1826 of file cf_file.c.

+ Here is the call graph for this function:

◆ process_foreach()

static CONF_ITEM * process_foreach ( cf_stack_t stack)
static

Definition at line 1989 of file cf_file.c.

+ Here is the call graph for this function:

◆ process_if()

static CONF_ITEM * process_if ( cf_stack_t stack)
static

Definition at line 1466 of file cf_file.c.

+ Here is the call graph for this function:

◆ process_include()

static int process_include ( cf_stack_t stack,
CONF_SECTION parent,
char const *  ptr,
bool  required,
bool  relative 
)
static

Definition at line 1113 of file cf_file.c.

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

◆ process_map()

static CONF_ITEM * process_map ( cf_stack_t stack)
static

Definition at line 1617 of file cf_file.c.

+ Here is the call graph for this function:

◆ process_subrequest()

static CONF_ITEM * process_subrequest ( cf_stack_t stack)
static

Definition at line 1705 of file cf_file.c.

+ Here is the call graph for this function:

◆ process_switch()

static CONF_ITEM * process_switch ( cf_stack_t stack)
static

Definition at line 2233 of file cf_file.c.

+ Here is the call graph for this function:

◆ process_template()

static int process_template ( cf_stack_t stack)
static

Definition at line 1393 of file cf_file.c.

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

Variable Documentation

◆ cf_md5_ctx

fr_md5_ctx_t* cf_md5_ctx = NULL
static

Definition at line 3326 of file cf_file.c.

◆ cf_name_char1

const bool cf_name_char1[SBUFF_CHAR_CLASS]
static
Initial value:
= {
[ '0' ... '9' ] = true,
[ 'A' ... 'Z' ] = true,
[ 'a' ... 'z' ] = true,
[ '%' ] = true,
[ '@' ] = true,
[ '-' ] = true,
[ '&' ] = true,
}

Convert tokens back to a quoting character.

Non-string types convert to '?' to screw ups can be identified easily

Definition at line 2349 of file cf_file.c.

◆ check_config

bool check_config = false

Definition at line 61 of file cf_file.c.

◆ conf_check_gid

gid_t conf_check_gid = (gid_t)-1
static

Definition at line 63 of file cf_file.c.

◆ conf_check_uid

uid_t conf_check_uid = (uid_t)-1
static

Definition at line 62 of file cf_file.c.

◆ conf_property_name

fr_table_num_sorted_t const conf_property_name[]
static
Initial value:
= {
{ L("instance"), CONF_PROPERTY_INSTANCE },
{ L("name"), CONF_PROPERTY_NAME }
}
#define L(_str)
Helper for initialising arrays of string literals.
Definition build.h:228
@ CONF_PROPERTY_NAME
Definition cf_file.c:67
@ CONF_PROPERTY_INSTANCE
Definition cf_file.c:68

Definition at line 71 of file cf_file.c.

◆ conf_property_name_len

size_t conf_property_name_len = NUM_ELEMENTS(conf_property_name)
static

Definition at line 75 of file cf_file.c.

◆ parse_tabs

char const parse_tabs[] = " "
static

Definition at line 3797 of file cf_file.c.

◆ server_unlang_section

fr_table_num_sorted_t const server_unlang_section[]
static
Initial value:
= {
{ L("accounting"), true },
{ L("add"), true },
{ L("authenticate"), true },
{ L("clear"), true },
{ L("deny"), true },
{ L("error"), true },
{ L("establish"), true },
{ L("finally"), true },
{ L("load"), true },
{ L("new"), true },
{ L("recv"), true },
{ L("send"), true },
{ L("store"), true },
{ L("verify"), true },
}

Definition at line 77 of file cf_file.c.

◆ server_unlang_section_len

size_t server_unlang_section_len = NUM_ELEMENTS(server_unlang_section)
static

Definition at line 93 of file cf_file.c.

◆ terminal_end_line

const bool terminal_end_line[SBUFF_CHAR_CLASS]
static
Initial value:
= {
[0] = true,
['\r'] = true,
['\n'] = true,
['#'] = true,
[','] = true,
[';'] = true,
['}'] = true,
}

Definition at line 1454 of file cf_file.c.

◆ terminal_end_section

const bool terminal_end_section[SBUFF_CHAR_CLASS]
static
Initial value:
= {
['{'] = true,
}

Definition at line 1450 of file cf_file.c.

◆ unlang_keywords

fr_table_ptr_sorted_t unlang_keywords[]
static
Initial value:
= {
{ L("catch"), (void *) process_catch },
{ L("elsif"), (void *) process_if },
{ L("foreach"), (void *) process_foreach },
{ L("if"), (void *) process_if },
{ L("map"), (void *) process_map },
{ L("subrequest"), (void *) process_subrequest },
{ L("switch"), (void *) process_switch }
}
static CONF_ITEM * process_map(cf_stack_t *stack)
Definition cf_file.c:1617
static CONF_ITEM * process_foreach(cf_stack_t *stack)
Definition cf_file.c:1989
static CONF_ITEM * process_subrequest(cf_stack_t *stack)
Definition cf_file.c:1705
static CONF_ITEM * process_if(cf_stack_t *stack)
Definition cf_file.c:1466
static CONF_ITEM * process_catch(cf_stack_t *stack)
Definition cf_file.c:1826
static CONF_ITEM * process_switch(cf_stack_t *stack)
Definition cf_file.c:2233

Definition at line 2325 of file cf_file.c.

◆ unlang_keywords_len

int unlang_keywords_len = NUM_ELEMENTS(unlang_keywords)
static

Definition at line 2334 of file cf_file.c.