From 858bc79cf514549106266bec2e29c43d54cec949 Mon Sep 17 00:00:00 2001 From: Julien 'Lta' BALLET Date: Wed, 2 Jul 2014 11:58:40 +0000 Subject: [PATCH] Add a libdsm based service discovery module to find CIFS speaking host on LAN Signed-off-by: Jean-Baptiste Kempf --- NEWS | 4 + modules/access/Makefile.am | 2 +- modules/access/dsm/access.c | 9 ++ modules/access/dsm/common.h | 4 + modules/access/dsm/sd.c | 111 +++++++++++++++++++++++++ modules/services_discovery/Makefile.am | 2 + 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 modules/access/dsm/sd.c diff --git a/NEWS b/NEWS index 6c6a745743..759efce793 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,10 @@ Access: * Support HDS (Http Dynamic Streaming) from Adobe (f4m, f4v, etc.) * New SMB access module using libdsm +Service Discovery: + * New NetBios service discovery using libdsm + + Changes between 2.1.x and 2.2.0: -------------------------------- diff --git a/modules/access/Makefile.am b/modules/access/Makefile.am index 1f7b3fdffe..efc0ae6877 100644 --- a/modules/access/Makefile.am +++ b/modules/access/Makefile.am @@ -387,7 +387,7 @@ access_LTLIBRARIES += $(LTLIBsmb) EXTRA_LTLIBRARIES += libsmb_plugin.la libdsm_plugin_la_SOURCES = access/dsm/access.c access/dsm/common.h \ - access/bdsm/browser.c + access/bdsm/browser.c access/bdsm/sd.c libdsm_plugin_la_CFLAGS = $(AM_CFLAGS) $(DSM_CFLAGS) libdsm_plugin_la_LIBADD = $(DSM_LIBS) libdsm_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(sddir)' diff --git a/modules/access/dsm/access.c b/modules/access/dsm/access.c index 3b23f1dffd..6269b7739c 100644 --- a/modules/access/dsm/access.c +++ b/modules/access/dsm/access.c @@ -69,6 +69,15 @@ vlc_module_begin () add_string( "smb-domain", NULL, DOMAIN_TEXT, DOMAIN_LONGTEXT, false ) add_shortcut( "smb", "cifs" ) set_callbacks( Open, Close ) + + add_submodule() + set_category( CAT_PLAYLIST ) + set_subcategory( SUBCAT_PLAYLIST_SD ) + set_capability( "services_discovery", 0 ) + set_callbacks( SdOpen, SdClose ) + + VLC_SD_PROBE_SUBMODULE + vlc_module_end () /***************************************************************************** diff --git a/modules/access/dsm/common.h b/modules/access/dsm/common.h index 7b61d9f7af..cae5ab7e79 100644 --- a/modules/access/dsm/common.h +++ b/modules/access/dsm/common.h @@ -32,6 +32,10 @@ int Open( vlc_object_t * ); void Close( vlc_object_t * ); +int SdOpen( vlc_object_t * ); +void SdClose( vlc_object_t * ); +int vlc_sd_probe_Open( vlc_object_t * ); + int BrowserInit( access_t *p_access ); struct access_sys_t diff --git a/modules/access/dsm/sd.c b/modules/access/dsm/sd.c new file mode 100644 index 0000000000..ad2c5a0f0f --- /dev/null +++ b/modules/access/dsm/sd.c @@ -0,0 +1,111 @@ +/** + * @file bdsm/sd.c + * @brief List host supporting NETBIOS on the local network + */ +/***************************************************************************** + * Copyright © 2014 Authors and the VideoLAN team + * + * Authors: - Julien 'Lta' BALLET + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/***************************************************************************** + * Preamble + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "common.h" + +struct services_discovery_sys_t +{ + netbios_ns *ns; +}; + +int vlc_sd_probe_Open (vlc_object_t *p_this) +{ + vlc_probe_t *p_probe = (vlc_probe_t *)p_this; + + vlc_sd_probe_Add( p_probe, "dsm{longname=\"Windows networks\"}", + N_( "Windows networks" ), SD_CAT_LAN ); + + return VLC_PROBE_CONTINUE; +} + +int SdOpen (vlc_object_t *p_this) +{ + services_discovery_t *p_sd = (services_discovery_t *)p_this; + services_discovery_sys_t *p_sys = malloc (sizeof (*p_sys)); + + if( p_sys == NULL ) + return VLC_ENOMEM; + p_sd->p_sys = p_sys; + + /* Let's create a NETBIOS name service object */ + p_sys->ns = netbios_ns_new(); + if( p_sys->ns == NULL ) + goto error; + + if( !netbios_ns_discover( p_sys->ns ) ) + goto error; + + for( ssize_t i = 0; i < netbios_ns_entry_count( p_sys->ns ); i++ ) + { + netbios_ns_entry *p_entry = netbios_ns_entry_at( p_sys->ns, i ); + + if( p_entry->type == 0x20 ) + { + input_item_t *p_item; + char *psz_mrl; + + if( asprintf(&psz_mrl, "smb://%s", p_entry->name) < 0 ) + goto error; + + p_item = input_item_NewWithType( psz_mrl, p_entry->name, 0, NULL, + 0, -1, ITEM_TYPE_NODE ); + msg_Dbg( p_sd, "Adding item %s", psz_mrl ); + + services_discovery_AddItem( p_sd, p_item, NULL ); + + free( psz_mrl ); + } + } + + return VLC_SUCCESS; + + error: + if( p_sys->ns != NULL ) + netbios_ns_destroy( p_sys->ns ); + free( p_sys ); + p_sd->p_sys = NULL; + + return VLC_EGENERIC; +} + +void SdClose (vlc_object_t *p_this) +{ + services_discovery_t *sd = (services_discovery_t *)p_this; + services_discovery_sys_t *p_sys = sd->p_sys; + + if( p_sys == NULL ) + return; + + if( p_sys->ns != NULL ) + netbios_ns_destroy( p_sys->ns ); +} + diff --git a/modules/services_discovery/Makefile.am b/modules/services_discovery/Makefile.am index 11fca94cb3..b526338946 100644 --- a/modules/services_discovery/Makefile.am +++ b/modules/services_discovery/Makefile.am @@ -68,3 +68,5 @@ libos2drive_plugin_la_SOURCES = services_discovery/os2drive.c if HAVE_OS2 sd_LTLIBRARIES += libos2drive_plugin.la endif + +sd_LTLIBRARIES += $(LTLIBdsm)