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
4862094f
Commit
4862094f
authored
Jun 17, 2010
by
Rémi Duraffort
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove the oldtelnet module.
parent
db35e690
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
7 additions
and
610 deletions
+7
-610
NEWS
NEWS
+3
-0
configure.ac
configure.ac
+4
-5
modules/LIST
modules/LIST
+0
-1
modules/control/Modules.am
modules/control/Modules.am
+0
-1
modules/control/telnet.c
modules/control/telnet.c
+0
-603
No files found.
NEWS
View file @
4862094f
...
...
@@ -4,6 +4,9 @@ Changes between 1.1.0 and 1.2.0-git:
Codecs
* You can now use ffmpeg-mt in conjunction with vlc
Interfaces
* The telnet interface has been removed in the favour of the lua one
Video Filter:
* New gradfun filter for debanding videos using dithering
...
...
configure.ac
View file @
4862094f
...
...
@@ -332,7 +332,7 @@ case "${host_os}" in
VLC_ADD_LDFLAGS([vlc],[-mwindows])
VLC_ADD_LIBS([activex mozilla win32text],[-lgdi32])
VLC_ADD_LIBS([cdda vcdx sdl_image aout_sdl vout_sdl],[-lwinmm])
VLC_ADD_LIBS([access_http access_mms access_udp access_tcp access_ftp access_rtmp access_output_udp access_output_shout access_output_rtmp sap oldhttp stream_out_standard stream_out_rtp stream_out_raop vod_rtsp access_realrtsp rtp old
telnet old
rc netsync gnutls growl_udp flac ts audioscrobbler lua remoteosd zvbi audiobargraph_a netsync],[-lws2_32])
VLC_ADD_LIBS([access_http access_mms access_udp access_tcp access_ftp access_rtmp access_output_udp access_output_shout access_output_rtmp sap oldhttp stream_out_standard stream_out_rtp stream_out_raop vod_rtsp access_realrtsp rtp oldrc netsync gnutls growl_udp flac ts audioscrobbler lua remoteosd zvbi audiobargraph_a netsync],[-lws2_32])
VLC_ADD_LIBS([filesystem], [-lshlwapi])
dnl
dnl DEP and ASLR options
...
...
@@ -347,7 +347,7 @@ case "${host_os}" in
fi
if test "${SYS}" = "mingwce"; then
# add ws2 for closesocket, select, recv
VLC_ADD_LIBS([libvlccore access_http access_mms access_udp access_tcp access_ftp access_rtmp access_output_udp access_output_rtmp sap oldhttp netsync audioscrobbler growl rtp stream_out_standard stream_out_rtp remoteosd ts
oldtelnet
audiobargraph_a netsync],[-lws2])
VLC_ADD_LIBS([libvlccore access_http access_mms access_udp access_tcp access_ftp access_rtmp access_output_udp access_output_rtmp sap oldhttp netsync audioscrobbler growl rtp stream_out_standard stream_out_rtp remoteosd ts audiobargraph_a netsync],[-lws2])
VLC_ADD_LIBS([libvlccore],[-lmmtimer])
AC_CHECK_PROGS(U2D, [unix2dos todos], unix2dos)
fi
...
...
@@ -372,9 +372,9 @@ case "${host_os}" in
LDFLAGS_save="${LDFLAGS_save} -lintl"; LDFLAGS="${LDFLAGS_save}"
dnl Check for BONE
if test -f /boot/beos/system/lib/libbind.so; then
VLC_ADD_LIBS([filesystem access_ftp access_mms access_output_udp
oldtelnet
netsync sap libvlccore growl_udp],[-lbind -lsocket])
VLC_ADD_LIBS([filesystem access_ftp access_mms access_output_udp netsync sap libvlccore growl_udp],[-lbind -lsocket])
else
VLC_ADD_LIBS([filesystem access_ftp access_mms access_output_udp
oldtelnet
netsync sap libvlccore growl_udp],[-lnet])
VLC_ADD_LIBS([filesystem access_ftp access_mms access_output_udp netsync sap libvlccore growl_udp],[-lnet])
fi
;;
*)
...
...
@@ -1660,7 +1660,6 @@ AS_IF([test "${enable_vlm}" != "no"], [
AC_MSG_ERROR([VLM requires the stream output. Do not use --disable-sout.])
])
AC_DEFINE(ENABLE_VLM, 1, [Define if you want the VideoLAN manager support])
VLC_ADD_PLUGIN([oldtelnet])
])
AM_CONDITIONAL([ENABLE_VLM], [test "${enable_vlm}" != "no"])
...
...
modules/LIST
View file @
4862094f
...
...
@@ -218,7 +218,6 @@ $Id$
* ogg: input module for OGG decapsulation
* oldhttp: old HTTP remote control webinterface
* oldrc: old interface module using stdio
* oldtelnet: oled Telnet control interface
* omapfb: omap framebuffer video output
* omxil: OpenMAX IL audio/video decoder
* opencv_example: OpenCV example (face identification)
...
...
modules/control/Modules.am
View file @
4862094f
SUBDIRS = http globalhotkeys
SOURCES_gestures = gestures.c
SOURCES_oldtelnet = telnet.c
SOURCES_netsync = netsync.c
SOURCES_ntservice = ntservice.c
SOURCES_hotkeys = hotkeys.c
...
...
modules/control/telnet.c
deleted
100644 → 0
View file @
db35e690
/*****************************************************************************
* telnet.c: VLM interface plugin
*****************************************************************************
* Copyright (C) 2000-2006 the VideoLAN team
* $Id$
*
* Authors: Simon Latapie <garf@videolan.org>
* Laurent Aimar <fenrir@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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_interface.h>
#include <vlc_input.h>
#include <stdbool.h>
#include <errno.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef HAVE_POLL
# include <poll.h>
#endif
#include <vlc_network.h>
#include <vlc_url.h>
#include <vlc_vlm.h>
#define READ_MODE_PWD 1
#define READ_MODE_CMD 2
#define WRITE_MODE_PWD 3 // when we write the word "Password:"
#define WRITE_MODE_CMD 4
/* telnet commands */
#define TEL_WILL 251
#define TEL_WONT 252
#define TEL_DO 253
#define TEL_DONT 254
#define TEL_IAC 255
#define TEL_ECHO 1
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
#define TELNETHOST_TEXT N_( "Host" )
#define TELNETHOST_LONGTEXT N_( "This is the host on which the " \
"interface will listen. It defaults to all network interfaces (0.0.0.0)." \
" If you want this interface to be available only on the local " \
"machine, enter \"127.0.0.1\"." )
#define TELNETPORT_TEXT N_( "Port" )
#define TELNETPORT_LONGTEXT N_( "This is the TCP port on which this " \
"interface will listen. It defaults to 4212." )
#define TELNETPORT_DEFAULT 4212
#define TELNETPWD_TEXT N_( "Password" )
#define TELNETPWD_LONGTEXT N_( "A single administration password is used " \
"to protect this interface. The default value is \"admin\"." )
#define TELNETPWD_DEFAULT "admin"
vlc_module_begin
()
set_shortname
(
"Telnet"
)
set_category
(
CAT_INTERFACE
)
set_subcategory
(
SUBCAT_INTERFACE_CONTROL
)
add_string
(
"telnet-host"
,
"localhost"
,
NULL
,
TELNETHOST_TEXT
,
TELNETHOST_LONGTEXT
,
true
)
add_integer
(
"telnet-port"
,
TELNETPORT_DEFAULT
,
NULL
,
TELNETPORT_TEXT
,
TELNETPORT_LONGTEXT
,
true
)
add_password
(
"telnet-password"
,
TELNETPWD_DEFAULT
,
NULL
,
TELNETPWD_TEXT
,
TELNETPWD_LONGTEXT
,
true
)
set_description
(
N_
(
"VLM remote control interface"
)
)
add_category_hint
(
"VLM"
,
NULL
,
false
)
set_capability
(
"interface"
,
0
)
set_callbacks
(
Open
,
Close
)
vlc_module_end
()
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static
void
Run
(
intf_thread_t
*
);
typedef
struct
{
int
i_mode
;
/* read or write */
int
fd
;
char
buffer_read
[
1000
];
// 1000 byte per command should be sufficient
char
*
buffer_write
;
char
*
p_buffer_read
;
char
*
p_buffer_write
;
// the position in the buffer
int
i_buffer_write
;
// the number of byte we still have to send
int
i_tel_cmd
;
// for specific telnet commands
}
telnet_client_t
;
static
char
*
MessageToString
(
vlm_message_t
*
,
int
);
static
void
Write_message
(
telnet_client_t
*
,
vlm_message_t
*
,
const
char
*
,
int
);
struct
intf_sys_t
{
telnet_client_t
**
clients
;
int
i_clients
;
int
*
pi_fd
;
vlm_t
*
mediatheque
;
};
/*
* getPort: Decide which port to use. There are two possibilities to
* specify a port: integrated in the --telnet-host option with :PORT
* or using the --telnet-port option. The --telnet-port option has
* precedence.
* This code relies upon the fact the url.i_port is 0 if the :PORT
* option is missing from --telnet-host.
*/
static
int
getPort
(
intf_thread_t
*
p_intf
,
const
vlc_url_t
*
url
,
int
i_port
)
{
if
(
i_port
==
TELNETPORT_DEFAULT
&&
url
->
i_port
!=
0
)
i_port
=
url
->
i_port
;
if
(
url
->
i_port
!=
0
&&
url
->
i_port
!=
i_port
)
// Print error if two different ports have been specified
msg_Warn
(
p_intf
,
"ignoring port %d (using %d)"
,
url
->
i_port
,
i_port
);
return
i_port
;
}
/*****************************************************************************
* Open: initialize dummy interface
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
vlm_t
*
mediatheque
;
char
*
psz_address
;
vlc_url_t
url
;
int
i_telnetport
;
if
(
!
(
mediatheque
=
vlm_New
(
p_intf
))
)
{
msg_Err
(
p_intf
,
"cannot start VLM"
);
return
VLC_EGENERIC
;
}
msg_Info
(
p_intf
,
"using the VLM interface plugin..."
);
i_telnetport
=
var_InheritInteger
(
p_intf
,
"telnet-port"
);
psz_address
=
var_InheritString
(
p_intf
,
"telnet-host"
);
vlc_UrlParse
(
&
url
,
psz_address
,
0
);
free
(
psz_address
);
// There might be two ports given, resolve any potentially
// conflict
url
.
i_port
=
getPort
(
p_intf
,
&
url
,
i_telnetport
);
p_intf
->
p_sys
=
malloc
(
sizeof
(
intf_sys_t
)
);
if
(
!
p_intf
->
p_sys
)
{
vlm_Delete
(
mediatheque
);
vlc_UrlClean
(
&
url
);
return
VLC_ENOMEM
;
}
if
(
(
p_intf
->
p_sys
->
pi_fd
=
net_ListenTCP
(
p_intf
,
url
.
psz_host
,
url
.
i_port
)
)
==
NULL
)
{
msg_Err
(
p_intf
,
"cannot listen for telnet"
);
vlm_Delete
(
mediatheque
);
vlc_UrlClean
(
&
url
);
free
(
p_intf
->
p_sys
);
return
VLC_EGENERIC
;
}
msg_Info
(
p_intf
,
"telnet interface started on interface %s %d"
,
url
.
psz_host
,
url
.
i_port
);
p_intf
->
p_sys
->
i_clients
=
0
;
p_intf
->
p_sys
->
clients
=
NULL
;
p_intf
->
p_sys
->
mediatheque
=
mediatheque
;
p_intf
->
pf_run
=
Run
;
vlc_UrlClean
(
&
url
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Close:
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
int
i
;
for
(
i
=
0
;
i
<
p_sys
->
i_clients
;
i
++
)
{
telnet_client_t
*
cl
=
p_sys
->
clients
[
i
];
net_Close
(
cl
->
fd
);
free
(
cl
->
buffer_write
);
free
(
cl
);
}
free
(
p_sys
->
clients
);
net_ListenClose
(
p_sys
->
pi_fd
);
vlm_Delete
(
p_sys
->
mediatheque
);
free
(
p_sys
);
}
/*****************************************************************************
* Run: main loop
*****************************************************************************/
static
void
Run
(
intf_thread_t
*
p_intf
)
{
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
char
*
psz_password
;
unsigned
nlisten
=
0
;
for
(
const
int
*
pfd
=
p_sys
->
pi_fd
;
*
pfd
!=
-
1
;
pfd
++
)
nlisten
++
;
/* How many listening sockets do we have? */
/* FIXME: make sure config_* is cancel-safe */
psz_password
=
var_InheritString
(
p_intf
,
"telnet-password"
);
vlc_cleanup_push
(
free
,
psz_password
);
for
(
;;
)
{
unsigned
ncli
=
p_sys
->
i_clients
;
struct
pollfd
ufd
[
ncli
+
nlisten
];
for
(
unsigned
i
=
0
;
i
<
ncli
;
i
++
)
{
telnet_client_t
*
cl
=
p_sys
->
clients
[
i
];
ufd
[
i
].
fd
=
cl
->
fd
;
if
(
(
cl
->
i_mode
==
WRITE_MODE_PWD
)
||
(
cl
->
i_mode
==
WRITE_MODE_CMD
)
)
ufd
[
i
].
events
=
POLLOUT
;
else
ufd
[
i
].
events
=
POLLIN
;
ufd
[
i
].
revents
=
0
;
}
for
(
unsigned
i
=
0
;
i
<
nlisten
;
i
++
)
{
ufd
[
ncli
+
i
].
fd
=
p_sys
->
pi_fd
[
i
];
ufd
[
ncli
+
i
].
events
=
POLLIN
;
ufd
[
ncli
+
i
].
revents
=
0
;
}
switch
(
poll
(
ufd
,
sizeof
(
ufd
)
/
sizeof
(
ufd
[
0
]),
-
1
))
{
case
-
1
:
if
(
net_errno
!=
EINTR
)
{
msg_Err
(
p_intf
,
"network poll error"
);
#ifndef WIN32
pause
();
/* We are screwed! */
#else
abort
();
/* We are even more screwed! (no pause() in win32) */
#endif
break
;
}
case
0
:
continue
;
}
int
canc
=
vlc_savecancel
();
/* check if there is something to do with the socket */
for
(
unsigned
i
=
0
;
i
<
ncli
;
i
++
)
{
telnet_client_t
*
cl
=
p_sys
->
clients
[
i
];
if
(
ufd
[
i
].
revents
&
(
POLLERR
|
POLLHUP
))
{
drop:
net_Close
(
cl
->
fd
);
TAB_REMOVE
(
p_intf
->
p_sys
->
i_clients
,
p_intf
->
p_sys
->
clients
,
cl
);
free
(
cl
->
buffer_write
);
free
(
cl
);
continue
;
}
if
(
ufd
[
i
].
revents
&
POLLOUT
&&
(
cl
->
i_buffer_write
>
0
))
{
ssize_t
i_len
;
i_len
=
send
(
cl
->
fd
,
cl
->
p_buffer_write
,
cl
->
i_buffer_write
,
0
);
if
(
i_len
>
0
)
{
cl
->
p_buffer_write
+=
i_len
;
cl
->
i_buffer_write
-=
i_len
;
}
}
if
(
ufd
[
i
].
revents
&
POLLIN
)
{
bool
end
=
false
;
ssize_t
i_recv
;
while
(
((
i_recv
=
recv
(
cl
->
fd
,
cl
->
p_buffer_read
,
1
,
0
))
>
0
)
&&
((
cl
->
p_buffer_read
-
cl
->
buffer_read
)
<
999
)
)
{
switch
(
cl
->
i_tel_cmd
)
{
case
0
:
switch
(
*
(
uint8_t
*
)
cl
->
p_buffer_read
)
{
case
'\r'
:
break
;
case
'\n'
:
*
cl
->
p_buffer_read
=
'\n'
;
end
=
true
;
break
;
case
TEL_IAC
:
// telnet specific command
cl
->
i_tel_cmd
=
1
;
cl
->
p_buffer_read
++
;
break
;
default:
cl
->
p_buffer_read
++
;
break
;
}
break
;
case
1
:
switch
(
*
(
uint8_t
*
)
cl
->
p_buffer_read
)
{
case
TEL_WILL
:
case
TEL_WONT
:
case
TEL_DO
:
case
TEL_DONT
:
cl
->
i_tel_cmd
++
;
cl
->
p_buffer_read
++
;
break
;
default:
cl
->
i_tel_cmd
=
0
;
cl
->
p_buffer_read
--
;
break
;
}
break
;
case
2
:
cl
->
i_tel_cmd
=
0
;
cl
->
p_buffer_read
-=
2
;
break
;
}
if
(
end
)
break
;
}
if
(
(
cl
->
p_buffer_read
-
cl
->
buffer_read
)
==
999
)
{
Write_message
(
cl
,
NULL
,
"Line too long
\r\n
"
,
cl
->
i_mode
+
2
);
}
#ifdef WIN32
if
(
i_recv
<=
0
&&
WSAGetLastError
()
==
WSAEWOULDBLOCK
)
{
errno
=
EAGAIN
;
}
#endif
if
(
i_recv
==
0
||
(
i_recv
==
-
1
&&
(
end
||
errno
!=
EAGAIN
)
)
)
goto
drop
;
}
}
/* and now we should bidouille the data we received / send */
for
(
int
i
=
0
;
i
<
p_sys
->
i_clients
;
i
++
)
{
telnet_client_t
*
cl
=
p_sys
->
clients
[
i
];
if
(
cl
->
i_mode
>=
WRITE_MODE_PWD
&&
cl
->
i_buffer_write
==
0
)
{
// we have finished to send
cl
->
i_mode
-=
2
;
// corresponding READ MODE
}
else
if
(
cl
->
i_mode
==
READ_MODE_PWD
&&
*
cl
->
p_buffer_read
==
'\n'
)
{
*
cl
->
p_buffer_read
=
'\0'
;
if
(
!
psz_password
||
!
strcmp
(
psz_password
,
cl
->
buffer_read
)
)
{
Write_message
(
cl
,
NULL
,
"
\xff\xfc\x01\r\n
Welcome, "
"Master
\r\n
> "
,
WRITE_MODE_CMD
);
}
else
{
/* wrong password */
Write_message
(
cl
,
NULL
,
"
\r\n
Wrong password.
\r\n
Password: "
,
WRITE_MODE_PWD
);
}
}
else
if
(
cl
->
i_mode
==
READ_MODE_CMD
&&
*
cl
->
p_buffer_read
==
'\n'
)
{
/* ok, here is a command line */
if
(
!
strncmp
(
cl
->
buffer_read
,
"logout"
,
6
)
||
!
strncmp
(
cl
->
buffer_read
,
"quit"
,
4
)
||
!
strncmp
(
cl
->
buffer_read
,
"exit"
,
4
)
)
{
net_Close
(
cl
->
fd
);
TAB_REMOVE
(
p_intf
->
p_sys
->
i_clients
,
p_intf
->
p_sys
->
clients
,
cl
);
free
(
cl
->
buffer_write
);
free
(
cl
);
}
else
if
(
!
strncmp
(
cl
->
buffer_read
,
"shutdown"
,
8
)
)
{
msg_Err
(
p_intf
,
"shutdown requested"
);
libvlc_Quit
(
p_intf
->
p_libvlc
);
}
else
if
(
*
cl
->
buffer_read
==
'@'
&&
strchr
(
cl
->
buffer_read
,
' '
)
)
{
/* Module specific commands (use same syntax as in the
* rc interface) */
char
*
psz_name
=
cl
->
buffer_read
+
1
;
char
*
psz_cmd
,
*
psz_arg
,
*
psz_msg
;
int
i_ret
;
psz_cmd
=
strchr
(
cl
->
buffer_read
,
' '
);
*
psz_cmd
=
'\0'
;
psz_cmd
++
;
if
(
(
psz_arg
=
strchr
(
psz_cmd
,
'\n'
)
)
)
*
psz_arg
=
'\0'
;
if
(
(
psz_arg
=
strchr
(
psz_cmd
,
'\r'
)
)
)
*
psz_arg
=
'\0'
;
if
(
(
psz_arg
=
strchr
(
psz_cmd
,
' '
)
)
&&
*
psz_arg
)
{
*
psz_arg
=
'\0'
;
psz_arg
++
;
}
i_ret
=
var_Command
(
p_intf
,
psz_name
,
psz_cmd
,
psz_arg
,
&
psz_msg
);
if
(
psz_msg
)
{
vlm_message_t
*
message
;
message
=
vlm_MessageNew
(
"Module command"
,
"%s"
,
psz_msg
);
Write_message
(
cl
,
message
,
NULL
,
WRITE_MODE_CMD
);
vlm_MessageDelete
(
message
);
free
(
psz_msg
);
}
}
else
{
vlm_message_t
*
message
;
/* create a standard string */
*
cl
->
p_buffer_read
=
'\0'
;
vlm_ExecuteCommand
(
p_sys
->
mediatheque
,
cl
->
buffer_read
,
&
message
);
if
(
!
strncmp
(
cl
->
buffer_read
,
"help"
,
4
)
)
{
vlm_message_t
*
p_my_help
=
vlm_MessageSimpleNew
(
"Telnet Specific Commands:"
);
vlm_MessageAdd
(
p_my_help
,
vlm_MessageSimpleNew
(
"logout, quit, exit"
)
);
vlm_MessageAdd
(
p_my_help
,
vlm_MessageSimpleNew
(
"shutdown"
)
);
vlm_MessageAdd
(
p_my_help
,
vlm_MessageSimpleNew
(
"@moduleinstance command argument"
)
);
vlm_MessageAdd
(
message
,
p_my_help
);
}
Write_message
(
cl
,
message
,
NULL
,
WRITE_MODE_CMD
);
vlm_MessageDelete
(
message
);
}
}
}
/* handle new connections */
for
(
unsigned
i
=
0
;
i
<
nlisten
;
i
++
)
{
int
fd
;
if
(
ufd
[
ncli
+
i
].
revents
==
0
)
continue
;
fd
=
net_AcceptSingle
(
VLC_OBJECT
(
p_intf
),
ufd
[
ncli
+
i
].
fd
);
if
(
fd
==
-
1
)
continue
;
telnet_client_t
*
cl
=
calloc
(
1
,
sizeof
(
telnet_client_t
));
if
(
cl
==
NULL
)
{
net_Close
(
fd
);
continue
;
}
cl
->
i_tel_cmd
=
0
;
cl
->
fd
=
fd
;
cl
->
buffer_write
=
NULL
;
cl
->
p_buffer_write
=
cl
->
buffer_write
;
Write_message
(
cl
,
NULL
,
"Password:
\xff\xfb\x01
"
,
WRITE_MODE_PWD
);
TAB_APPEND
(
p_sys
->
i_clients
,
p_sys
->
clients
,
cl
);
}
vlc_restorecancel
(
canc
);
}
vlc_cleanup_run
();
}
static
void
Write_message
(
telnet_client_t
*
client
,
vlm_message_t
*
message
,
const
char
*
string_message
,
int
i_mode
)
{
char
*
psz_message
;
client
->
p_buffer_read
=
client
->
buffer_read
;
(
client
->
p_buffer_read
)[
0
]
=
0
;
// if (cl->p_buffer_read)[0] = '\n'
free
(
client
->
buffer_write
);
/* generate the psz_message string */
if
(
message
)
{
/* ok, look for vlm_message_t */
psz_message
=
MessageToString
(
message
,
0
);
}
else
{
/* it is a basic string_message */
psz_message
=
strdup
(
string_message
);
}
client
->
buffer_write
=
client
->
p_buffer_write
=
psz_message
;
client
->
i_buffer_write
=
strlen
(
psz_message
);
client
->
i_mode
=
i_mode
;
}
/* We need the level of the message to put a beautiful indentation.
* first level is 0 */
static
char
*
MessageToString
(
vlm_message_t
*
message
,
int
i_level
)
{
#define STRING_CR "\r\n"
#define STRING_TAIL "> "
char
*
psz_message
;
int
i
,
i_message
=
sizeof
(
STRING_TAIL
);
if
(
!
message
||
!
message
->
psz_name
)
{
return
strdup
(
STRING_CR
STRING_TAIL
);
}
else
if
(
!
i_level
&&
!
message
->
i_child
&&
!
message
->
psz_value
)
{
/* A command is successful. Don't write anything */
return
strdup
(
/*STRING_CR*/
STRING_TAIL
);
}
i_message
+=
strlen
(
message
->
psz_name
)
+
i_level
*
sizeof
(
" "
)
+
1
;
psz_message
=
xmalloc
(
i_message
);
*
psz_message
=
0
;
for
(
i
=
0
;
i
<
i_level
;
i
++
)
strcat
(
psz_message
,
" "
);
strcat
(
psz_message
,
message
->
psz_name
);
if
(
message
->
psz_value
)
{
i_message
+=
sizeof
(
" : "
)
+
strlen
(
message
->
psz_value
)
+
sizeof
(
STRING_CR
);
psz_message
=
xrealloc
(
psz_message
,
i_message
);
strcat
(
psz_message
,
" : "
);
strcat
(
psz_message
,
message
->
psz_value
);
strcat
(
psz_message
,
STRING_CR
);
}
else
{
i_message
+=
sizeof
(
STRING_CR
);
psz_message
=
xrealloc
(
psz_message
,
i_message
);
strcat
(
psz_message
,
STRING_CR
);
}
for
(
i
=
0
;
i
<
message
->
i_child
;
i
++
)
{
char
*
child_message
=
MessageToString
(
message
->
child
[
i
],
i_level
+
1
);
i_message
+=
strlen
(
child_message
);
psz_message
=
xrealloc
(
psz_message
,
i_message
);
strcat
(
psz_message
,
child_message
);
free
(
child_message
);
}
if
(
i_level
==
0
)
strcat
(
psz_message
,
STRING_TAIL
);
return
psz_message
;
}
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