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:38:23 +0000 (13:38 +0100)
src/include/radiusd.h
src/main/listen.c

index 92a363b..5b865a6 100644 (file)
@@ -334,6 +334,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 cde3d81..ee899f8 100644 (file)
@@ -82,6 +82,35 @@ typedef struct rad_listen_master_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.
  */
 RADCLIENT *client_listener_find(rad_listen_t *listener,
@@ -799,6 +828,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
         */
@@ -2066,6 +2097,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;
        }
@@ -2830,6 +2863,7 @@ add_sockets:
         */
        if (!*head) return -1;
 
+       xlat_register("listen", xlat_listen, NULL);
 
        return 0;
 }