Print this page
        
*** 52,61 ****
--- 52,75 ----
   * @brief  Functions to interact with the network sockets and NIC driver.
   *
   *
   */
  
+ #ifdef __sun
+ /*
+  * These are needed to enable control messages on sendmsg().
+  * I'll save the commentary on why the bend-over-backwards old way of doing
+  * sendmsg() is still around.
+  *
+  * STRICTLY SPEAKING this program should be linked against libxnet instead
+  * of libsocket because of these interfaces, but we'll cross that bridge
+  * when we get to it.
+  */
+ #define _XOPEN_SOURCE 500
+ #define __EXTENSIONS__
+ #endif
+ 
  #include "../ptpd.h"
  
  #ifdef PTPD_PCAP
  #ifdef HAVE_PCAP_PCAP_H
  #include <pcap/pcap.h>
*** 304,315 ****
  
      int ret;
      if(!strlen(ifaceName))
          return 0;
  
  /* BSD* - AF_LINK gives us access to the hw address via struct sockaddr_dl */
- #ifdef AF_LINK
  
      struct ifaddrs *ifaddr, *ifa;
  
      if(getifaddrs(&ifaddr) == -1) {
          PERROR("Could not get interface list");
--- 318,329 ----
  
      int ret;
      if(!strlen(ifaceName))
          return 0;
  
+ #if defined(AF_LINK) && !defined(__sun)
  /* BSD* - AF_LINK gives us access to the hw address via struct sockaddr_dl */
  
      struct ifaddrs *ifaddr, *ifa;
  
      if(getifaddrs(&ifaddr) == -1) {
          PERROR("Could not get interface list");
*** 345,356 ****
  end:
  
      freeifaddrs(ifaddr);
      return ret;
  
- /* Linux, basically */
  #else
  
      int sockfd;
      struct ifreq ifr;
  
      sockfd = socket(AF_INET, SOCK_DGRAM, 0);
--- 359,370 ----
  end:
  
      freeifaddrs(ifaddr);
      return ret;
  
  #else
+ /* Linux and Solarish systems have SIOCGIFHWADDR/SIOCGLIFHWADDR.  Use it. */
  
      int sockfd;
      struct ifreq ifr;
  
      sockfd = socket(AF_INET, SOCK_DGRAM, 0);
*** 358,368 ****
      if(sockfd < 0) {
          PERROR("Could not open test socket");
          return -1;
      }
  
!     memset(&ifr, 0, sizeof(struct ifreq));
  
      strncpy(ifr.ifr_name, ifaceName, IFACE_NAME_LENGTH);
  
      if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {
              DBGV("failed to request hardware address for %s", ifaceName);
--- 372,382 ----
      if(sockfd < 0) {
          PERROR("Could not open test socket");
          return -1;
      }
  
!     memset(&ifr, 0, sizeof (ifr));
  
      strncpy(ifr.ifr_name, ifaceName, IFACE_NAME_LENGTH);
  
      if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {
              DBGV("failed to request hardware address for %s", ifaceName);
*** 369,387 ****
--- 383,409 ----
              ret = -1;
              goto end;
      }
  
  
+ #ifdef __sun
+     int af = ifr.ifr_addr.sa_family;
+ #else
      int af = ifr.ifr_hwaddr.sa_family;
+ #endif
  
      if (    af == ARPHRD_ETHER
           || af == ARPHRD_IEEE802
  #ifdef ARPHRD_INFINIBAND
           || af == ARPHRD_INFINIBAND
  #endif
          ) {
+ #ifdef __sun
+             memcpy(hwAddr, ifr.ifr_addr.sa_data, hwAddrSize);
+ #else
              memcpy(hwAddr, ifr.ifr_hwaddr.sa_data, hwAddrSize);
+ #endif
              ret = 1;
          } else {
              DBGV("Unsupported hardware address family on %s\n", ifaceName);
              ret = 0;
          }
*** 572,582 ****
  }
  
  static Boolean
  netSetMulticastTTL(int sockfd, int ttl) {
  
! #ifdef __OpenBSD__
          uint8_t temp = (uint8_t) ttl;
  #else
          int temp = ttl;
  #endif
  
--- 594,604 ----
  }
  
  static Boolean
  netSetMulticastTTL(int sockfd, int ttl) {
  
! #if defined(__OpenBSD__) || defined(__sun)
          uint8_t temp = (uint8_t) ttl;
  #else
          int temp = ttl;
  #endif
  
*** 588,598 ****
          return TRUE;
  }
  
  static Boolean
  netSetMulticastLoopback(NetPath * netPath, Boolean value) {
! #ifdef __OpenBSD__
          uint8_t temp = value ? 1 : 0;
  #else
          int temp = value ? 1 : 0;
  #endif
          DBG("Going to set multicast loopback with %d \n", temp);
--- 610,620 ----
          return TRUE;
  }
  
  static Boolean
  netSetMulticastLoopback(NetPath * netPath, Boolean value) {
! #if defined(__OpenBSD__) || defined(__sun)
          uint8_t temp = value ? 1 : 0;
  #else
          int temp = value ? 1 : 0;
  #endif
          DBG("Going to set multicast loopback with %d \n", temp);
*** 746,756 ****
--- 768,782 ----
  hostLookup(const char* hostname, Integer32* addr)
  {
          if (hostname[0]) {
                  /* Attempt a DNS lookup first. */
                  struct hostent *host;
+ #ifdef __sun
+                 host = getipnodebyname(hostname, AF_INET, AI_DEFAULT, &errno);
+ #else
                  host = gethostbyname2(hostname, AF_INET);
+ #endif
                  if (host != NULL) {
                          if (host->h_length != 4) {
                                  PERROR("unicast host resolved to non ipv4"
                                         "address");
                                  return FALSE;