X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fsmb.c;h=57e21f7c439e51b7a75f575f6c28a726e6f448b3;hb=5b41c88864e2e6cb57cc9d37ca8ba35263827063;hp=097fea743e88fa06f5b396a13eed03421c7dc3a0;hpb=1bc2b2790fdc9aa9b4d07884495f28f41a817f2d;p=vlc diff --git a/modules/access/smb.c b/modules/access/smb.c index 097fea743e..57e21f7c43 100644 --- a/modules/access/smb.c +++ b/modules/access/smb.c @@ -1,7 +1,7 @@ /***************************************************************************** * smb.c: SMB input module ***************************************************************************** - * Copyright (C) 2001-2004 VideoLAN + * Copyright (C) 2001-2004 the VideoLAN team * $Id$ * * Authors: Gildas Bazin @@ -18,16 +18,16 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include + #include -#include +#include #ifdef WIN32 #ifdef HAVE_FCNTL_H @@ -58,16 +58,16 @@ static void Close( vlc_object_t * ); #define CACHING_TEXT N_("Caching value in ms") #define CACHING_LONGTEXT N_( \ - "Allows you to modify the default caching value for SMB streams. This " \ - "value should be set in millisecond units." ) + "Caching value for SMB streams. This " \ + "value should be set in milliseconds." ) #define USER_TEXT N_("SMB user name") -#define USER_LONGTEXT N_("Allows you to modify the user name that will " \ +#define USER_LONGTEXT N_("User name that will " \ "be used for the connection.") #define PASS_TEXT N_("SMB password") -#define PASS_LONGTEXT N_("Allows you to modify the password that will be " \ +#define PASS_LONGTEXT N_("Password that will be " \ "used for the connection.") #define DOMAIN_TEXT N_("SMB domain") -#define DOMAIN_LONGTEXT N_("Allows you to modify the domain/workgroup that " \ +#define DOMAIN_LONGTEXT N_("Domain/Workgroup that " \ "will be used for the connection.") vlc_module_begin(); @@ -91,7 +91,7 @@ vlc_module_end(); /***************************************************************************** * Local prototypes *****************************************************************************/ -static int Read( access_t *, uint8_t *, int ); +static ssize_t Read( access_t *, uint8_t *, size_t ); static int Seek( access_t *, int64_t ); static int Control( access_t *, int, va_list ); @@ -109,8 +109,8 @@ struct access_sys_t static void Win32AddConnection( access_t *, char *, char *, char *, char * ); #endif -void smb_auth( const char *srv, const char *shr, char *wg, int wglen, - char *un, int unlen, char *pw, int pwlen ) +static void smb_auth( const char *srv, const char *shr, char *wg, int wglen, + char *un, int unlen, char *pw, int pwlen ) { //wglen = unlen = pwlen = 0; } @@ -220,26 +220,27 @@ static int Open( vlc_object_t *p_this ) if( !smbc_init_context( p_smb ) ) { - msg_Err( p_access, "cannot initialize context (%s)", strerror(errno) ); + msg_Err( p_access, "cannot initialize context (%m)" ); smbc_free_context( p_smb, 1 ); free( psz_uri ); return VLC_EGENERIC; } - if( !(p_file = p_smb->open( p_smb, psz_uri, O_RDONLY, 0 )) ) + if( !(p_file = (p_smb->open)( p_smb, psz_uri, O_RDONLY, 0 )) ) { - msg_Err( p_access, "open failed for '%s' (%s)", - p_access->psz_path, strerror(errno) ); + msg_Err( p_access, "open failed for '%s' (%m)", + p_access->psz_path ); smbc_free_context( p_smb, 1 ); free( psz_uri ); return VLC_EGENERIC; } - p_access->info.i_size = 0; + /* Init p_access */ + STANDARD_READ_ACCESS_INIT; + i_ret = p_smb->fstat( p_smb, p_file, &filestat ); - if( i_ret ) msg_Err( p_access, "stat failed (%s)", strerror(errno) ); + if( i_ret ) msg_Err( p_access, "stat failed (%m)" ); else p_access->info.i_size = filestat.st_size; - #else #ifndef WIN32 @@ -250,35 +251,36 @@ static int Open( vlc_object_t *p_this ) } #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' (%s)", - p_access->psz_path, strerror(errno) ); + msg_Err( p_access, "open failed for '%s' (%m)", + p_access->psz_path ); free( psz_uri ); return VLC_EGENERIC; } - p_access->info.i_size = 0; + /* Init p_access */ + STANDARD_READ_ACCESS_INIT; + i_ret = smbc_fstat( i_smb, &filestat ); - if( i_ret ) msg_Err( p_access, "stat failed (%s)", strerror(i_ret) ); + if( i_ret ) + { + errno = i_ret; + msg_Err( p_access, "stat failed (%m)" ); + } else p_access->info.i_size = filestat.st_size; #endif free( psz_uri ); - /* Init p_access */ - p_access->pf_read = Read; - p_access->pf_block = NULL; - p_access->pf_seek = Seek; - p_access->pf_control = Control; - p_access->info.i_update = 0; - p_access->info.i_pos = 0; - p_access->info.b_eof = VLC_FALSE; - p_access->info.i_title = 0; - p_access->info.i_seekpoint = 0; - p_access->p_sys = p_sys = malloc( sizeof( access_sys_t ) ); - memset( p_sys, 0, sizeof( access_sys_t ) ); - #ifdef USE_CTX p_sys->p_smb = p_smb; p_sys->p_file = p_file; @@ -301,7 +303,11 @@ static void Close( vlc_object_t *p_this ) access_sys_t *p_sys = p_access->p_sys; #ifdef USE_CTX +# ifndef HAVE__SMBCCTX_CLOSE_FN p_sys->p_smb->close( p_sys->p_smb, p_sys->p_file ); +# else + p_sys->p_smb->close_fn( p_sys->p_smb, p_sys->p_file ); +# endif smbc_free_context( p_sys->p_smb, 1 ); #else smbc_close( p_sys->i_smb ); @@ -329,7 +335,7 @@ static int Seek( access_t *p_access, int64_t i_pos ) #endif if( i_ret == -1 ) { - msg_Err( p_access, "seek failed (%s)", strerror(errno) ); + msg_Err( p_access, "seek failed (%m)" ); return VLC_EGENERIC; } @@ -342,7 +348,7 @@ static int Seek( access_t *p_access, int64_t i_pos ) /***************************************************************************** * Read: *****************************************************************************/ -static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) +static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) { access_sys_t *p_sys = p_access->p_sys; int i_read; @@ -356,7 +362,7 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) #endif if( i_read < 0 ) { - msg_Err( p_access, "read failed (%s)", strerror(errno) ); + msg_Err( p_access, "read failed (%m)" ); return -1; } @@ -412,6 +418,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_SET_TITLE: case ACCESS_SET_SEEKPOINT: case ACCESS_SET_PRIVATE_ID_STATE: + case ACCESS_GET_CONTENT_TYPE: return VLC_EGENERIC; default: @@ -453,17 +460,15 @@ static void Win32AddConnection( access_t *p_access, char *psz_path, net_resource.dwType = RESOURCETYPE_DISK; /* Find out server and share names */ - psz_server[0] = psz_share[0] = 0; + strlcpy( psz_server, psz_path, sizeof( psz_server ) ); + psz_share[0] = 0; psz_parser = strchr( psz_path, '/' ); if( psz_parser ) { - char *psz_parser2; - strncat( psz_server, psz_path, psz_parser - psz_path ); - psz_parser2 = strchr( psz_parser+1, '/' ); + char *psz_parser2 = strchr( ++psz_parser, '/' ); if( psz_parser2 ) - strncat( psz_share, psz_parser+1, psz_parser2 - psz_parser -1 ); - } - else strncat( psz_server, psz_path, MAX_PATH ); + strlcpy( psz_share, psz_parser, sizeof( psz_share ) ); + } sprintf( psz_remote, "\\\\%s\\%s", psz_server, psz_share ); net_resource.lpRemoteName = psz_remote; @@ -474,7 +479,7 @@ static void Win32AddConnection( access_t *p_access, char *psz_path, { msg_Dbg( p_access, "connected to %s", psz_remote ); } - else if( i_result != ERROR_ALREADY_ASSIGNED && + else if( i_result != ERROR_ALREADY_ASSIGNED && i_result != ERROR_DEVICE_ALREADY_REMEMBERED ) { msg_Dbg( p_access, "already connected to %s", psz_remote );