]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Added %{listen:} to mirror %{client:}
authorAlan T. DeKok <aland@freeradius.org>
Sun, 26 Dec 2010 12:36:22 +0000 (13:36 +0100)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 26 Dec 2010 12:36:22 +0000 (13:36 +0100)
src/include/radiusd.h
src/main/listen.c

index 47a38cd71f2bf6e253bee5751729eac1cfa6551a..0c338e07b7fe7d8f124c536206c6877ada8ee327 100644 (file)
@@ -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
index 1eb6151ba2f085d880245d586650034aa561fae2..071bd5b79bacbae38a496d5f5787be29c2318b11 100644 (file)
@@ -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;
 }