Ticket #84: 0001-fix-multihome-for-IPv6-do-check-for-setsockopt-failu.patch

File 0001-fix-multihome-for-IPv6-do-check-for-setsockopt-failu.patch, 2.8 KB (added by jjo, 6 years ago)
  • socket.c

    From d1f9b781499998e6003266e6a8cb44be78664ffb Mon Sep 17 00:00:00 2001
    From: JuanJo Ciarlante <jjo@google.com>
    Date: Sat, 5 Feb 2011 23:52:57 +0100
    Subject: * fix --multihome for IPv6, do check for setsockopt() failures, append %<iface> in INFO msg
    
    ---
     socket.c |   27 +++++++++++++++++----------
     1 files changed, 17 insertions(+), 10 deletions(-)
    
    diff --git a/socket.c b/socket.c
    index 810bb23..08cab0e 100644
    a b create_socket_udp (const unsigned int flags) 
    813813  else if (flags & SF_USE_IP_PKTINFO)
    814814    {
    815815      int pad = 1;
    816       setsockopt (sd, SOL_IP, IP_PKTINFO, (void*)&pad, sizeof(pad));
     816      if (setsockopt (sd, SOL_IP, IP_PKTINFO,
     817                      (void*)&pad, sizeof(pad)) < 0)
     818        msg(M_SOCKERR, "UDP: failed setsockopt for IP_PKTINFO");
    817819    }
    818820#endif
    819821  return sd;
    create_socket_udp6 (const unsigned int flags) 
    831833  else if (flags & SF_USE_IP_PKTINFO)
    832834    {
    833835      int pad = 1;
    834       setsockopt (sd, IPPROTO_IPV6, IPV6_PKTINFO, (void*)&pad, sizeof(pad));
     836      if (setsockopt (sd, IPPROTO_IPV6, IPV6_RECVPKTINFO,
     837                      (void*)&pad, sizeof(pad)) < 0)
     838        msg(M_SOCKERR, "UDP: failed setsockopt for IPV6_RECVPKTINFO");
    835839    }
    836840#endif
    837841  return sd;
    print_link_socket_actual_ex (const struct link_socket_actual *act, 
    24232427{
    24242428  if (act)
    24252429    {
     2430      char ifname[IF_NAMESIZE] = "[undef]";
    24262431      struct buffer out = alloc_buf_gc (128, gc);
    24272432      buf_printf (&out, "%s", print_sockaddr_ex (&act->dest, separator, flags, gc));
    24282433#if ENABLE_IP_PKTINFO
    print_link_socket_actual_ex (const struct link_socket_actual *act, 
    24382443                  CLEAR (sa);
    24392444                  sa.addr.in4.sin_family = AF_INET;
    24402445                  sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst;
    2441                   buf_printf (&out, " (via %s)", print_sockaddr_ex (&sa, separator, 0, gc));
     2446                  if_indextoname(act->pi.in4.ipi_ifindex, ifname);
     2447                  buf_printf (&out, " (via %s%%%s)",
     2448                              print_sockaddr_ex (&sa, separator, 0, gc),
     2449                              ifname);
    24422450                }
    24432451#ifdef USE_PF_INET6
    24442452              break;
    print_link_socket_actual_ex (const struct link_socket_actual *act, 
    24492457                  CLEAR(sin6);
    24502458                  sin6.sin6_family = AF_INET6;
    24512459                  sin6.sin6_addr = act->pi.in6.ipi6_addr;
    2452                     {
    2453                       if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6),
    2454                                       buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0)
    2455                         buf_printf (&out, " (via %s)", buf);
    2456                       else
    2457                         buf_printf (&out, " (via [getnameinfo() err])");
    2458                     }
     2460                  if_indextoname(act->pi.in6.ipi6_ifindex, ifname);
     2461                  if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6),
     2462                                  buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0)
     2463                    buf_printf (&out, " (via %s%%%s)", buf, ifname);
     2464                  else
     2465                    buf_printf (&out, " (via [getnameinfo() err]%%%s)", ifname);
    24592466                }
    24602467              break;
    24612468            }