Add os_gethostbyname and tidy socket address to and from text form functions
Signed-off-by: Jeroen Koekkoek <jeroen@koekkoek.nl>
This commit is contained in:
		
							parent
							
								
									5835a85dc2
								
							
						
					
					
						commit
						3c0b86df9c
					
				
					 16 changed files with 680 additions and 184 deletions
				
			
		| 
						 | 
				
			
			@ -74,15 +74,39 @@ enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory
 | 
			
		|||
 | 
			
		||||
enum ddsi_locator_from_string_result ddsi_ipaddr_from_string (ddsi_tran_factory_t tran, nn_locator_t *loc, const char *str, int32_t kind)
 | 
			
		||||
{
 | 
			
		||||
  int af = AF_INET;
 | 
			
		||||
  os_sockaddr_storage tmpaddr;
 | 
			
		||||
  int ipv4 = (kind == NN_LOCATOR_KIND_UDPv4 || kind == NN_LOCATOR_KIND_TCPv4);
 | 
			
		||||
  assert (kind == NN_LOCATOR_KIND_UDPv4 || kind == NN_LOCATOR_KIND_TCPv4 ||
 | 
			
		||||
          kind == NN_LOCATOR_KIND_TCPv6 || kind == NN_LOCATOR_KIND_UDPv6);
 | 
			
		||||
 | 
			
		||||
  switch (kind) {
 | 
			
		||||
    case NN_LOCATOR_KIND_UDPv4:
 | 
			
		||||
    case NN_LOCATOR_KIND_TCPv4:
 | 
			
		||||
      break;
 | 
			
		||||
#if OS_SOCKET_HAS_IPV6
 | 
			
		||||
    case NN_LOCATOR_KIND_UDPv6:
 | 
			
		||||
    case NN_LOCATOR_KIND_TCPv6:
 | 
			
		||||
      af = AF_INET6;
 | 
			
		||||
      break;
 | 
			
		||||
#endif /* OS_SOCKET_HAS_IPV6 */
 | 
			
		||||
    default:
 | 
			
		||||
      return AFSR_MISMATCH;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  (void)tran;
 | 
			
		||||
  if (!os_sockaddrStringToAddress (str, (os_sockaddr *) &tmpaddr, ipv4))
 | 
			
		||||
    return AFSR_INVALID;
 | 
			
		||||
  if ((ipv4 && tmpaddr.ss_family != AF_INET) || (!ipv4 && tmpaddr.ss_family != AF_INET6))
 | 
			
		||||
  if (os_sockaddrfromstr(af, str, (os_sockaddr *) &tmpaddr) != 0) {
 | 
			
		||||
#if OS_SOCKET_HAS_DNS
 | 
			
		||||
      /* Not a valid IP address. User may have specified a hostname instead. */
 | 
			
		||||
      os_hostent_t *hent = NULL;
 | 
			
		||||
      if (os_gethostbyname(str, af, &hent) != 0) {
 | 
			
		||||
          return AFSR_UNKNOWN;
 | 
			
		||||
      }
 | 
			
		||||
      memcpy(&tmpaddr, &hent->addrs[0], sizeof(hent->addrs[0]));
 | 
			
		||||
#else
 | 
			
		||||
      return AFSR_INVALID;
 | 
			
		||||
#endif /* OS_SOCKET_HAS_DNS */
 | 
			
		||||
  }
 | 
			
		||||
  if (tmpaddr.ss_family != af) {
 | 
			
		||||
    return AFSR_MISMATCH;
 | 
			
		||||
  }
 | 
			
		||||
  ddsi_ipaddr_to_loc (loc, (os_sockaddr *)&tmpaddr, kind);
 | 
			
		||||
  /* This is just an address, so there is no valid value for port, other than INVALID.
 | 
			
		||||
     Without a guarantee that tmpaddr has port 0, best is to set it explicitly here */
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +124,7 @@ char *ddsi_ipaddr_to_string (ddsi_tran_factory_t tran, char *dst, size_t sizeof_
 | 
			
		|||
  switch (src.ss_family)
 | 
			
		||||
  {
 | 
			
		||||
    case AF_INET:
 | 
			
		||||
      os_sockaddrAddressToString ((const os_sockaddr *) &src, dst, sizeof_dst);
 | 
			
		||||
      os_sockaddrtostr ((const os_sockaddr *) &src, dst, sizeof_dst);
 | 
			
		||||
      if (with_port) {
 | 
			
		||||
        pos = strlen (dst);
 | 
			
		||||
        assert(pos <= sizeof_dst);
 | 
			
		||||
| 
						 | 
				
			
			@ -110,7 +134,7 @@ char *ddsi_ipaddr_to_string (ddsi_tran_factory_t tran, char *dst, size_t sizeof_
 | 
			
		|||
#if OS_SOCKET_HAS_IPV6
 | 
			
		||||
    case AF_INET6:
 | 
			
		||||
      dst[0] = '[';
 | 
			
		||||
      os_sockaddrAddressToString ((const os_sockaddr *) &src, dst + 1, sizeof_dst);
 | 
			
		||||
      os_sockaddrtostr ((const os_sockaddr *) &src, dst + 1, sizeof_dst);
 | 
			
		||||
      pos = strlen (dst);
 | 
			
		||||
      if (with_port) {
 | 
			
		||||
        assert(pos <= sizeof_dst);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -484,7 +484,7 @@ static char *ddsi_udp_locator_to_string (ddsi_tran_factory_t tran, char *dst, si
 | 
			
		|||
    memset (&src, 0, sizeof (src));
 | 
			
		||||
    src.sin_family = AF_INET;
 | 
			
		||||
    memcpy (&src.sin_addr.s_addr, &mcgen.ipv4, 4);
 | 
			
		||||
    os_sockaddrAddressToString ((const os_sockaddr *) &src, dst, sizeof_dst);
 | 
			
		||||
    os_sockaddrtostr ((const os_sockaddr *) &src, dst, sizeof_dst);
 | 
			
		||||
    pos = strlen (dst);
 | 
			
		||||
    assert (pos <= sizeof_dst);
 | 
			
		||||
    cnt = snprintf (dst + pos, sizeof_dst - pos, ";%u;%u;%u", mcgen.base, mcgen.count, mcgen.idx);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue