The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
rlm_detail.c
Go to the documentation of this file.
1/*
2 * This program is is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or (at
5 * your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17/**
18 * $Id: 2892af8d3c4e26336cce328796534b1bb6792686 $
19 * @file rlm_detail.c
20 * @brief Write plaintext versions of packets to flatfiles.
21 *
22 * @copyright 2000,2006 The FreeRADIUS server project
23 */
24RCSID("$Id: 2892af8d3c4e26336cce328796534b1bb6792686 $")
25
26#include <freeradius-devel/server/base.h>
27#include <freeradius-devel/server/cf_util.h>
28#include <freeradius-devel/server/exfile.h>
29#include <freeradius-devel/server/module_rlm.h>
30#include <freeradius-devel/util/debug.h>
31#include <freeradius-devel/util/perm.h>
32
33#include <ctype.h>
34#include <fcntl.h>
35#include <sys/stat.h>
36
37#ifdef HAVE_UNISTD_H
38# include <unistd.h>
39#endif
40
41#ifdef HAVE_GRP_H
42# include <grp.h>
43#endif
44
45/** Instance configuration for rlm_detail
46 *
47 * Holds the configuration and preparsed data for a instance of rlm_detail.
48 */
49typedef struct {
50 mode_t perm; //!< Permissions to use for new files.
51 gid_t group; //!< Resolved group.
52 bool group_is_set; //!< Whether group was set.
53
54 bool locking; //!< Whether the file should be locked.
55
56 bool log_srcdst; //!< Add IP src/dst attributes to entries.
57
58 bool escape; //!< do filename escaping, yes / no
59
60 exfile_t *ef; //!< Log file handler
62
63typedef struct {
64 fr_value_box_t filename; //!< File / path to write to.
65 tmpl_t *filename_tmpl; //!< tmpl used to expand filename (for debug output)
66 fr_value_box_t header; //!< Header format
67 fr_hash_table_t *ht; //!< Holds suppressed attributes.
69
70/*
71 * @todo - put this into common function in cf_parse.c ?
72 */
73
74static const conf_parser_t module_config[] = {
75 { FR_CONF_OFFSET("permissions", rlm_detail_t, perm), .dflt = "0600", .func = cf_parse_permissions },
76 { FR_CONF_OFFSET_IS_SET("group", FR_TYPE_VOID, 0, rlm_detail_t, group), .func = cf_parse_gid },
77 { FR_CONF_OFFSET("locking", rlm_detail_t, locking), .dflt = "no" },
78 { FR_CONF_OFFSET("escape_filenames", rlm_detail_t, escape), .dflt = "no" },
79 { FR_CONF_OFFSET("log_packet_header", rlm_detail_t, log_srcdst), .dflt = "no" },
81};
82
84static fr_dict_t const *dict_radius;
85
88 { .out = &dict_freeradius, .proto = "freeradius" },
89 { .out = &dict_radius, .proto = "radius" },
90 { NULL }
91};
92
98
101 { .out = &attr_net, .name = "Net", .type = FR_TYPE_TLV, .dict = &dict_freeradius },
102 { .out = &attr_net_dst_address, .name = "Net.Dst.IP", .type = FR_TYPE_COMBO_IP_ADDR, .dict = &dict_freeradius },
103 { .out = &attr_net_dst_port, .name = "Net.Dst.Port", .type = FR_TYPE_UINT16, .dict = &dict_freeradius },
104 { .out = &attr_net_src_address, .name = "Net.Src.IP", .type = FR_TYPE_COMBO_IP_ADDR, .dict = &dict_freeradius },
105 { .out = &attr_net_src_port, .name = "Net.Src.Port", .type = FR_TYPE_UINT16, .dict = &dict_freeradius },
106
107 { NULL }
108};
109
110/** Print one attribute and value to FP
111 *
112 * Complete string with '\\t' and '\\n' is written to buffer before printing to
113 * avoid issues when running with multiple threads.
114 *
115 * @todo - This function should print *flattened* lists.
116 *
117 * @param fp to output to.
118 * @param vp to print.
119 * @return
120 * - >=0 on success
121 * - <0 on error
122 */
123static int CC_HINT(nonnull) fr_pair_fprint(FILE *fp, fr_pair_t const *vp)
124{
125 char buff[1024];
126 fr_sbuff_t sbuff = FR_SBUFF_OUT(buff, sizeof(buff));
127
129
130 (void) fr_sbuff_in_char(&sbuff, '\t');
131 (void) fr_pair_print(&sbuff, NULL, vp);
132 (void) fr_sbuff_in_char(&sbuff, '\n');
133
134 if (fputs(buff, fp) == EOF) return -1;
135
136 return 0;
137}
138
139
140
141static uint32_t detail_hash(void const *data)
142{
143 fr_dict_attr_t const *da = data;
144 return fr_hash(&da, sizeof(da));
145}
146
147static int8_t detail_cmp(void const *a, void const *b)
148{
149 return CMP(a, b);
150}
151
152/*
153 * (Re-)read radiusd.conf into memory.
154 */
155static int mod_instantiate(module_inst_ctx_t const *mctx)
156{
157 rlm_detail_t *inst = talloc_get_type_abort(mctx->mi->data, rlm_detail_t);
158 CONF_SECTION *conf = mctx->mi->conf;
159
160 inst->ef = module_rlm_exfile_init(inst, conf, 256, fr_time_delta_from_sec(30), inst->locking, NULL, NULL);
161 if (!inst->ef) {
162 cf_log_err(conf, "Failed creating log file context");
163 return -1;
164 }
165
166 return 0;
167}
168
169/*
170 * Wrapper for VPs allocated on the stack.
171 */
172static void detail_fr_pair_fprint(TALLOC_CTX *ctx, FILE *out, fr_pair_t const *stacked)
173{
174 fr_pair_t *vp;
175
176 vp = fr_pair_copy(ctx, stacked);
177 if (unlikely(vp == NULL)) return;
178
179 vp->op = T_OP_EQ;
180 (void) fr_pair_fprint(out, vp);
182}
183
184
186{
187 fr_pair_list_foreach(list, vp) {
188 if (ht && fr_hash_table_find(ht, vp->da)) continue;
189
190 if (fr_type_is_leaf(vp->vp_type)) {
191 if (fr_pair_fprint(out, vp) < 0) return -1;
192 continue;
193 }
194
196
197 if (detail_recurse(out, ht, &vp->vp_group) < 0) return -1;
198 }
199
200 return 0;
201}
202
203/** Write a single detail entry to file pointer
204 *
205 * @param[in] out Where to write entry.
206 * @param[in] inst Instance of rlm_detail.
207 * @param[in] request The current request.
208 * @param[in] header To print above packet
209 * @param[in] packet associated with the request (request, reply...).
210 * @param[in] list of pairs to write.
211 * @param[in] ht Hash table containing attributes to be suppressed in the output.
212 */
213static int detail_write(FILE *out, rlm_detail_t const *inst, request_t *request, fr_value_box_t *header,
214 fr_packet_t *packet, fr_pair_list_t *list, fr_hash_table_t *ht)
215{
216 fr_dict_attr_t const *da;
217
218 if (fr_pair_list_empty(list)) {
219 RWDEBUG("Skipping empty packet");
220 return 0;
221 }
222
223#define WRITE(fmt, ...) do { \
224 if (fprintf(out, fmt, ## __VA_ARGS__) < 0) goto fail; \
225 } while(0)
226
227 WRITE("%s\n", header->vb_strvalue);
228
229 /*
230 * Write the Packet-Type, but only if we're not suppressing it.
231 */
232 da = fr_dict_attr_by_name(NULL, fr_dict_root(request->proto_dict), "Packet-Type");
233 if (ht && da && !fr_hash_table_find(ht, da)) {
234 char const *name = NULL;
235
237
238 /*
239 * Print out names, if they're OK.
240 * Numbers, if not.
241 */
242 if (name) {
243 WRITE("\tPacket-Type = %s\n", name);
244 } else {
245 WRITE("\tPacket-Type = %u\n", packet->code);
246 }
247 }
248
249 /*
250 * Put these at the top as distinct (not nested) VPs.
251 */
252 if (inst->log_srcdst) {
253 fr_pair_t *src_vp, *dst_vp;
254
255 src_vp = fr_pair_find_by_da_nested(&request->control_pairs, NULL, attr_net_src_address);
256 dst_vp = fr_pair_find_by_da_nested(&request->control_pairs, NULL, attr_net_dst_address);
257
258 /*
259 * These pairs will exist, but Coverity doesn't know that
260 */
261 if (src_vp) detail_fr_pair_fprint(request, out, src_vp);
262 if (dst_vp) detail_fr_pair_fprint(request, out, dst_vp);
263
264 src_vp = fr_pair_find_by_da_nested(&request->control_pairs, NULL, attr_net_src_port);
265 dst_vp = fr_pair_find_by_da_nested(&request->control_pairs, NULL, attr_net_dst_port);
266
267 if (src_vp) detail_fr_pair_fprint(request, out, src_vp);
268 if (dst_vp) detail_fr_pair_fprint(request, out, dst_vp);
269 }
270
271 /*
272 * Write each attribute/value to the log file
273 */
274 fr_pair_list_foreach(list, vp) {
275 if (ht && fr_hash_table_find(ht, vp->da)) continue;
276
277 /*
278 * Skip Net.* if we're not logging src/dst
279 */
280 if (!inst->log_srcdst && (da == attr_net)) continue;
281
282 if (fr_type_is_leaf(vp->vp_type)) {
283 if (fr_pair_fprint(out, vp) < 0) {
284 fail:
285 RERROR("Failed writing to detail file: %s", fr_syserror(errno));
286 return -1;
287 }
288
289 continue;
290 }
291
293
294 if (detail_recurse(out, ht, &vp->vp_group) < 0) goto fail;
295 }
296
297 WRITE("\tTimestamp = %lu\n", (unsigned long) fr_time_to_sec(request->packet->timestamp));
298
299 WRITE("\n");
300
301 return 0;
302}
303
304/*
305 * Do detail, compatible with old accounting
306 */
307static unlang_action_t CC_HINT(nonnull) detail_do(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request,
308 fr_packet_t *packet, fr_pair_list_t *list)
309{
310 rlm_detail_env_t *env = talloc_get_type_abort(mctx->env_data, rlm_detail_env_t);
311 int outfd, dupfd;
312 FILE *outfp = NULL;
313
315
316 RDEBUG2("%s expands to %pV", env->filename_tmpl->name, &env->filename);
317
318 outfd = exfile_open(inst->ef, env->filename.vb_strvalue, inst->perm, NULL);
319 if (outfd < 0) {
320 RPERROR("Couldn't open file %pV", &env->filename);
321 *p_result = RLM_MODULE_FAIL;
322 /* coverity[missing_unlock] */
324 }
325
326 if (inst->group_is_set) {
327 if (chown(env->filename.vb_strvalue, -1, inst->group) == -1) {
328 RERROR("Unable to set detail file group to '%d': %s", inst->group, fr_syserror(errno));
329 goto fail;
330 }
331 }
332
333 dupfd = dup(outfd);
334 if (dupfd < 0) {
335 RERROR("Failed to dup() file descriptor for detail file");
336 goto fail;
337 }
338
339 /*
340 * Open the output fp for buffering.
341 */
342 if ((outfp = fdopen(dupfd, "a")) == NULL) {
343 RERROR("Couldn't open file %pV: %s", &env->filename, fr_syserror(errno));
344 fail:
345 if (outfp) fclose(outfp);
346 exfile_close(inst->ef, outfd);
348 }
349
350 if (detail_write(outfp, inst, request, &env->header, packet, list, env->ht) < 0) goto fail;
351
352 /*
353 * Flush everything
354 */
355 fclose(outfp);
356 exfile_close(inst->ef, outfd);
357
358 /*
359 * And everything is fine.
360 */
362}
363
364/*
365 * Accounting - write the detail files.
366 */
367static unlang_action_t CC_HINT(nonnull) mod_accounting(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
368{
369 return detail_do(p_result, mctx, request, request->packet, &request->request_pairs);
370}
371
372/*
373 * Incoming Access Request - write the detail files.
374 */
375static unlang_action_t CC_HINT(nonnull) mod_authorize(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
376{
377 return detail_do(p_result, mctx, request, request->packet, &request->request_pairs);
378}
379
380/*
381 * Outgoing Access-Request Reply - write the detail files.
382 */
383static unlang_action_t CC_HINT(nonnull) mod_post_auth(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
384{
385 return detail_do(p_result, mctx, request, request->reply, &request->reply_pairs);
386}
387
388static int call_env_filename_parse(TALLOC_CTX *ctx, void *out, tmpl_rules_t const *t_rules,
389 CONF_ITEM *ci,
390 call_env_ctx_t const *cec, UNUSED call_env_parser_t const *rule)
391{
393 tmpl_t *parsed;
394 CONF_PAIR const *to_parse = cf_item_to_pair(ci);
395 tmpl_rules_t our_rules;
396
397 our_rules = *t_rules;
400 .safe_for = (inst->escape) ? (fr_value_box_safe_for_t)rad_filename_box_escape :
402 .always_escape = false,
403 };
405 our_rules.literals_safe_for = our_rules.escape.box_escape.safe_for;
406
407 if (tmpl_afrom_substr(ctx, &parsed,
408 &FR_SBUFF_IN(cf_pair_value(to_parse), talloc_array_length(cf_pair_value(to_parse)) - 1),
410 &our_rules) < 0) return -1;
411
412 *(void **)out = parsed;
413 return 0;
414}
415
416static int call_env_suppress_parse(TALLOC_CTX *ctx, call_env_parsed_head_t *out, tmpl_rules_t const *t_rules,
417 CONF_ITEM *ci,
418 UNUSED call_env_ctx_t const *cec, UNUSED call_env_parser_t const *rule)
419{
420 CONF_SECTION const *cs = cf_item_to_section(ci);
422 call_env_parsed_t *parsed;
423 CONF_ITEM const *to_parse = NULL;
424 char const *attr;
425 fr_dict_attr_t const *da;
426 fr_hash_table_t *ht;
427
428 MEM(parsed = call_env_parsed_add(ctx, out,
430
431 ht = fr_hash_table_alloc(parsed, detail_hash, detail_cmp, NULL);
432
433 while ((to_parse = cf_item_next(cs, to_parse))) {
434 if (!cf_item_is_pair(to_parse)) continue;
435
436 attr = cf_pair_attr(cf_item_to_pair(to_parse));
437 if (!attr) continue;
438
439 da = fr_dict_attr_search_by_qualified_oid(NULL, t_rules->attr.dict_def, attr, false, false);
440 if (!da) {
441 cf_log_perr(to_parse, "Failed resolving attribute");
442 return -1;
443 }
444
445 /*
446 * Be kind to minor mistakes
447 */
448 if (fr_hash_table_find(ht, da)) {
449 cf_log_warn(to_parse, "Ignoring duplicate entry '%s'", attr);
450 continue;
451 }
452
453 if (!fr_hash_table_insert(ht, da)) {
454 cf_log_perr(to_parse, "Failed inserting '%s' into suppression table", attr);
455 return -1;
456 }
457
458 DEBUG("%s - '%s' suppressed, will not appear in detail output", cf_section_name(parent), attr);
459 }
460
461 /*
462 * Clear up if nothing is actually to be suppressed
463 */
464 if (fr_hash_table_num_elements(ht) == 0) {
465 talloc_free(ht);
466 call_env_parsed_free(out, parsed);
467 return 0;
468 }
469
471 call_env_parsed_set_data(parsed, ht);
472
473 return 0;
474}
475
487
488/* globally exported name */
491 .common = {
492 .magic = MODULE_MAGIC_INIT,
493 .name = "detail",
494 .inst_size = sizeof(rlm_detail_t),
497 },
498 .method_group = {
499 .bindings = (module_method_binding_t[]){
500 { .section = SECTION_NAME("accounting", CF_IDENT_ANY), .method = mod_accounting, .method_env = &method_env },
501 { .section = SECTION_NAME("recv", "accounting-request"), .method = mod_accounting, .method_env = &method_env },
502 { .section = SECTION_NAME("send", "accounting-response"), .method = mod_accounting, .method_env = &method_env },
503 { .section = SECTION_NAME("recv", CF_IDENT_ANY), .method = mod_authorize, .method_env = &method_env },
504 { .section = SECTION_NAME("send", CF_IDENT_ANY), .method = mod_post_auth, .method_env = &method_env },
506 }
507 }
508};
unlang_action_t
Returned by unlang_op_t calls, determine the next action of the interpreter.
Definition action.h:35
@ UNLANG_ACTION_CALCULATE_RESULT
Calculate a new section rlm_rcode_t value.
Definition action.h:37
#define RCSID(id)
Definition build.h:485
#define CMP(_a, _b)
Same as CMP_PREFER_SMALLER use when you don't really care about ordering, you just want an ordering.
Definition build.h:112
#define unlikely(_x)
Definition build.h:383
#define UNUSED
Definition build.h:317
void call_env_parsed_free(call_env_parsed_head_t *parsed, call_env_parsed_t *ptr)
Remove a call_env_parsed_t from the list of parsed call envs.
Definition call_env.c:733
call_env_parsed_t * call_env_parsed_add(TALLOC_CTX *ctx, call_env_parsed_head_t *head, call_env_parser_t const *rule)
Allocate a new call_env_parsed_t structure and add it to the list of parsed call envs.
Definition call_env.c:646
void call_env_parsed_set_data(call_env_parsed_t *parsed, void const *data)
Assign data to a call_env_parsed_t.
Definition call_env.c:703
#define CALL_ENV_TERMINATOR
Definition call_env.h:236
#define FR_CALL_ENV_PARSE_OFFSET(_name, _cast_type, _flags, _struct, _field, _parse_field)
Specify a call_env_parser_t which writes out runtime results and the result of the parsing phase to t...
Definition call_env.h:365
#define FR_CALL_ENV_METHOD_OUT(_inst)
Helper macro for populating the size/type fields of a call_env_method_t from the output structure typ...
Definition call_env.h:240
call_env_parser_t const * env
Parsing rules for call method env.
Definition call_env.h:247
@ CALL_ENV_FLAG_CONCAT
If the tmpl produced multiple boxes they should be concatenated.
Definition call_env.h:76
@ CALL_ENV_FLAG_NONE
Definition call_env.h:74
@ CALL_ENV_FLAG_REQUIRED
Associated conf pair or section is required.
Definition call_env.h:75
module_instance_t const * mi
Module instance that the callenv is registered to.
Definition call_env.h:229
#define FR_CALL_ENV_SUBSECTION_FUNC(_name, _name2, _flags, _func)
Specify a call_env_parser_t which parses a subsection using a callback function.
Definition call_env.h:412
#define FR_CALL_ENV_OFFSET(_name, _cast_type, _flags, _struct, _field)
Specify a call_env_parser_t which writes out runtime results to the specified field.
Definition call_env.h:340
#define FR_CALL_ENV_PARSE_ONLY_OFFSET(_name, _cast_type, _flags, _struct, _parse_field)
Specify a call_env_parser_t which writes out the result of the parsing phase to the field specified.
Definition call_env.h:389
Per method call config.
Definition call_env.h:180
int cf_parse_gid(TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
Generic function for resolving GID strings to uid_t values.
Definition cf_parse.c:1659
int cf_parse_permissions(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
Generic function for resolving permissions to a mode-t.
Definition cf_parse.c:1674
#define CONF_PARSER_TERMINATOR
Definition cf_parse.h:658
cf_parse_t func
Override default parsing behaviour for the specified type with a custom parsing function.
Definition cf_parse.h:612
#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:284
#define FR_CONF_OFFSET_IS_SET(_name, _type, _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:298
Defines a CONF_PAIR to C data type mapping.
Definition cf_parse.h:595
Common header for all CONF_* types.
Definition cf_priv.h:49
Configuration AVP similar to a fr_pair_t.
Definition cf_priv.h:70
A section grouping multiple CONF_PAIR.
Definition cf_priv.h:101
bool cf_item_is_pair(CONF_ITEM const *ci)
Determine if CONF_ITEM is a CONF_PAIR.
Definition cf_util.c:631
CONF_SECTION * cf_item_to_section(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_SECTION.
Definition cf_util.c:683
char const * cf_section_name(CONF_SECTION const *cs)
Return name2 if set, else name1.
Definition cf_util.c:1196
fr_token_t cf_pair_value_quote(CONF_PAIR const *pair)
Return the value (rhs) quoting of a pair.
Definition cf_util.c:1637
CONF_PAIR * cf_item_to_pair(CONF_ITEM const *ci)
Cast a CONF_ITEM to a CONF_PAIR.
Definition cf_util.c:663
char const * cf_pair_value(CONF_PAIR const *pair)
Return the value of a CONF_PAIR.
Definition cf_util.c:1593
char const * cf_pair_attr(CONF_PAIR const *pair)
Return the attr of a CONF_PAIR.
Definition cf_util.c:1577
#define cf_log_err(_cf, _fmt,...)
Definition cf_util.h:289
#define cf_parent(_cf)
Definition cf_util.h:101
#define cf_item_next(_parent, _curr)
Definition cf_util.h:92
#define cf_log_perr(_cf, _fmt,...)
Definition cf_util.h:296
#define cf_log_warn(_cf, _fmt,...)
Definition cf_util.h:290
#define CF_IDENT_ANY
Definition cf_util.h:78
#define MEM(x)
Definition debug.h:36
#define DEBUG(fmt,...)
Definition dhcpclient.c:39
fr_dict_attr_t const * fr_dict_attr_search_by_qualified_oid(fr_dict_attr_err_t *err, fr_dict_t const *dict_def, char const *attr, bool internal, bool foreign))
Locate a qualified fr_dict_attr_t by its name and a dictionary qualifier.
Definition dict_util.c:3084
fr_dict_attr_t const * fr_dict_attr_by_name(fr_dict_attr_err_t *err, fr_dict_attr_t const *parent, char const *attr))
Locate a fr_dict_attr_t by its name.
Definition dict_util.c:3266
fr_dict_attr_t const * fr_dict_root(fr_dict_t const *dict)
Return the root attribute of a dictionary.
Definition dict_util.c:2403
fr_dict_attr_t const ** out
Where to write a pointer to the resolved fr_dict_attr_t.
Definition dict.h:273
fr_dict_t const ** out
Where to write a pointer to the loaded/resolved fr_dict_t.
Definition dict.h:286
char const * fr_dict_enum_name_by_value(fr_dict_attr_t const *da, fr_value_box_t const *value)
Lookup the name of an enum value in a fr_dict_attr_t.
Definition dict_util.c:3426
Specifies an attribute which must be present for the module to function.
Definition dict.h:272
Specifies a dictionary which must be loaded/loadable for the module to function.
Definition dict.h:285
#define MODULE_MAGIC_INIT
Stop people using different module/library/server versions together.
Definition dl_module.h:63
int exfile_open(exfile_t *ef, char const *filename, mode_t permissions, off_t *offset)
Open a new log file, or maybe an existing one.
Definition exfile.c:505
int exfile_close(exfile_t *ef, int fd)
Close the log file.
Definition exfile.c:561
void * fr_hash_table_find(fr_hash_table_t *ht, void const *data)
Find data in a hash table.
Definition hash.c:429
uint32_t fr_hash(void const *data, size_t size)
Definition hash.c:812
bool fr_hash_table_insert(fr_hash_table_t *ht, void const *data)
Insert data into a hash table.
Definition hash.c:468
void fr_hash_table_fill(fr_hash_table_t *ht)
Ensure all buckets are filled.
Definition hash.c:719
uint32_t fr_hash_table_num_elements(fr_hash_table_t *ht)
Definition hash.c:610
#define fr_hash_table_alloc(_ctx, _hash_node, _cmp_node, _free_node)
Definition hash.h:58
#define RWDEBUG(fmt,...)
Definition log.h:361
#define RERROR(fmt,...)
Definition log.h:298
#define RPERROR(fmt,...)
Definition log.h:302
int rad_filename_box_escape(fr_value_box_t *vb, UNUSED void *uxtc)
Definition util.c:281
int rad_filename_box_make_safe(fr_value_box_t *vb, UNUSED void *uxtc)
Definition util.c:160
talloc_free(reap)
@ FR_TYPE_TLV
Contains nested attributes.
@ FR_TYPE_STRING
String of printable characters.
@ FR_TYPE_UINT16
16 Bit unsigned integer.
@ FR_TYPE_VOID
User data.
@ FR_TYPE_COMBO_IP_ADDR
IPv4 or IPv6 address depending on length.
unsigned int uint32_t
unsigned int mode_t
void * env_data
Per call environment data.
Definition module_ctx.h:44
module_instance_t const * mi
Instance of the module being instantiated.
Definition module_ctx.h:42
module_instance_t * mi
Instance of the module being instantiated.
Definition module_ctx.h:51
Temporary structure to hold arguments for module calls.
Definition module_ctx.h:41
Temporary structure to hold arguments for instantiation calls.
Definition module_ctx.h:50
exfile_t * module_rlm_exfile_init(TALLOC_CTX *ctx, CONF_SECTION *module, uint32_t max_entries, fr_time_delta_t max_idle, bool locking, char const *trigger_prefix, fr_pair_list_t *trigger_args)
Initialise a module specific exfile handle.
Definition module_rlm.c:102
module_t common
Common fields presented by all modules.
Definition module_rlm.h:39
fr_pair_t * fr_pair_find_by_da_nested(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da)
Find a pair with a matching fr_dict_attr_t, by walking the nested fr_dict_attr_t tree.
Definition pair.c:774
fr_pair_t * fr_pair_copy(TALLOC_CTX *ctx, fr_pair_t const *vp)
Copy a single valuepair.
Definition pair.c:493
static const conf_parser_t config[]
Definition base.c:183
#define fr_assert(_expr)
Definition rad_assert.h:38
#define RDEBUG2(fmt,...)
Definition radclient.h:54
static rs_t * conf
Definition radsniff.c:53
#define RETURN_MODULE_OK
Definition rcode.h:58
#define RETURN_MODULE_FAIL
Definition rcode.h:57
rlm_rcode_t
Return codes indicating the result of the module call.
Definition rcode.h:40
@ RLM_MODULE_FAIL
Module failed, don't reply.
Definition rcode.h:42
static void detail_fr_pair_fprint(TALLOC_CTX *ctx, FILE *out, fr_pair_t const *stacked)
Definition rlm_detail.c:172
static int call_env_filename_parse(TALLOC_CTX *ctx, void *out, tmpl_rules_t const *t_rules, CONF_ITEM *ci, call_env_ctx_t const *cec, UNUSED call_env_parser_t const *rule)
Definition rlm_detail.c:388
bool group_is_set
Whether group was set.
Definition rlm_detail.c:52
static int call_env_suppress_parse(TALLOC_CTX *ctx, call_env_parsed_head_t *out, tmpl_rules_t const *t_rules, CONF_ITEM *ci, UNUSED call_env_ctx_t const *cec, UNUSED call_env_parser_t const *rule)
Definition rlm_detail.c:416
static unlang_action_t detail_do(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request, fr_packet_t *packet, fr_pair_list_t *list)
Definition rlm_detail.c:307
static int detail_write(FILE *out, rlm_detail_t const *inst, request_t *request, fr_value_box_t *header, fr_packet_t *packet, fr_pair_list_t *list, fr_hash_table_t *ht)
Write a single detail entry to file pointer.
Definition rlm_detail.c:213
mode_t perm
Permissions to use for new files.
Definition rlm_detail.c:50
fr_value_box_t filename
File / path to write to.
Definition rlm_detail.c:64
static fr_dict_attr_t const * attr_net_dst_port
Definition rlm_detail.c:97
gid_t group
Resolved group.
Definition rlm_detail.c:51
static const call_env_method_t method_env
Definition rlm_detail.c:476
static fr_dict_t const * dict_freeradius
Definition rlm_detail.c:83
static fr_dict_attr_t const * attr_net
Definition rlm_detail.c:93
bool escape
do filename escaping, yes / no
Definition rlm_detail.c:58
static fr_dict_attr_t const * attr_net_src_address
Definition rlm_detail.c:94
static fr_dict_t const * dict_radius
Definition rlm_detail.c:84
static int detail_recurse(FILE *out, fr_hash_table_t *ht, fr_pair_list_t *list)
Definition rlm_detail.c:185
tmpl_t * filename_tmpl
tmpl used to expand filename (for debug output)
Definition rlm_detail.c:65
exfile_t * ef
Log file handler.
Definition rlm_detail.c:60
#define WRITE(fmt,...)
bool log_srcdst
Add IP src/dst attributes to entries.
Definition rlm_detail.c:56
static unlang_action_t mod_accounting(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition rlm_detail.c:367
fr_value_box_t header
Header format.
Definition rlm_detail.c:66
static unlang_action_t mod_authorize(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition rlm_detail.c:375
static int fr_pair_fprint(FILE *fp, fr_pair_t const *vp)
Print one attribute and value to FP.
Definition rlm_detail.c:123
static fr_dict_attr_t const * attr_net_dst_address
Definition rlm_detail.c:95
module_rlm_t rlm_detail
Definition rlm_detail.c:490
fr_dict_attr_autoload_t rlm_detail_dict_attr[]
Definition rlm_detail.c:100
static const conf_parser_t module_config[]
Definition rlm_detail.c:74
static uint32_t detail_hash(void const *data)
Definition rlm_detail.c:141
bool locking
Whether the file should be locked.
Definition rlm_detail.c:54
static fr_dict_attr_t const * attr_net_src_port
Definition rlm_detail.c:96
static int mod_instantiate(module_inst_ctx_t const *mctx)
Definition rlm_detail.c:155
fr_dict_autoload_t rlm_detail_dict[]
Definition rlm_detail.c:87
static int8_t detail_cmp(void const *a, void const *b)
Definition rlm_detail.c:147
fr_hash_table_t * ht
Holds suppressed attributes.
Definition rlm_detail.c:67
static unlang_action_t mod_post_auth(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
Definition rlm_detail.c:383
Instance configuration for rlm_detail.
Definition rlm_detail.c:49
static char const * name
static int instantiate(module_inst_ctx_t const *mctx)
Definition rlm_rest.c:1313
#define FR_SBUFF_IN(_start, _len_or_end)
#define FR_SBUFF_OUT(_start, _len_or_end)
#define fr_sbuff_in_char(_sbuff,...)
#define SECTION_NAME(_name1, _name2)
Define a section name consisting of a verb and a noun.
Definition section.h:40
CONF_SECTION * conf
Module's instance configuration.
Definition module.h:330
size_t inst_size
Size of the module's instance data.
Definition module.h:204
void * data
Module's instance data.
Definition module.h:272
#define MODULE_BINDING_TERMINATOR
Terminate a module binding list.
Definition module.h:151
Named methods exported by a module.
Definition module.h:173
tmpl_escape_t escape
How escaping should be handled during evaluation.
Definition tmpl.h:349
fr_value_box_safe_for_t literals_safe_for
safe_for value assigned to literal values in xlats, execs, and data.
Definition tmpl.h:347
ssize_t tmpl_afrom_substr(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff_t *in, fr_token_t quote, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules))
Convert an arbitrary string into a tmpl_t.
tmpl_attr_rules_t attr
Rules/data for parsing attribute references.
Definition tmpl.h:335
Optional arguments passed to vp_tmpl functions.
Definition tmpl.h:332
static char buff[sizeof("18446744073709551615")+3]
Definition size_tests.c:41
eap_aka_sim_process_conf_t * inst
fr_pair_t * vp
fr_dict_t const * dict_def
Default dictionary to use with unqualified attribute references.
Definition tmpl.h:273
Stores an attribute, a value and various bits of other data.
Definition pair.h:68
fr_dict_attr_t const *_CONST da
Dictionary attribute defines the attribute number, vendor and type of the pair.
Definition pair.h:69
char const * fr_syserror(int num)
Guaranteed to be thread-safe version of strerror.
Definition syserror.c:243
#define talloc_get_type_abort_const
Definition talloc.h:287
static int64_t fr_time_to_sec(fr_time_t when)
Convert an fr_time_t (internal time) to number of sec since the unix epoch (wallclock time)
Definition time.h:731
static fr_time_delta_t fr_time_delta_from_sec(int64_t sec)
Definition time.h:590
fr_value_box_escape_t box_escape
How to escape when returned from evaluation.
Definition tmpl_escape.h:81
@ TMPL_ESCAPE_PRE_CONCAT
Pre-concatenation escaping is useful for DSLs where elements of the expansion are static,...
Definition tmpl_escape.h:61
tmpl_escape_mode_t mode
Whether to apply escape function after concatenation, i.e.
Definition tmpl_escape.h:83
@ T_OP_EQ
Definition token.h:83
@ T_DOUBLE_QUOTED_STRING
Definition token.h:121
unsigned int code
Packet code (type).
Definition packet.h:61
bool fr_pair_list_empty(fr_pair_list_t const *list)
Is a valuepair list empty.
#define PAIR_VERIFY(_x)
Definition pair.h:191
static fr_slen_t quote ssize_t fr_pair_print(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const *vp))
Print one attribute and value to a string.
Definition pair_print.c:117
#define fr_pair_list_foreach(_list_head, _iter)
Iterate over the contents of a fr_pair_list_t.
Definition pair.h:261
static fr_slen_t parent
Definition pair.h:845
#define fr_type_is_structural(_x)
Definition types.h:388
#define fr_type_is_leaf(_x)
Definition types.h:389
fr_sbuff_parse_rules_t const * value_parse_rules_quoted[T_TOKEN_LAST]
Parse rules for quoted strings.
Definition value.c:605
static fr_slen_t data
Definition value.h:1288
fr_value_box_safe_for_t safe_for
Definition value.h:674
uintptr_t fr_value_box_safe_for_t
Escaping that's been applied to a value box.
Definition value.h:160
int nonnull(2, 5))
fr_value_box_escape_func_t func
Definition value.h:673
#define fr_box_uint32(_val)
Definition value.h:331
static size_t char ** out
Definition value.h:1020