RCSIDH(radiusd_h, "$Id$")
#include <freeradius-devel/server/cf_file.h>
+#include <freeradius-devel/server/client.h>
+#include <freeradius-devel/server/dependency.h>
#include <freeradius-devel/server/log.h>
+#include <freeradius-devel/server/paircmp.h>
+#include <freeradius-devel/server/process.h>
#include <freeradius-devel/server/rcode.h>
+#include <freeradius-devel/server/realms.h>
#include <freeradius-devel/server/request.h>
#include <freeradius-devel/server/stats.h>
-#include <freeradius-devel/server/realms.h>
-#include <freeradius-devel/server/client.h>
-#include <freeradius-devel/server/process.h>
-#include <freeradius-devel/server/dependency.h>
-#include <freeradius-devel/server/paircmp.h>
+#include <freeradius-devel/server/trigger.h>
#include <freeradius-devel/server/util.h>
#include <freeradius-devel/util/base.h>
/*
* See util.c
*/
-#define SECONDS_PER_DAY 86400
-#define MAX_REQUEST_TIME 30
-#define CLEANUP_DELAY 5
-#define RETRY_DELAY 5
-#define RETRY_COUNT 3
-#define DEAD_TIME 120
#define EXEC_TIMEOUT 10
-typedef enum request_fail {
- REQUEST_FAIL_UNKNOWN = 0,
- REQUEST_FAIL_NO_THREADS, //!< No threads to handle it.
- REQUEST_FAIL_DECODE, //!< Rad_decode didn't like it.
- REQUEST_FAIL_PROXY, //!< Call to proxy modules failed.
- REQUEST_FAIL_PROXY_SEND, //!< Proxy_send didn't like it.
- REQUEST_FAIL_NO_RESPONSE, //!< We weren't told to respond, so we reject.
- REQUEST_FAIL_HOME_SERVER, //!< The home server didn't respond.
- REQUEST_FAIL_HOME_SERVER2, //!< Another case of the above.
- REQUEST_FAIL_HOME_SERVER3, //!< Another case of the above.
- REQUEST_FAIL_NORMAL_REJECT, //!< Authentication failure.
- REQUEST_FAIL_SERVER_TIMEOUT //!< The server took too long to process the request.
-} request_fail_t;
-
/*
* Global variables.
*
extern fr_log_lvl_t req_debug_lvl;
extern char const *radiusd_version;
extern char const *radiusd_version_short;
-void radius_signal_self(int flag);
-typedef enum {
- RADIUS_SIGNAL_SELF_NONE = (0),
- RADIUS_SIGNAL_SELF_HUP = (1 << 0),
- RADIUS_SIGNAL_SELF_TERM = (1 << 1),
- RADIUS_SIGNAL_SELF_EXIT = (1 << 2),
- RADIUS_SIGNAL_SELF_DETAIL = (1 << 3),
- RADIUS_SIGNAL_SELF_NEW_FD = (1 << 4),
- RADIUS_SIGNAL_SELF_MAX = (1 << 5)
-} radius_signal_t;
+
+
/*
* Function prototypes.
*/
/* radiusd.c */
int log_err (char *);
-/* util.c */
-void (*reset_signal(int signo, void (*func)(int)))(int);
-int rad_mkdir(char *directory, mode_t mode, uid_t uid, gid_t gid);
-size_t rad_filename_make_safe(UNUSED REQUEST *request, char *out, size_t outlen,
- char const *in, UNUSED void *arg);
-size_t rad_filename_escape(UNUSED REQUEST *request, char *out, size_t outlen,
- char const *in, UNUSED void *arg);
-ssize_t rad_filename_unescape(char *out, size_t outlen, char const *in, size_t inlen);
-char *rad_ajoin(TALLOC_CTX *ctx, char const **argv, int argc, char c);
-
-int rad_copy_string(char *dst, char const *src);
-int rad_copy_string_bare(char *dst, char const *src);
-int rad_copy_variable(char *dst, char const *from);
-uint32_t rad_pps(uint32_t *past, uint32_t *present, time_t *then, struct timeval *now);
-int rad_expand_xlat(REQUEST *request, char const *cmd,
- int max_argc, char const *argv[], bool can_fail,
- size_t argv_buflen, char *argv_buf);
-
-char const *rad_default_log_dir(void);
-char const *rad_default_lib_dir(void);
-char const *rad_default_raddb_dir(void);
-char const *rad_default_run_dir(void);
-char const *rad_default_sbin_dir(void);
-char const *rad_default_radacct_dir(void);
-
/* auth.c */
rlm_rcode_t rad_authenticate (REQUEST *);
rlm_rcode_t rad_postauth(REQUEST *);
int radius_exec_program(TALLOC_CTX *ctx, char *out, size_t outlen, VALUE_PAIR **output_pairs,
REQUEST *request, char const *cmd, VALUE_PAIR *input_pairs,
bool exec_wait, bool shell_escape, int timeout) CC_HINT(nonnull (5, 6));
-void trigger_exec_init(CONF_SECTION const *cs);
-int trigger_exec(REQUEST *request, CONF_SECTION const *cs, char const *name, bool quench, VALUE_PAIR *args)
- CC_HINT(nonnull (3));
-void trigger_exec_free(void);
-VALUE_PAIR *trigger_args_afrom_server(TALLOC_CTX *ctx, char const *server, uint16_t port);
/** Allocate a VALUE_PAIR in the request list
*
*/
#define pair_delete_control(_da) fr_pair_delete_by_da(&request->control, _da)
-/* threads.c */
-int thread_pool_bootstrap(CONF_SECTION *cs, bool *spawn_workers);
-int thread_pool_init(void);
-void thread_pool_stop(void);
-
-/*
- * In threads.c
- */
-void request_enqueue(REQUEST *request);
-void request_queue_extract(REQUEST *request);
-
-extern struct timeval sd_watchdog_interval;
-
-/* process.c */
-fr_event_list_t *fr_global_event_list(void);
-int radius_event_init(void);
-int radius_event_start(bool spawn_flag);
-void radius_event_free(void);
-int radius_event_process(void);
-void radius_update_listener(rad_listen_t *listener);
-void revive_home_server(fr_event_list_t *el, struct timeval *now, void *ctx);
-void mark_home_server_dead(home_server_t *home, struct timeval *when);
-
#ifdef __cplusplus
}
*/
RCSIDH(conf_file_h, "$Id$")
-#include <stddef.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <unistd.h>
-#include <sys/time.h>
-
-#include <freeradius-devel/util/rbtree.h>
-#include <freeradius-devel/util/token.h>
-
#ifdef __cplusplus
extern "C" {
#endif
typedef struct cf_data CONF_DATA; //!< #CONF_ITEM used to associate arbitrary data
///< with a #CONF_PAIR or #CONF_SECTION.
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include <freeradius-devel/util/rbtree.h>
+#include <freeradius-devel/util/token.h>
#define FR_TIMEVAL_TO_MS(_x) (((_x)->tv_usec / 1000) + ((_x)->tv_sec * (uint64_t)1000))
#define FR_TIMESPEC_TO_MS(_x) (((_x)->tv_usec / 1000000) + ((_x)->tv_sec * (uint64_t)1000))
extern "C" {
#endif
+typedef struct rad_client RADCLIENT;
+typedef struct rad_client_list RADCLIENT_LIST;
+
+/** Callback for retrieving values when building client sections
+ *
+ * Example:
+ @code{.c}
+ int _client_value_cb(char **out, CONF_PAIR const *cp, void *data)
+ {
+ my_result *result = data;
+ char *value;
+
+ value = get_attribute_from_result(result, cf_pair_value(cp));
+ if (!value) {
+ *out = NULL;
+ return 0;
+ }
+
+ *out = talloc_strdup(value);
+ free_attribute(value);
+
+ if (!*out) return -1;
+ return 0;
+ }
+ @endcode
+ *
+ * @param[out] out Where to write a pointer to the talloced value buffer.
+ * @param[in] cp The value of the CONF_PAIR specifies the attribute name to retrieve from the result.
+ * @param[in] data Pointer to the result struct to copy values from.
+ * @return
+ * - 0 on success.
+ * - -1 on failure.
+ */
+typedef int (*client_value_cb_t)(char **out, CONF_PAIR const *cp, void *data);
+
#include <freeradius-devel/io/time.h>
+#include <freeradius-devel/server/request.h>
#include <freeradius-devel/server/socket.h>
#include <freeradius-devel/server/stats.h>
#include <freeradius-devel/util/inet.h>
/** Describes a host allowed to send packets to the server
*
*/
-typedef struct rad_client {
+struct rad_client {
fr_ipaddr_t ipaddr; //!< IPv4/IPv6 address of the host.
fr_ipaddr_t src_ipaddr; //!< IPv4/IPv6 address to send responses
//!< from (family must match ipaddr).
FR_STRUCT_MEMBER_SIGNATURE(secret)
FR_STRUCT_SIGNATURE
-} RADCLIENT;
-
-typedef struct rad_client_list RADCLIENT_LIST;
-
-/** Callback for retrieving values when building client sections
- *
- * Example:
- @code{.c}
- int _client_value_cb(char **out, CONF_PAIR const *cp, void *data)
- {
- my_result *result = data;
- char *value;
-
- value = get_attribute_from_result(result, cf_pair_value(cp));
- if (!value) {
- *out = NULL;
- return 0;
- }
-
- *out = talloc_strdup(value);
- free_attribute(value);
-
- if (!*out) return -1;
- return 0;
- }
- @endcode
- *
- * @param[out] out Where to write a pointer to the talloced value buffer.
- * @param[in] cp The value of the CONF_PAIR specifies the attribute name to retrieve from the result.
- * @param[in] data Pointer to the result struct to copy values from.
- * @return
- * - 0 on success.
- * - -1 on failure.
- */
-typedef int (*client_value_cb_t)(char **out, CONF_PAIR const *cp, void *data);
+};
RADCLIENT_LIST *client_list_init(CONF_SECTION *cs);
extern "C" {
#endif
+#define MAX_REQUEST_TIME 30 //!< Default maximum request time
+
typedef struct main_config_s main_config_t;
-#ifdef __cplusplus
-}
-#endif
+extern main_config_t const *main_config; //!< Global configuration singleton.
#include <freeradius-devel/server/cf_util.h>
#include <freeradius-devel/server/tmpl.h>
#include <freeradius-devel/util/dict.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
/** Main server configuration
*
* The parsed version of the main server config.
//!< Only applicable in single threaded mode.
};
-/* Define a global config structure */
-extern main_config_t const *main_config;
-
void main_config_name_set_default(main_config_t *config, char const *name, bool overwrite_config);
void main_config_raddb_dir_set(main_config_t *config, char const *path);
void main_config_dict_dir_set(main_config_t *config, char const *path);
*/
RCSIDH(process_h, "$Id$")
-#include <freeradius-devel/server/client.h>
-#include <freeradius-devel/server/listen.h>
-#include <freeradius-devel/server/signal.h>
-
#ifdef __cplusplus
extern "C" {
#endif
-/*
- * Function handler for requests.
- */
-typedef void (*fr_request_process_t)(REQUEST *, fr_state_signal_t);
+typedef enum {
+ RADIUS_SIGNAL_SELF_NONE = (0),
+ RADIUS_SIGNAL_SELF_HUP = (1 << 0),
+ RADIUS_SIGNAL_SELF_TERM = (1 << 1),
+ RADIUS_SIGNAL_SELF_EXIT = (1 << 2),
+ RADIUS_SIGNAL_SELF_DETAIL = (1 << 3),
+ RADIUS_SIGNAL_SELF_NEW_FD = (1 << 4),
+ RADIUS_SIGNAL_SELF_MAX = (1 << 5)
+} radius_signal_t;
extern time_t fr_start_time;
-/*
- * More state machine helper functions.
- */
-void request_delete(REQUEST *request);
+extern struct timeval sd_watchdog_interval;
+
+#include <freeradius-devel/server/client.h>
+#include <freeradius-devel/server/listen.h>
+#include <freeradius-devel/server/signal.h>
+
+typedef void (*fr_request_process_t)(REQUEST *, fr_state_signal_t); //!< Function handler for requests.
+
+fr_event_list_t *fr_global_event_list(void);
+
+void radius_signal_self(int flag);
+
+int radius_event_init(void);
+
+int radius_event_start(bool spawn_flag);
+
+void radius_event_free(void);
+
+int radius_event_process(void);
+
+void radius_update_listener(rad_listen_t *listener);
#ifdef __cplusplus
}
extern "C" {
#endif
-
-
#ifdef NDEBUG
# define rad_assert(_expr)
#elif !defined(__clang_analyzer__)
}
#ifdef WITH_VERIFY_PTR
+/*
+ * Verify a packet.
+ */
+static void packet_verify(char const *file, int line, REQUEST const *request, RADIUS_PACKET const *packet, char const *type)
+{
+ TALLOC_CTX *parent;
+
+ if (!packet) {
+ fprintf(stderr, "CONSISTENCY CHECK FAILED %s[%i]: RADIUS_PACKET %s pointer was NULL", file, line, type);
+ if (!fr_cond_assert(0)) fr_exit_now(1);
+ }
+
+ parent = talloc_parent(packet);
+ if (parent != request) {
+ ERROR("CONSISTENCY CHECK FAILED %s[%i]: Expected RADIUS_PACKET %s to be parented by %p (%s), "
+ "but parented by %p (%s)", file, line, type, request, talloc_get_name(request),
+ parent, parent ? talloc_get_name(parent) : "NULL");
+
+ fr_log_talloc_report(packet);
+ if (parent) fr_log_talloc_report(parent);
+
+ rad_assert(0);
+ }
+
+ PACKET_VERIFY(packet);
+
+ if (!packet->vps) return;
+
+ fr_pair_list_verify(file, line, packet, packet->vps);
+}
+
+/*
+ * Catch horrible talloc errors.
+ */
+void request_verify(char const *file, int line, REQUEST const *request)
+{
+ if (!request) {
+ fprintf(stderr, "CONSISTENCY CHECK FAILED %s[%i]: REQUEST pointer was NULL", file, line);
+ if (!fr_cond_assert(0)) fr_exit_now(1);
+ }
+
+ (void) talloc_get_type_abort_const(request, REQUEST);
+
+ rad_assert(request->magic == REQUEST_MAGIC);
+
+ if (talloc_get_size(request) != sizeof(REQUEST)) {
+ fprintf(stderr, "CONSISTENCY CHECK FAILED %s[%i]: expected REQUEST size of %zu bytes, got %zu bytes",
+ file, line, sizeof(REQUEST), talloc_get_size(request));
+ if (!fr_cond_assert(0)) fr_exit_now(1);
+ }
+
+ fr_pair_list_verify(file, line, request, request->control);
+ fr_pair_list_verify(file, line, request->state_ctx, request->state);
+
+ if (request->username) VP_VERIFY(request->username);
+ if (request->password) VP_VERIFY(request->password);
+
+ rad_assert(request->server_cs != NULL);
+
+ if (request->packet) {
+ packet_verify(file, line, request, request->packet, "request");
+ if ((request->packet->code == FR_CODE_ACCESS_REQUEST) &&
+ (request->reply && !request->reply->code)) {
+ rad_assert(request->state_ctx != NULL);
+ }
+ }
+ if (request->reply) packet_verify(file, line, request, request->reply, "reply");
+
+ if (request->async) {
+ (void) talloc_get_type_abort(request->async, fr_async_t);
+ rad_assert(talloc_parent(request->async) == request);
+ }
+
+}
+
/** Verify all request data is parented by the specified context
*
* @note Only available if built with WITH_VERIFY_PTR
#endif
}
+/** Sort latency times into bins
+ *
+ * This solves the problem of attempting to keep min/max/avg latencies, whilst
+ * not knowing what the polling frequency will be.
+ *
+ * @param[out] stats Holding monotonically increasing stats bins.
+ * @param[in] start of the request.
+ * @param[in] end of the request.
+ */
+void fr_stats_bins(fr_stats_t *stats, struct timeval *start, struct timeval *end)
+{
+ struct timeval diff;
+ uint32_t delay;
+
+ if ((start->tv_sec == 0) || (end->tv_sec == 0) || (end->tv_sec < start->tv_sec)) return;
+
+ fr_timeval_subtract(&diff, end, start);
+
+ if (diff.tv_sec >= 10) {
+ stats->elapsed[7]++;
+ } else {
+ int i;
+ uint32_t cmp;
+
+ delay = (diff.tv_sec * USEC) + diff.tv_usec;
+
+ cmp = 10;
+ for (i = 0; i < 7; i++) {
+ if (delay < cmp) {
+ stats->elapsed[i]++;
+ break;
+ }
+ cmp *= 10;
+ }
+ }
+}
+
#endif /* WITH_STATS */
--- /dev/null
+#pragma once
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * $Id$
+ *
+ * @file lib/server/trigger.h
+ * @brief Execute scripts when a server event occurs.
+ *
+ * @copyright 2015 The FreeRADIUS server project
+ */
+RCSIDH(trigger_h, "$Id$")
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <freeradius-devel/server/cf_util.h>
+#include <freeradius-devel/server/request.h>
+#include <freeradius-devel/util/pair.h>
+
+#include <talloc.h>
+
+void trigger_exec_init(CONF_SECTION const *cs);
+
+int trigger_exec(REQUEST *request, CONF_SECTION const *cs,
+ char const *name, bool quench, VALUE_PAIR *args)
+ CC_HINT(nonnull (3));
+
+void trigger_exec_free(void);
+
+VALUE_PAIR *trigger_args_afrom_server(TALLOC_CTX *ctx, char const *server, uint16_t port);
+
+#ifdef __cplusplus
+}
+#endif
return RADIR;
}
-#ifdef WITH_VERIFY_PTR
-/*
- * Verify a packet.
- */
-static void packet_verify(char const *file, int line, REQUEST const *request, RADIUS_PACKET const *packet, char const *type)
-{
- TALLOC_CTX *parent;
-
- if (!packet) {
- fprintf(stderr, "CONSISTENCY CHECK FAILED %s[%i]: RADIUS_PACKET %s pointer was NULL", file, line, type);
- if (!fr_cond_assert(0)) fr_exit_now(1);
- }
-
- parent = talloc_parent(packet);
- if (parent != request) {
- ERROR("CONSISTENCY CHECK FAILED %s[%i]: Expected RADIUS_PACKET %s to be parented by %p (%s), "
- "but parented by %p (%s)", file, line, type, request, talloc_get_name(request),
- parent, parent ? talloc_get_name(parent) : "NULL");
-
- fr_log_talloc_report(packet);
- if (parent) fr_log_talloc_report(parent);
-
- rad_assert(0);
- }
-
- PACKET_VERIFY(packet);
-
- if (!packet->vps) return;
-
-#ifdef WITH_VERIFY_PTR
- fr_pair_list_verify(file, line, packet, packet->vps);
-#endif
-}
-/*
- * Catch horrible talloc errors.
- */
-void request_verify(char const *file, int line, REQUEST const *request)
-{
- if (!request) {
- fprintf(stderr, "CONSISTENCY CHECK FAILED %s[%i]: REQUEST pointer was NULL", file, line);
- if (!fr_cond_assert(0)) fr_exit_now(1);
- }
-
- (void) talloc_get_type_abort_const(request, REQUEST);
-
- rad_assert(request->magic == REQUEST_MAGIC);
-
- if (talloc_get_size(request) != sizeof(REQUEST)) {
- fprintf(stderr, "CONSISTENCY CHECK FAILED %s[%i]: expected REQUEST size of %zu bytes, got %zu bytes",
- file, line, sizeof(REQUEST), talloc_get_size(request));
- if (!fr_cond_assert(0)) fr_exit_now(1);
- }
-
-#ifdef WITH_VERIFY_PTR
- fr_pair_list_verify(file, line, request, request->control);
- fr_pair_list_verify(file, line, request->state_ctx, request->state);
-
- if (request->username) VP_VERIFY(request->username);
- if (request->password) VP_VERIFY(request->password);
-#endif
-
- rad_assert(request->server_cs != NULL);
-
- if (request->packet) {
- packet_verify(file, line, request, request->packet, "request");
- if ((request->packet->code == FR_CODE_ACCESS_REQUEST) &&
- (request->reply && !request->reply->code)) {
- rad_assert(request->state_ctx != NULL);
- }
- }
- if (request->reply) packet_verify(file, line, request, request->reply, "reply");
-#ifdef WITH_PROXY
- if (request->proxy) {
- (void) talloc_get_type_abort(request->proxy, REQUEST);
-
- rad_assert(request == talloc_parent(request->proxy));
-
- if (request->proxy->packet) packet_verify(file, line, request->proxy, request->proxy->packet, "proxy-request");
- if (request->proxy->reply) packet_verify(file, line, request->proxy, request->proxy->reply, "proxy-reply");
- }
-#endif
-
- if (request->async) {
- (void) talloc_get_type_abort(request->async, fr_async_t);
- rad_assert(talloc_parent(request->async) == request);
- }
-
-}
-#endif
-
/** Convert mode_t into humanly readable permissions flags
*
* @author Jonathan Leffler.
}
return 0;
}
-
-/** Sort latency times into bins
- *
- * This solves the problem of attempting to keep min/max/avg latencies, whilst
- * not knowing what the polling frequency will be.
- *
- * @param[out] stats Holding monotonically increasing stats bins.
- * @param[in] start of the request.
- * @param[in] end of the request.
- */
-void fr_stats_bins(fr_stats_t *stats, struct timeval *start, struct timeval *end)
-{
- struct timeval diff;
- uint32_t delay;
-
- if ((start->tv_sec == 0) || (end->tv_sec == 0) || (end->tv_sec < start->tv_sec)) return;
-
- fr_timeval_subtract(&diff, end, start);
-
- if (diff.tv_sec >= 10) {
- stats->elapsed[7]++;
- } else {
- int i;
- uint32_t cmp;
-
- delay = (diff.tv_sec * USEC) + diff.tv_usec;
-
- cmp = 10;
- for (i = 0; i < 7; i++) {
- if (delay < cmp) {
- stats->elapsed[i]++;
- break;
- }
- cmp *= 10;
- }
- }
-}
#include <grp.h>
#include <talloc.h>
+void (*reset_signal(int signo, void (*func)(int)))(int);
+int rad_mkdir(char *directory, mode_t mode, uid_t uid, gid_t gid);
+size_t rad_filename_make_safe(UNUSED REQUEST *request, char *out, size_t outlen,
+ char const *in, UNUSED void *arg);
+size_t rad_filename_escape(UNUSED REQUEST *request, char *out, size_t outlen,
+ char const *in, UNUSED void *arg);
+ssize_t rad_filename_unescape(char *out, size_t outlen, char const *in, size_t inlen);
+char *rad_ajoin(TALLOC_CTX *ctx, char const **argv, int argc, char c);
+
+int rad_copy_string(char *dst, char const *src);
+int rad_copy_string_bare(char *dst, char const *src);
+int rad_copy_variable(char *dst, char const *from);
+uint32_t rad_pps(uint32_t *past, uint32_t *present, time_t *then, struct timeval *now);
+int rad_expand_xlat(REQUEST *request, char const *cmd,
+ int max_argc, char const *argv[], bool can_fail,
+ size_t argv_buflen, char *argv_buf);
+
+char const *rad_default_log_dir(void);
+char const *rad_default_lib_dir(void);
+char const *rad_default_raddb_dir(void);
+char const *rad_default_run_dir(void);
+char const *rad_default_sbin_dir(void);
+char const *rad_default_radacct_dir(void);
+
void rad_mode_to_str(char out[10], mode_t mode);
void rad_mode_to_oct(char out[5], mode_t mode);
int rad_getpwuid(TALLOC_CTX *ctx, struct passwd **out, uid_t uid);
int rad_segid(gid_t gid);
void rad_suid_set_down_uid(uid_t uid);
-void rad_suid_down(void);
void rad_suid_up(void);
+void rad_suid_down(void);
void rad_suid_down_permanent(void);
bool rad_suid_is_down_permanent(void);
break;
}
rad_assert(request->log.unlang_indent == 0);
- request_delete(request);
+ //request_delete(request);
break;
}
}
case FR_SIGNAL_CANCEL:
(void) fr_heap_extract(request->backlog, request);
- request_delete(request);
+ //request_delete(request);
break;
default:
done:
default:
(void) fr_heap_extract(request->backlog, request);
- request_delete(request);
+ //request_delete(request);
break;
}
}
case FR_SIGNAL_CANCEL:
(void) fr_heap_extract(request->backlog, request);
- request_delete(request);
+ //request_delete(request);
break;
default: