static int BrowseShare( stream_t *p_access, input_item_node_t *p_node ) { access_sys_t *p_sys = p_access->p_sys; smb_share_list shares; const char *psz_name; size_t share_count; int i_ret = VLC_SUCCESS; if( smb_share_get_list( p_sys->p_session, &shares, &share_count ) != DSM_SUCCESS ) return VLC_EGENERIC; struct vlc_readdir_helper rdh; vlc_readdir_helper_init( &rdh, p_access, p_node ); for( size_t i = 0; i < share_count && i_ret == VLC_SUCCESS; i++ ) { psz_name = smb_share_list_at( shares, i ); if( psz_name[strlen( psz_name ) - 1] == '$') continue; i_ret = add_item( p_access, &rdh, psz_name, ITEM_TYPE_DIRECTORY ); } vlc_readdir_helper_finish( &rdh, i_ret == VLC_SUCCESS ); smb_share_list_destroy( shares ); return i_ret; }
/***************************************************************************** * Close: free unused data structures *****************************************************************************/ static void Close( vlc_object_t *p_this ) { access_t *p_access = (access_t*)p_this; access_sys_t *p_sys = p_access->p_sys; if( p_sys->p_ns ) netbios_ns_destroy( p_sys->p_ns ); if( p_sys->i_fd ) smb_fclose( p_sys->p_session, p_sys->i_fd ); if( p_sys->p_session ) smb_session_destroy( p_sys->p_session ); vlc_UrlClean( &p_sys->url ); if( p_sys->shares ) smb_share_list_destroy( p_sys->shares ); if( p_sys->files ) smb_stat_list_destroy( p_sys->files ); free( p_sys->psz_fullpath ); free( p_sys ); }