[vlc-commits] Avahi: listen to the browsing protocols we support
Jean-Baptiste Kempf
git at videolan.org
Mon Feb 29 23:23:41 CET 2016
vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Mon Feb 29 23:15:46 2016 +0100| [1a922a490d24af347746b3a73fbb8795c582e6dd] | committer: Jean-Baptiste Kempf
Avahi: listen to the browsing protocols we support
SFTP, FTP, SMB, NFS
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1a922a490d24af347746b3a73fbb8795c582e6dd
---
modules/services_discovery/avahi.c | 64 ++++++++++++++++++++++++++----------
1 file changed, 47 insertions(+), 17 deletions(-)
diff --git a/modules/services_discovery/avahi.c b/modules/services_discovery/avahi.c
index 60a7947..f581d16 100644
--- a/modules/services_discovery/avahi.c
+++ b/modules/services_discovery/avahi.c
@@ -1,10 +1,10 @@
/*****************************************************************************
* avahi.c: Bonjour services discovery module
*****************************************************************************
- * Copyright (C) 2005-2009 the VideoLAN team
- * $Id$
+ * Copyright (C) 2005-2009, 2016 VideoLAN and VLC authors
*
* Authors: Jon Lech Johansen <jon at nanocrew.net>
+ * Jean-Baptiste Kempf <jb at videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -75,9 +75,18 @@ struct services_discovery_sys_t
vlc_dictionary_t services_name_to_input_item;
};
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
+static const struct
+{
+ const char *psz_protocol;
+ const char *psz_service_name;
+ uint16_t i_default_port;
+} protocols[] = {
+ { "ftp", "_ftp._tcp", 21 },
+ { "smb", "_smb._tcp", 445 },
+ { "nfs", "_nfs._tcp", 2049 },
+ { "sftp", "_sftp-ssh._tcp", 22 },
+};
+#define NB_PROTOCOLS (sizeof(protocols) / sizeof(*protocols))
/*****************************************************************************
* client_callback
@@ -134,14 +143,23 @@ static void resolve_callback(
AvahiStringList *asl = NULL;
input_item_t *p_input = NULL;
- msg_Dbg( p_sd, "service '%s' of type '%s' in domain '%s'",
- name, type, domain );
+ msg_Err( p_sd, "service '%s' of type '%s' in domain '%s' port %i",
+ name, type, domain, port );
avahi_address_snprint(a, (sizeof(a)/sizeof(a[0]))-1, address);
if( protocol == AVAHI_PROTO_INET6 )
if( asprintf( &psz_addr, "[%s]", a ) == -1 )
return;
+ const char *psz_protocol = NULL;
+ for( unsigned int i = 0; i < NB_PROTOCOLS; i++ )
+ {
+ if( !strcmp(type, protocols[i].psz_service_name) )
+ psz_protocol = protocols[i].psz_protocol;
+ }
+ if( psz_protocol == NULL )
+ return;
+
if( txt != NULL )
asl = avahi_string_list_find( txt, "path" );
if( asl != NULL )
@@ -152,8 +170,10 @@ static void resolve_callback(
if( avahi_string_list_get_pair( asl, &key, &value, &size ) == 0 &&
value != NULL )
{
- if( asprintf( &psz_uri, "http://%s:%d%s",
- psz_addr != NULL ? psz_addr : a, port, value ) == -1 )
+ if( asprintf( &psz_uri, "%s://%s:%d%s",
+ psz_protocol,
+ psz_addr != NULL ? psz_addr : a,
+ port, value ) == -1 )
{
free( psz_addr );
return;
@@ -166,7 +186,8 @@ static void resolve_callback(
}
else
{
- if( asprintf( &psz_uri, "http://%s:%d",
+ if( asprintf( &psz_uri, "%s://%s:%d",
+ psz_protocol,
psz_addr != NULL ? psz_addr : a, port ) == -1 )
{
free( psz_addr );
@@ -272,16 +293,21 @@ static int Open( vlc_object_t *p_this )
goto error;
}
- p_sys->sb = avahi_service_browser_new( p_sys->client, AVAHI_IF_UNSPEC,
- AVAHI_PROTO_UNSPEC,
- "_vlc-http._tcp", NULL,
- 0, browse_callback, p_sd );
- if( p_sys->sb == NULL )
+ for( unsigned i = 0; i < NB_PROTOCOLS; i++ )
{
- msg_Err( p_sd, "failed to create avahi service browser" );
- goto error;
+ p_sys->sb = avahi_service_browser_new( p_sys->client, AVAHI_IF_UNSPEC,
+ AVAHI_PROTO_UNSPEC,
+ protocols[i].psz_service_name, NULL,
+ 0, browse_callback, p_sd );
+ if( p_sys->sb == NULL )
+ {
+ msg_Err( p_sd, "failed to create avahi service browser %s", avahi_strerror( avahi_client_errno(p_sys->client) ) );
+ goto error;
+ }
}
+ avahi_threaded_poll_start( p_sys->poll );
+
return VLC_SUCCESS;
error:
@@ -290,7 +316,10 @@ error:
if( p_sys->client != NULL )
avahi_client_free( p_sys->client );
if( p_sys->poll != NULL )
+ {
+ avahi_threaded_poll_stop( p_sys->poll );
avahi_threaded_poll_free( p_sys->poll );
+ }
vlc_dictionary_clear( &p_sys->services_name_to_input_item, NULL, NULL );
free( p_sys );
@@ -305,6 +334,7 @@ static void Close( vlc_object_t *p_this )
{
services_discovery_t *p_sd = ( services_discovery_t* )p_this;
services_discovery_sys_t *p_sys = p_sd->p_sys;
+ avahi_threaded_poll_stop( p_sys->poll );
avahi_service_browser_free( p_sys->sb );
avahi_client_free( p_sys->client );
More information about the vlc-commits
mailing list