From 5775166f1bc6021fed15ab8fef7e0f7a014292a5 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Thu, 19 Apr 2018 14:37:44 +0200 Subject: [PATCH] smb2: add libdsm netbios resolver Because libsmb2 doesn't have any netbios name resolver. Maybe, every VLC services discoveries should use the IP instead of the netbios name for SMB shares. --- configure.ac | 9 ++++++++- modules/access/Makefile.am | 4 ++++ modules/access/smb2.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index b5b052f030..41f08aff8c 100644 --- a/configure.ac +++ b/configure.ac @@ -1841,7 +1841,14 @@ PKG_ENABLE_MODULES_VLC([SMBCLIENT], [smbc], [smbclient], (SMB/CIFS support), [au dnl dnl liBDSM access module dnl -PKG_ENABLE_MODULES_VLC([DSM], [dsm], [libdsm >= 0.2.0], [libdsm SMB/CIFS access/sd module], [auto]) +AM_CONDITIONAL(HAVE_DSM, [test "$AS_TR_SH(with_dsm)" = "yes"]) +PKG_WITH_MODULES([DSM], [libdsm >= 0.2.0], [ + VLC_ADD_PLUGIN([dsm]) + VLC_ADD_CFLAGS([dsm], [$DSM_CFLAGS]) + VLC_ADD_LIBS([dsm], [$DSM_LIBS]) + have_dsm="yes" + ],,[libdsm SMB/CIFS access/sd module], [auto]) +AM_CONDITIONAL([HAVE_DSM], [test "${have_dsm}" = "yes"]) dnl dnl sftp access support diff --git a/modules/access/Makefile.am b/modules/access/Makefile.am index 9cd9b01197..ae39f59a4d 100644 --- a/modules/access/Makefile.am +++ b/modules/access/Makefile.am @@ -357,6 +357,10 @@ libsmb2_plugin_la_SOURCES = access/smb2.c libsmb2_plugin_la_CFLAGS = $(AM_CFLAGS) $(SMB2_CFLAGS) libsmb2_plugin_la_LIBADD = $(SMB2_LIBS) $(SOCKET_LIBS) libsmb2_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(accessdir)' +if HAVE_DSM +libsmb2_plugin_la_CFLAGS += $(DSM_CFLAGS) -DHAVE_DSM +libsmb2_plugin_la_LIBADD += $(DSM_LIBS) +endif access_LTLIBRARIES += $(LTLIBsmb2) EXTRA_LTLIBRARIES += libsmb2_plugin.la diff --git a/modules/access/smb2.c b/modules/access/smb2.c index 3db718bc33..9bd5a1fea8 100644 --- a/modules/access/smb2.c +++ b/modules/access/smb2.c @@ -47,6 +47,15 @@ #include #include +#ifdef HAVE_DSM +# include +# include + +# ifdef HAVE_ARPA_INET_H +# include +# endif +#endif + #include "smb_common.h" #define CIFS_PORT 445 @@ -527,12 +536,46 @@ error: static int vlc_smb2_resolve(stream_t *access, char **host, unsigned port) { + (void) access; if (!*host) return -1; - (void) access; +#ifdef HAVE_DSM + /* Test if the host is an IP */ + struct in_addr addr; + if (inet_pton(AF_INET, *host, &addr) == 1) + return 0; + + /* Test if the host can be resolved */ + struct addrinfo *info = NULL; + if (vlc_getaddrinfo_i11e(*host, port, NULL, &info) == 0) + { + freeaddrinfo(info); + /* Let smb2 resolve it */ + return 0; + } + + /* Test if the host is a netbios name */ + netbios_ns *ns = netbios_ns_new(); + uint32_t ip4_addr; + int ret = -1; + if (netbios_ns_resolve(ns, *host, NETBIOS_FILESERVER, &ip4_addr) == 0) + { + char ip[] = "xxx.xxx.xxx.xxx"; + if (inet_ntop(AF_INET, &ip4_addr, ip, sizeof(ip))) + { + free(*host); + *host = strdup(ip); + if (*host) + ret = 0; + } + } + netbios_ns_destroy(ns); + return ret; +#else (void) port; return 0; +#endif } static int -- 2.11.4.GIT