/* Build an SMB URI * smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]] */ static int smb_get_uri( stream_t *p_access, char **ppsz_uri, const char *psz_domain, const char *psz_user, const char *psz_pwd, const char *psz_server, const char *psz_share_path, const char *psz_name ) { assert(psz_server); #define PSZ_SHARE_PATH_OR_NULL psz_share_path ? psz_share_path : "" #define PSZ_NAME_OR_NULL psz_name ? "/" : "", psz_name ? psz_name : "" #ifdef _WIN32 if( psz_user ) Win32AddConnection( p_access, psz_server, psz_share_path, psz_user, psz_pwd, psz_domain ); return asprintf( ppsz_uri, "//%s%s%s%s", psz_server, PSZ_SHARE_PATH_OR_NULL, PSZ_NAME_OR_NULL ); #else (void) p_access; if( psz_user ) return asprintf( ppsz_uri, "smb://%s%s%s%s%s@%s%s%s%s", psz_domain ? psz_domain : "", psz_domain ? ";" : "", psz_user, psz_pwd ? ":" : "", psz_pwd ? psz_pwd : "", psz_server, PSZ_SHARE_PATH_OR_NULL, PSZ_NAME_OR_NULL ); else return asprintf( ppsz_uri, "smb://%s%s%s%s", psz_server, PSZ_SHARE_PATH_OR_NULL, PSZ_NAME_OR_NULL ); #endif }
/* Build an SMB URI * smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]] */ static int smb_get_uri( stream_t *p_access, char **ppsz_uri, const char *psz_domain, const char *psz_user, const char *psz_pwd, const char *psz_server, const char *psz_share_path, const char *psz_name ) { assert(psz_server); #define PSZ_SHARE_PATH_OR_NULL psz_share_path ? psz_share_path : "" #define PSZ_NAME_OR_NULL psz_name ? "/" : "", psz_name ? psz_name : "" if( psz_user ) Win32AddConnection( p_access, psz_server, psz_share_path, psz_user, psz_pwd, psz_domain ); return asprintf( ppsz_uri, "//%s%s%s%s", psz_server, PSZ_SHARE_PATH_OR_NULL, PSZ_NAME_OR_NULL ); }
/**************************************************************************** * Open: connect to smb server and ask for file ****************************************************************************/ static int Open( vlc_object_t *p_this ) { access_t *p_access = (access_t*)p_this; access_sys_t *p_sys; struct stat filestat; char *psz_location, *psz_uri; char *psz_user = NULL, *psz_pwd = NULL, *psz_domain = NULL; int i_ret; int i_smb; /* Parse input URI * [[[domain;]user[:password@]]server[/share[/path[/file]]]] */ psz_location = strchr( p_access->psz_location, '/' ); if( !psz_location ) { msg_Err( p_access, "invalid SMB URI: smb://%s", psz_location ); return VLC_EGENERIC; } else { char *psz_tmp = strdup( p_access->psz_location ); char *psz_parser; psz_tmp[ psz_location - p_access->psz_location ] = 0; psz_location = p_access->psz_location; psz_parser = strchr( psz_tmp, '@' ); if( psz_parser ) { /* User info is there */ *psz_parser = 0; psz_location = p_access->psz_location + (psz_parser - psz_tmp) + 1; psz_parser = strchr( psz_tmp, ':' ); if( psz_parser ) { /* Password found */ psz_pwd = strdup( psz_parser+1 ); *psz_parser = 0; } psz_parser = strchr( psz_tmp, ';' ); if( psz_parser ) { /* Domain found */ *psz_parser = 0; psz_parser++; psz_domain = strdup( psz_tmp ); } else psz_parser = psz_tmp; psz_user = strdup( psz_parser ); } free( psz_tmp ); } /* Build an SMB URI * smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]] */ if( !psz_user ) psz_user = var_InheritString( p_access, "smb-user" ); if( psz_user && !*psz_user ) { free( psz_user ); psz_user = NULL; } if( !psz_pwd ) psz_pwd = var_InheritString( p_access, "smb-pwd" ); if( psz_pwd && !*psz_pwd ) { free( psz_pwd ); psz_pwd = NULL; } if( !psz_domain ) psz_domain = var_InheritString( p_access, "smb-domain" ); if( psz_domain && !*psz_domain ) { free( psz_domain ); psz_domain = NULL; } #ifdef _WIN32 if( psz_user ) Win32AddConnection( p_access, psz_location, psz_user, psz_pwd, psz_domain); i_ret = asprintf( &psz_uri, "//%s", psz_location ); #else if( psz_user ) i_ret = asprintf( &psz_uri, "smb://%s%s%s%s%s@%s", psz_domain ? psz_domain : "", psz_domain ? ";" : "", psz_user, psz_pwd ? ":" : "", psz_pwd ? psz_pwd : "", psz_location ); else i_ret = asprintf( &psz_uri, "smb://%s", psz_location ); #endif free( psz_user ); free( psz_pwd ); free( psz_domain ); if( i_ret == -1 ) return VLC_ENOMEM; #ifndef _WIN32 if( smbc_init( smb_auth, 0 ) ) { free( psz_uri ); return VLC_EGENERIC; } #endif /* ** some version of glibc defines open as a macro, causing havoc ** with other macros using 'open' under the hood, such as the ** following one: */ #if defined(smbc_open) && defined(open) # undef open #endif if( (i_smb = smbc_open( psz_uri, O_RDONLY, 0 )) < 0 ) { msg_Err( p_access, "open failed for '%s' (%m)", p_access->psz_location ); free( psz_uri ); return VLC_EGENERIC; } /* Init p_access */ STANDARD_READ_ACCESS_INIT; i_ret = smbc_fstat( i_smb, &filestat ); if( i_ret ) { errno = i_ret; msg_Err( p_access, "stat failed (%m)" ); } else p_sys->size = filestat.st_size; free( psz_uri ); p_sys->i_smb = i_smb; return VLC_SUCCESS; }