[vlc-devel] [PATCH v3 3/4] Add pf_readdir support to liBDSM access module
Hugo Beauzée-Luyssen
hugo at beauzee.fr
Mon Jun 30 16:44:24 CEST 2014
On Mon, Jun 30, 2014, at 04:09 PM, Julien 'Lta' BALLET wrote:
> From: Julien 'Lta' BALLET <contact at lta.io>
>
> ---
> modules/access/Makefile.am | 3 +-
> modules/access/bdsm/browser.c | 193
> ++++++++++++++++++++++++++++++++++++++++++
> modules/access/bdsm/common.h | 3 +-
> 3 files changed, 197 insertions(+), 2 deletions(-)
> create mode 100644 modules/access/bdsm/browser.c
>
> diff --git a/modules/access/Makefile.am b/modules/access/Makefile.am
> index cae8971..e26ae3d 100644
> --- a/modules/access/Makefile.am
> +++ b/modules/access/Makefile.am
> @@ -386,7 +386,8 @@ libsmb_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath
> '$(accessdir)'
> access_LTLIBRARIES += $(LTLIBsmb)
> EXTRA_LTLIBRARIES += libsmb_plugin.la
>
> -libdsm_plugin_la_SOURCES = access/bdsm/access.c access/bdsm/common.h
> +libdsm_plugin_la_SOURCES = access/bdsm/access.c \
> + access/bdsm/common.h access/bdsm/browser.c
> libdsm_plugin_la_CFLAGS = $(AM_CFLAGS) $(BDSM_CFLAGS)
> libdsm_plugin_la_LIBADD = $(BDSM_LIBS)
> libdsm_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(sddir)'
> diff --git a/modules/access/bdsm/browser.c
> b/modules/access/bdsm/browser.c
> new file mode 100644
> index 0000000..a69936f
> --- /dev/null
> +++ b/modules/access/bdsm/browser.c
> @@ -0,0 +1,193 @@
> +/*****************************************************************************
> + * bdsm/access.c: liBDSM based SMB/CIFS access module
> +
> *****************************************************************************
> + * Copyright (C) 2001-2009 VLC authors and VideoLAN
> + *
> + * Authors: Julien 'Lta' BALLET <contact # lta 'dot' io>
> + *
> + * 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"
> +
> +static int Control (access_t *p_access, int i_query, va_list args);
> +static int BrowseShare( access_t *p_access, input_item_node_t *p_node );
> +static int BrowseDirectory( access_t *p_access, input_item_node_t
> *p_node );
> +static bool AddToNode( access_t *p_access, input_item_node_t *p_node,
> + const char *psz_name );
> +
> +int BrowserInit( access_t *p_access )
> +{
> + access_sys_t *p_sys = p_access->p_sys;
> +
> + if( p_sys->psz_share == NULL )
> + p_access->pf_readdir = BrowseShare;
> + else
> + p_access->pf_readdir = BrowseDirectory;
> + p_access->pf_control = Control;
> +
> + return VLC_SUCCESS;
> +}
> +
> +static int BrowseShare( access_t *p_access, input_item_node_t *p_node )
> +{
> + smb_share_list shares;
> + input_item_t *p_item;
> + const char *psz_name;
> + size_t share_count;
> +
> + share_count = smb_share_get_list( p_access->p_sys->p_session,
> &shares );
> + if( !share_count )
> + return VLC_ENOITEM;
> +
> + for( size_t i = 0; i < share_count; i++ )
> + {
> + psz_name = smb_share_list_at( shares, i );
> +
> + if( psz_name[strlen( psz_name ) - 1] == '$')
> + continue;
> +
> + AddToNode( p_access, p_node, psz_name );
> + }
> +
> + smb_share_list_destroy( shares );
> + return VLC_SUCCESS;
> +
> + error:
> + smb_share_list_destroy( shares );
> + return VLC_ENOITEM;
> +}
> +
> +static int BrowseDirectory( access_t *p_access, input_item_node_t
> *p_node )
> +{
> + access_sys_t *p_sys = p_access->p_sys;
> + smb_stat_list files;
> + smb_stat st;
> + const char *psz_query, *psz_name;
> + size_t files_count;
> +
> + if( p_sys->psz_path != NULL )
> + {
> + asprintf( &psz_query, "%s\\*", p_sys->psz_path );
> + if( psz_query == NULL )
> + return VLC_ENOMEM;
> + files = smb_find( p_sys->p_session, p_sys->i_tid, psz_query );
> + free( psz_query );
> + }
> + else
> + files = smb_find( p_sys->p_session, p_sys->i_tid, "\\*" );
> +
> + if( files == NULL )
> + return VLC_ENOITEM;
> +
> + files_count = smb_stat_list_count( files );
> + for( size_t i = 0; i < files_count; i++ )
> + {
> + st = smb_stat_list_at( files, i );
> +
> + if( st == NULL )
> + goto error;
> +
> + psz_name = smb_stat_name( st );
> +
> + /* Avoid infinite loop */
> + if( !strcmp( psz_name, ".") || !strcmp( psz_name, "..") )
> + continue;
> +
> + AddToNode( p_access, p_node, psz_name );
> + }
> +
> + smb_stat_list_destroy( files );
> + return VLC_SUCCESS;
> +
> + error:
> + smb_stat_list_destroy( files );
> + return VLC_ENOITEM;
> +}
> +
> +/*****************************************************************************
> + * Control:
> +
> *****************************************************************************/
> +static int Control( access_t *p_access, int i_query, va_list args )
> +{
> + VLC_UNUSED( p_access );
> +
> + switch( i_query )
> + {
> + case ACCESS_CAN_SEEK:
> + case ACCESS_CAN_FASTSEEK:
> + *va_arg( args, bool* ) = false;
> + break;
> +
> + case ACCESS_CAN_PAUSE:
> + case ACCESS_CAN_CONTROL_PACE:
> + *va_arg( args, bool* ) = true;
> + break;
> +
> + case ACCESS_GET_PTS_DELAY:
> + *va_arg( args, int64_t * ) = DEFAULT_PTS_DELAY * 1000;
> + break;
> +
> + default:
> + return VLC_EGENERIC;
> + }
> + return VLC_SUCCESS;
> + }
> +
> +static bool AddToNode( access_t *p_access, input_item_node_t *p_node,
> + const char *psz_name )
> +{
> + access_sys_t *p_sys = p_access->p_sys;
> + input_item_t *p_item;
> + char *psz_uri, *psz_option;
> +
> + asprintf( &psz_uri, "%s/%s", p_node->p_item->psz_uri, psz_name );
> + /* XXX Handle ENOMEM by enabling retry */
> + if( psz_uri == NULL )
> + return false;
> +
> + p_item = input_item_New( psz_uri, psz_name );
> + free( psz_uri );
> + if( p_item == NULL )
> + return false;
> +
> + input_item_CopyOptions( p_node->p_item, p_item );
> + input_item_node_AppendItem( p_node, p_item );
> +
> + /* Here we save on the node the credentials that allowed us to
> login.
> + * That way the user isn't prompted more than once for credentials
> */
> + asprintf( &psz_option, "smb-user=%s", p_sys->creds.login );
> + if( psz_option != NULL )
> + input_item_AddOption( p_item, psz_option,
> VLC_INPUT_OPTION_TRUSTED );
> + free( psz_option );
> + asprintf( &psz_option, "smb-pwd=%s", p_sys->creds.password );
> + if( psz_option != NULL )
> + input_item_AddOption( p_item, psz_option,
> VLC_INPUT_OPTION_TRUSTED );
> + free( psz_option );
> + asprintf( &psz_option, "smb-domain=%s", p_sys->creds.domain );
> + if( psz_option != NULL )
> + input_item_AddOption( p_item, psz_option,
> VLC_INPUT_OPTION_TRUSTED );
> + free( psz_option );
> +
> + input_item_Release( p_item );
> + return true;
> +}
> diff --git a/modules/access/bdsm/common.h b/modules/access/bdsm/common.h
> index e061ba8..7b61d9f 100644
> --- a/modules/access/bdsm/common.h
> +++ b/modules/access/bdsm/common.h
> @@ -26,12 +26,13 @@
> #include <vlc_common.h>
> #include <vlc_plugin.h>
> #include <vlc_access.h>
> +#include <vlc_services_discovery.h>
> #include <vlc_url.h>
>
> int Open( vlc_object_t * );
> void Close( vlc_object_t * );
>
> -int BrowserInit( access_t *p_access ) { return VLC_EGENERIC; }
> +int BrowserInit( access_t *p_access );
>
> struct access_sys_t
> {
> --
> 2.0.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
Hi,
You probably should check for asprintf's return rather than strp's
value, as GNU implementation states its value is undefined.
Regards,
--
Hugo Beauzée-Luyssen
hugo at beauzee.fr
More information about the vlc-devel
mailing list