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,
char *section_name = NULL;
CONF_SECTION *client_cs, *parentcs;
+ this->cs = cs;
+
/*
* Try IPv4 first
*/
* 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;
}
*/
if (!*head) return -1;
+ xlat_register("listen", xlat_listen, NULL);
return 0;
}