]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add fr_interface_to_ipaddr()
authorAlan T. DeKok <aland@freeradius.org>
Mon, 25 May 2020 21:03:19 +0000 (17:03 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 25 May 2020 21:38:58 +0000 (17:38 -0400)
which grabs an IP from an interface

src/lib/util/socket.c
src/lib/util/socket.h

index 4080864c62278e94defa8d2967fba68798d40f15..5b5bf9913c40c47a100a2110c412bb489b1fa00e 100644 (file)
@@ -1244,3 +1244,37 @@ char *fr_ipaddr_to_interface(TALLOC_CTX *ctx, fr_ipaddr_t *ipaddr)
        freeifaddrs(list);
        return interface;
 }
+
+int fr_interface_to_ipaddr(char const *interface, fr_ipaddr_t *ipaddr, int af, bool link_local)
+{
+       struct ifaddrs *list = NULL;
+       struct ifaddrs *i;
+       int rcode = -1;
+
+       if (getifaddrs(&list) < 0) return -1;
+
+       for (i = list; i != NULL; i = i->ifa_next) {
+               fr_ipaddr_t my_ipaddr;
+
+               if (!i->ifa_addr || !i->ifa_name || (af != i->ifa_addr->sa_family)) continue;
+               if (strcmp(i->ifa_name, interface) != 0) continue;
+
+               fr_ipaddr_from_sockaddr((struct sockaddr_storage *)i->ifa_addr, sizeof(struct sockaddr_in6), &my_ipaddr, NULL);
+
+               /*
+                *      If we ask for a link local address, then give
+                *      it to them.
+                */
+               if (link_local) {
+                       if (af != AF_INET6) continue;
+                       if (!IN6_IS_ADDR_LINKLOCAL(&my_ipaddr.addr.v6)) continue;
+               }
+
+               *ipaddr = my_ipaddr;
+               rcode = 0;
+               break;
+       }
+
+       freeifaddrs(list);
+       return rcode;
+}
index 701b6188137e52d35151d5e6ecb5b29330db89f5..4e7c989ed2c91a2786008df20cf56706a500026b 100644 (file)
@@ -54,6 +54,7 @@ int           fr_socket_server_tcp(fr_ipaddr_t const *ipaddr, uint16_t *port, char const
 int            fr_socket_bind(int sockfd, fr_ipaddr_t const *ipaddr, uint16_t *port, char const *interface);
 int            fr_cap_net_raw(void);
 char           *fr_ipaddr_to_interface(TALLOC_CTX *ctx, fr_ipaddr_t *ipaddr);
+int            fr_interface_to_ipaddr(char const *interface, fr_ipaddr_t *ipaddr, int af, bool link_local);
 
 #ifdef __cplusplus
 }