Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
0e274923
Commit
0e274923
authored
Jan 27, 2005
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/access/smb.c: new SMB/CIFS access module using libsmbclient.
parent
3e59c65d
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
363 additions
and
0 deletions
+363
-0
configure.ac
configure.ac
+14
-0
modules/access/Modules.am
modules/access/Modules.am
+1
-0
modules/access/smb.c
modules/access/smb.c
+348
-0
No files found.
configure.ac
View file @
0e274923
...
@@ -1409,6 +1409,20 @@ then
...
@@ -1409,6 +1409,20 @@ then
fi
fi
fi
fi
dnl
dnl libsmbclient plugin
dnl
AC_ARG_ENABLE(smb,
[ --enable-smb smb input module (default enabled)])
if test "${enable_smb}" != "no"; then
AC_CHECK_HEADERS(libsmbclient.h,
[ VLC_ADD_PLUGINS([access_smb])
VLC_ADD_LDFLAGS([access_smb],[-lsmbclient]) ],
[ if test -n "${enable_smb}"; then
AC_MSG_ERROR([cannot find libsmbclient headers])
fi ])
fi
dnl
dnl
dnl libdvbpsi ts demux/mux
dnl libdvbpsi ts demux/mux
dnl
dnl
...
...
modules/access/Modules.am
View file @
0e274923
...
@@ -4,6 +4,7 @@ SOURCES_access_udp = udp.c
...
@@ -4,6 +4,7 @@ SOURCES_access_udp = udp.c
SOURCES_access_tcp = tcp.c
SOURCES_access_tcp = tcp.c
SOURCES_access_http = http.c
SOURCES_access_http = http.c
SOURCES_access_ftp = ftp.c
SOURCES_access_ftp = ftp.c
SOURCES_access_smb = smb.c
SOURCES_dvdnav = dvdnav.c
SOURCES_dvdnav = dvdnav.c
SOURCES_dvdread = dvdread.c
SOURCES_dvdread = dvdread.c
SOURCES_slp = slp.c
SOURCES_slp = slp.c
...
...
modules/access/smb.c
0 → 100644
View file @
0e274923
/*****************************************************************************
* smb.c: SMB input module
*****************************************************************************
* Copyright (C) 2001-2004 VideoLAN
* $Id$
*
* Authors: Gildas Bazin <gbazin@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* 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.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h>
#include <vlc/vlc.h>
#include <vlc/input.h>
#include <libsmbclient.h>
#define USE_CTX 1
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
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." )
#define USER_TEXT N_("SMB user name")
#define USER_LONGTEXT N_("Allows you to modify the 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 " \
"used for the connection.")
#define DOMAIN_TEXT N_("SMB domain")
#define DOMAIN_LONGTEXT N_("Allows you to modify the domain/workgroup that " \
"will be used for the connection.")
vlc_module_begin
();
set_shortname
(
"SMB"
);
set_description
(
_
(
"SMB input"
)
);
set_capability
(
"access2"
,
0
);
set_category
(
CAT_INPUT
);
set_subcategory
(
SUBCAT_INPUT_ACCESS
);
add_integer
(
"smb-caching"
,
2
*
DEFAULT_PTS_DELAY
/
1000
,
NULL
,
CACHING_TEXT
,
CACHING_LONGTEXT
,
VLC_TRUE
);
add_string
(
"smb-user"
,
NULL
,
NULL
,
USER_TEXT
,
USER_LONGTEXT
,
VLC_FALSE
);
add_string
(
"smb-pwd"
,
NULL
,
NULL
,
PASS_TEXT
,
PASS_LONGTEXT
,
VLC_FALSE
);
add_string
(
"smb-domain"
,
NULL
,
NULL
,
DOMAIN_TEXT
,
DOMAIN_LONGTEXT
,
VLC_FALSE
);
add_shortcut
(
"smb"
);
set_callbacks
(
Open
,
Close
);
vlc_module_end
();
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
Read
(
access_t
*
,
uint8_t
*
,
int
);
static
int
Seek
(
access_t
*
,
int64_t
);
static
int
Control
(
access_t
*
,
int
,
va_list
);
struct
access_sys_t
{
#ifdef USE_CTX
SMBCCTX
*
p_smb
;
SMBCFILE
*
p_file
;
#else
int
i_smb
;
#endif
};
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;
}
/****************************************************************************
* 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_uri
,
*
psz_user
,
*
psz_pwd
,
*
psz_domain
;
int
i_ret
;
#ifdef USE_CTX
SMBCCTX
*
p_smb
;
SMBCFILE
*
p_file
;
#else
int
i_smb
;
#endif
/* Build an SMB URI
* smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]] */
psz_user
=
var_CreateGetString
(
p_access
,
"smb-user"
);
if
(
psz_user
&&
!*
psz_user
)
{
free
(
psz_user
);
psz_user
=
0
;
}
psz_pwd
=
var_CreateGetString
(
p_access
,
"smb-pwd"
);
if
(
psz_pwd
&&
!*
psz_pwd
)
{
free
(
psz_pwd
);
psz_pwd
=
0
;
}
psz_domain
=
var_CreateGetString
(
p_access
,
"smb-domain"
);
if
(
psz_domain
&&
!*
psz_domain
)
{
free
(
psz_domain
);
psz_domain
=
0
;
}
/* FIXME: will need to parse the URI so we don't override credentials
* if there are already present. */
if
(
psz_user
)
asprintf
(
&
psz_uri
,
"smb://%s%s%s%s%s@%s"
,
psz_domain
?
psz_domain
:
""
,
psz_domain
?
";"
:
""
,
psz_user
,
psz_pwd
?
":"
:
""
,
psz_pwd
?
psz_pwd
:
""
,
p_access
->
psz_path
);
else
asprintf
(
&
psz_uri
,
"smb://%s"
,
p_access
->
psz_path
);
if
(
psz_user
)
free
(
psz_user
);
if
(
psz_pwd
)
free
(
psz_pwd
);
if
(
psz_domain
)
free
(
psz_domain
);
#ifdef USE_CTX
if
(
!
(
p_smb
=
smbc_new_context
())
)
{
msg_Err
(
p_access
,
"out of memory"
);
free
(
psz_uri
);
return
VLC_ENOMEM
;
}
p_smb
->
debug
=
1
;
p_smb
->
callbacks
.
auth_fn
=
smb_auth
;
if
(
!
smbc_init_context
(
p_smb
)
)
{
msg_Err
(
p_access
,
"cannot initialize context (%s)"
,
strerror
(
errno
)
);
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
))
)
{
msg_Err
(
p_access
,
"open failed for '%s' (%s)"
,
p_access
->
psz_path
,
strerror
(
errno
)
);
smbc_free_context
(
p_smb
,
1
);
free
(
psz_uri
);
return
VLC_EGENERIC
;
}
p_access
->
info
.
i_size
=
0
;
i_ret
=
p_smb
->
fstat
(
p_smb
,
p_file
,
&
filestat
);
if
(
i_ret
)
msg_Err
(
p_access
,
"stat failed (%s)"
,
strerror
(
errno
)
);
else
p_access
->
info
.
i_size
=
filestat
.
st_size
;
#else
if
(
smbc_init
(
smb_auth
,
1
)
)
{
free
(
psz_uri
);
return
VLC_EGENERIC
;
}
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
)
);
free
(
psz_uri
);
return
VLC_EGENERIC
;
}
p_access
->
info
.
i_size
=
0
;
i_ret
=
smbc_fstat
(
i_smb
,
&
filestat
);
if
(
i_ret
)
msg_Err
(
p_access
,
"stat failed (%s)"
,
strerror
(
i_ret
)
);
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
;
#else
p_sys
->
i_smb
=
i_smb
;
#endif
/* Update default_pts to a suitable value for smb access */
var_Create
(
p_access
,
"smb-caching"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* 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
;
#ifdef USE_CTX
p_sys
->
p_smb
->
close
(
p_sys
->
p_smb
,
p_sys
->
p_file
);
smbc_free_context
(
p_sys
->
p_smb
,
1
);
#else
smbc_close
(
p_sys
->
i_smb
);
#endif
free
(
p_sys
);
}
/*****************************************************************************
* Seek: try to go at the right place
*****************************************************************************/
static
int
Seek
(
access_t
*
p_access
,
int64_t
i_pos
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
int64_t
i_ret
;
if
(
i_pos
<
0
)
return
VLC_EGENERIC
;
msg_Dbg
(
p_access
,
"seeking to "
I64Fd
,
i_pos
);
#ifdef USE_CTX
i_ret
=
p_sys
->
p_smb
->
lseek
(
p_sys
->
p_smb
,
p_sys
->
p_file
,
i_pos
,
SEEK_SET
);
#else
i_ret
=
smbc_lseek
(
p_sys
->
i_smb
,
i_pos
,
SEEK_SET
);
#endif
if
(
i_ret
==
-
1
)
{
msg_Err
(
p_access
,
"seek failed (%s)"
,
strerror
(
errno
)
);
return
VLC_EGENERIC
;
}
p_access
->
info
.
b_eof
=
VLC_FALSE
;
p_access
->
info
.
i_pos
=
i_ret
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Read:
*****************************************************************************/
static
int
Read
(
access_t
*
p_access
,
uint8_t
*
p_buffer
,
int
i_len
)
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
int
i_read
;
if
(
p_access
->
info
.
b_eof
)
return
0
;
#ifdef USE_CTX
i_read
=
p_sys
->
p_smb
->
read
(
p_sys
->
p_smb
,
p_sys
->
p_file
,
p_buffer
,
i_len
);
#else
i_read
=
smbc_read
(
p_sys
->
i_smb
,
p_buffer
,
i_len
);
#endif
if
(
i_read
<
0
)
{
msg_Err
(
p_access
,
"read failed (%s)"
,
strerror
(
errno
)
);
return
-
1
;
}
if
(
i_read
==
0
)
p_access
->
info
.
b_eof
=
VLC_TRUE
;
else
if
(
i_read
>
0
)
p_access
->
info
.
i_pos
+=
i_read
;
return
i_read
;
}
/*****************************************************************************
* Control:
*****************************************************************************/
static
int
Control
(
access_t
*
p_access
,
int
i_query
,
va_list
args
)
{
vlc_bool_t
*
pb_bool
;
int
*
pi_int
;
int64_t
*
pi_64
;
switch
(
i_query
)
{
case
ACCESS_CAN_SEEK
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_TRUE
;
break
;
case
ACCESS_CAN_FASTSEEK
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_TRUE
;
break
;
case
ACCESS_CAN_PAUSE
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_TRUE
;
break
;
case
ACCESS_CAN_CONTROL_PACE
:
pb_bool
=
(
vlc_bool_t
*
)
va_arg
(
args
,
vlc_bool_t
*
);
*
pb_bool
=
VLC_TRUE
;
break
;
case
ACCESS_GET_MTU
:
pi_int
=
(
int
*
)
va_arg
(
args
,
int
*
);
*
pi_int
=
0
;
break
;
case
ACCESS_GET_PTS_DELAY
:
pi_64
=
(
int64_t
*
)
va_arg
(
args
,
int64_t
*
);
*
pi_64
=
(
int64_t
)
var_GetInteger
(
p_access
,
"smb-caching"
)
*
1000
;
break
;
case
ACCESS_SET_PAUSE_STATE
:
/* Nothing to do */
break
;
case
ACCESS_GET_TITLE_INFO
:
case
ACCESS_SET_TITLE
:
case
ACCESS_SET_SEEKPOINT
:
case
ACCESS_SET_PRIVATE_ID_STATE
:
return
VLC_EGENERIC
;
default:
msg_Warn
(
p_access
,
"unimplemented query in control"
);
return
VLC_EGENERIC
;
}
return
VLC_SUCCESS
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment