Commit 55f877f0 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Implement root wrapper to allow using privileged TCP ports

while not running the whole VLC as root - closes #440
parent a21fa225
...@@ -69,7 +69,7 @@ dist_pkginclude_HEADERS = \ ...@@ -69,7 +69,7 @@ dist_pkginclude_HEADERS = \
include/vlc/input.h \ include/vlc/input.h \
include/vlc/intf.h \ include/vlc/intf.h \
include/vlc/control.h \ include/vlc/control.h \
include/vlc/control_structures.h \ include/vlc/control_structures.h \
$(NULL) $(NULL)
noinst_HEADERS = $(HEADERS_include) noinst_HEADERS = $(HEADERS_include)
...@@ -446,6 +446,7 @@ SOURCES_libvlc_common = \ ...@@ -446,6 +446,7 @@ SOURCES_libvlc_common = \
src/network/tcp.c \ src/network/tcp.c \
src/network/udp.c \ src/network/udp.c \
src/network/httpd.c \ src/network/httpd.c \
src/network/rootwrap.c \
src/network/tls.c \ src/network/tls.c \
src/misc/charset.c \ src/misc/charset.c \
src/misc/md5.c \ src/misc/md5.c \
......
This diff is collapsed.
...@@ -50,6 +50,8 @@ static int SocksHandshakeTCP( vlc_object_t *, ...@@ -50,6 +50,8 @@ static int SocksHandshakeTCP( vlc_object_t *,
const char *psz_host, int i_port ); const char *psz_host, int i_port );
extern int net_Socket( vlc_object_t *p_this, int i_family, int i_socktype, extern int net_Socket( vlc_object_t *p_this, int i_family, int i_socktype,
int i_protocol ); int i_protocol );
extern int rootwrap_bind (int family, int socktype, int protocol,
const struct sockaddr *addr, size_t alen);
/***************************************************************************** /*****************************************************************************
* __net_ConnectTCP: * __net_ConnectTCP:
...@@ -302,13 +304,30 @@ int *__net_ListenTCP( vlc_object_t *p_this, const char *psz_host, int i_port ) ...@@ -302,13 +304,30 @@ int *__net_ListenTCP( vlc_object_t *p_this, const char *psz_host, int i_port )
{ {
#if defined(WIN32) || defined(UNDER_CE) #if defined(WIN32) || defined(UNDER_CE)
msg_Warn( p_this, "cannot bind socket (%i)", WSAGetLastError( ) ); msg_Warn( p_this, "cannot bind socket (%i)", WSAGetLastError( ) );
#else
msg_Warn( p_this, "cannot bind socket (%s)", strerror( errno ) );
#endif
net_Close( fd ); net_Close( fd );
continue; continue;
#else
int saved_errno;
saved_errno = errno;
net_Close( fd );
fd = rootwrap_bind( ptr->ai_family, ptr->ai_socktype,
ptr->ai_protocol, ptr->ai_addr,
ptr->ai_addrlen );
if( fd != -1 )
{
msg_Dbg( p_this, "got socket %d from rootwrap", fd );
}
else
{
msg_Warn( p_this, "cannot bind socket (%s)",
strerror( saved_errno ) );
continue;
}
#endif
} }
msg_Dbg( p_this, "using socket %d from rootwrap", fd );
/* Listen */ /* Listen */
if( listen( fd, 100 ) == -1 ) if( listen( fd, 100 ) == -1 )
{ {
......
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
static void SigHandler ( int i_signal ); static void SigHandler ( int i_signal );
#endif #endif
extern void rootwrap( void );
/***************************************************************************** /*****************************************************************************
* main: parse command line, start interface and spawn threads. * main: parse command line, start interface and spawn threads.
*****************************************************************************/ *****************************************************************************/
...@@ -73,6 +75,8 @@ int main( int i_argc, char *ppsz_argv[] ) ...@@ -73,6 +75,8 @@ int main( int i_argc, char *ppsz_argv[] )
} }
#endif #endif
rootwrap ();
/* Create a libvlc structure */ /* Create a libvlc structure */
i_ret = VLC_Create(); i_ret = VLC_Create();
if( i_ret < 0 ) if( i_ret < 0 )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment