[vlc-devel] [PATCH 4/4] dsm: prevent next module probe when possible
Thomas Guillem
thomas at gllm.fr
Fri Oct 25 11:01:21 CEST 2019
---
modules/access/dsm/access.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/modules/access/dsm/access.c b/modules/access/dsm/access.c
index 060004f9fa8..14db6c18177 100644
--- a/modules/access/dsm/access.c
+++ b/modules/access/dsm/access.c
@@ -35,6 +35,7 @@
#include <vlc_variables.h>
#include <vlc_keystore.h>
#include <vlc_network.h>
+#include <vlc_interrupt.h>
#include <assert.h>
#include <errno.h>
@@ -144,6 +145,7 @@ static int Open( vlc_object_t *p_this )
stream_t *p_access = (stream_t*)p_this;
access_sys_t *p_sys;
smb_stat st;
+ int status = DSM_ERROR_GENERIC;
/* Init p_access */
p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) );
@@ -162,17 +164,23 @@ static int Open( vlc_object_t *p_this )
goto error;
if( get_address( p_access ) != VLC_SUCCESS )
+ {
+ status = DSM_ERROR_NETWORK;
goto error;
+ }
msg_Dbg( p_access, "Session: Host name = %s, ip = %s", p_sys->netbios_name,
inet_ntoa( p_sys->addr ) );
/* Now that we have the required data, let's establish a session */
- if( smb_session_connect( p_sys->p_session, p_sys->netbios_name,
- p_sys->addr.s_addr, SMB_TRANSPORT_TCP )
- != DSM_SUCCESS )
+ status = smb_session_connect( p_sys->p_session, p_sys->netbios_name,
+ p_sys->addr.s_addr, SMB_TRANSPORT_TCP );
+ if( status != DSM_SUCCESS )
{
msg_Err( p_access, "Unable to connect/negotiate SMB session");
+ /* FIXME: libdsm wrongly return network error when the server can't
+ * handle the SMBv1 protocol */
+ status = DSM_ERROR_GENERIC;
goto error;
}
@@ -208,7 +216,14 @@ static int Open( vlc_object_t *p_this )
error:
Close( p_this );
- return VLC_EGENERIC;
+
+ /* Returning VLC_ETIMEOUT will stop the module probe and prevent to
+ * load the next smb module. The dsm module can return this specific
+ * error in case of network error (DSM_ERROR_NETWORK) or when the user
+ * asked to cancel it (vlc_killed()). Indeed, in these cases, it is
+ * useless to try next smb modules. */
+ return vlc_killed() || status == DSM_ERROR_NETWORK ? VLC_ETIMEOUT
+ : VLC_EGENERIC;
}
static int OpenForced( vlc_object_t *p_this )
--
2.20.1
More information about the vlc-devel
mailing list