diff --git a/modules/services_discovery/bonjour.m b/modules/services_discovery/bonjour.m index f7db4d2f01c0b0f29e5b26e80e989a75448fd1c8..60ee1b5f8b2c866fb15a1feb35726673dc8444a2 100644 --- a/modules/services_discovery/bonjour.m +++ b/modules/services_discovery/bonjour.m @@ -32,6 +32,7 @@ #include <vlc_renderer_discovery.h> #import <Foundation/Foundation.h> +#import <arpa/inet.h> #pragma mark Function declarations @@ -120,6 +121,43 @@ NSString *const VLCBonjourRendererDemux = @"VLCBonjourRendererDemux"; @end +static NSString * ipAddressAsStringForData(NSData * data) +{ + char addressBuffer[INET6_ADDRSTRLEN] = { 0 }; + NSString *returnValue = nil; + + if (data == nil) { + return returnValue; + } + + typedef union { + struct sockaddr sa; + struct sockaddr_in ipv4; + struct sockaddr_in6 ipv6; + } ip_socket_address; + + ip_socket_address *socketAddress = (ip_socket_address *)[data bytes]; + + if (socketAddress) { + const char *addressStr; + if (socketAddress->sa.sa_family == AF_INET) { + addressStr = inet_ntop(socketAddress->sa.sa_family, + (void *)&(socketAddress->ipv4.sin_addr), + addressBuffer, + sizeof(addressBuffer)); + } else if (socketAddress->sa.sa_family == AF_INET6) { + addressStr = inet_ntop(socketAddress->sa.sa_family, + (void *)&(socketAddress->ipv6.sin6_addr), + addressBuffer, + sizeof(addressBuffer)); + } + if (addressStr != NULL) { + returnValue = [NSString stringWithUTF8String:addressStr]; + } + } + return returnValue; +} + @implementation VLCNetServiceDiscoveryController - (instancetype)initWithRendererDiscoveryObject:(vlc_renderer_discovery_t *)p_rd @@ -374,8 +412,13 @@ NSString *const VLCBonjourRendererDemux = @"VLCBonjourRendererDemux"; - (void)addResolvedInputItem:(NSNetService *)netService withProtocol:(NSString *)protocol { services_discovery_t *p_sd = (services_discovery_t *)_p_this; + NSString *host = netService.hostName; + + if ([protocol isEqualToString:@"smb"]) { + host = ipAddressAsStringForData(netService.addresses.firstObject); + } + NSString *uri = [NSString stringWithFormat:@"%@://%@:%ld", protocol, host, netService.port]; - NSString *uri = [NSString stringWithFormat:@"%@://%@:%ld", protocol, netService.hostName, netService.port]; input_item_t *p_input_item = input_item_NewDirectory([uri UTF8String], [netService.name UTF8String], ITEM_NET ); if (p_input_item != NULL) { services_discovery_AddItem(p_sd, p_input_item);