From: Alan T. DeKok Date: Sun, 26 Dec 2010 12:36:22 +0000 (+0100) Subject: Added %{listen:} to mirror %{client:} X-Git-Tag: release_2_1_11~171 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=476851c77f476c76631ee03b56a94cfab62a2e24;p=thirdparty%2Ffreeradius-server.git Added %{listen:} to mirror %{client:} --- diff --git a/src/include/radiusd.h b/src/include/radiusd.h index 47a38cd71f2..0c338e07b7f 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -325,6 +325,7 @@ struct rad_listen_t { rad_listen_decode_t decode; rad_listen_print_t print; + const CONF_SECTION *cs; void *data; #ifdef WITH_STATS diff --git a/src/main/listen.c b/src/main/listen.c index 1eb6151ba2f..071bd5b79ba 100644 --- a/src/main/listen.c +++ b/src/main/listen.c @@ -78,6 +78,35 @@ typedef struct listen_socket_t { static rad_listen_t *listen_alloc(RAD_LISTEN_TYPE type); +/* + * Xlat for %{listen:foo} + */ +static size_t xlat_listen(UNUSED void *instance, REQUEST *request, + char *fmt, char *out, + size_t outlen, + UNUSED RADIUS_ESCAPE_STRING func) +{ + const char *value = NULL; + CONF_PAIR *cp; + + if (!fmt || !out || (outlen < 1)) return 0; + + if (!request || !request->listener) { + *out = '\0'; + return 0; + } + + cp = cf_pair_find(request->listener->cs, fmt); + if (!cp || !(value = cf_pair_value(cp))) { + *out = '\0'; + return 0; + } + + strlcpy(out, value, outlen); + + return strlen(out); +} + /* * Find a per-socket client. */ @@ -476,6 +505,8 @@ static int common_socket_parse(CONF_SECTION *cs, rad_listen_t *this) char *section_name = NULL; CONF_SECTION *client_cs, *parentcs; + this->cs = cs; + /* * Try IPv4 first */ @@ -1523,6 +1554,8 @@ static int listen_bind(rad_listen_t *this) * Initialize udpfromto for all sockets. */ if (udpfromto_init(this->fd) != 0) { + radlog(L_ERR, "Failed initializing udpfromto: %s", + strerror(errno)); close(this->fd); return -1; } @@ -2241,6 +2274,8 @@ int listen_init(CONF_SECTION *config, rad_listen_t **head) } #endif + xlat_register("listen", xlat_listen, NULL); + return 0; }