@@ -2671,14 +2671,11 @@ main(int argc, char **argv)
2671
2671
2672
2672
#ifdef HAVE_SYSTEMD
2673
2673
nb_fds = sd_listen_fds (0 );
2674
- if (nb_fds > 1 ) {
2674
+ if (nb_fds < 0 ) {
2675
+ warnx ("Failed to receive file descriptors from systemd: %s" , strerror (- nb_fds ));
2675
2676
retval = 1 ;
2676
- warnx ("Too many file descriptors received!\n" );
2677
2677
goto cleanup ;
2678
- } else if (nb_fds == 1 ) {
2679
- /* XXX: assume we get IPv4 socket */
2680
- dns_fds .v4fd = SD_LISTEN_FDS_START ;
2681
- } else {
2678
+ } else if (nb_fds == 0 ) {
2682
2679
#endif
2683
2680
if ((addrfamily == AF_UNSPEC || addrfamily == AF_INET ) &&
2684
2681
(dns_fds .v4fd = open_dns (& dns4addr , dns4addr_len )) < 0 ) {
@@ -2694,6 +2691,25 @@ main(int argc, char **argv)
2694
2691
goto cleanup ;
2695
2692
}
2696
2693
#ifdef HAVE_SYSTEMD
2694
+ } else if (nb_fds <= 2 ) {
2695
+ /* systemd may pass up to two sockets, for ip4 and ip6, try to figure out
2696
+ which is which */
2697
+ for (int i = 0 ; i < nb_fds ; i ++ ) {
2698
+ int fd = SD_LISTEN_FDS_START + i ;
2699
+ if (sd_is_socket (fd , AF_INET , SOCK_DGRAM , -1 )) {
2700
+ dns_fds .v4fd = fd ;
2701
+ } else if (sd_is_socket (fd , AF_INET6 , SOCK_DGRAM , -1 )) {
2702
+ dns_fds .v6fd = fd ;
2703
+ } else {
2704
+ retval = 1 ;
2705
+ warnx ("Unknown socket %d passed to iodined!\n" , fd );
2706
+ goto cleanup ;
2707
+ }
2708
+ }
2709
+ } else {
2710
+ retval = 1 ;
2711
+ warnx ("Too many file descriptors received!\n" );
2712
+ goto cleanup ;
2697
2713
}
2698
2714
#endif
2699
2715
0 commit comments