[vlc-commits] commit: luatelnet: accept multiple commands seperated by '\n' or '\r'. ( Rémi Duraffort )
git at videolan.org
git at videolan.org
Tue Jul 6 21:18:26 CEST 2010
vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Tue Jul 6 21:16:01 2010 +0200| [f5b8b43a9e210a70e016871db6bab36929d6b866] | committer: Rémi Duraffort
luatelnet: accept multiple commands seperated by '\n' or '\r'.
It was possible with the oldtelnet interface using something like
(echo admin ; echo help) | nc localhost 4212
That's now working with the lua one (but not the cleanest way).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f5b8b43a9e210a70e016871db6bab36929d6b866
---
share/lua/intf/telnet.lua | 59 +++++++++++++++++++++++++++++++++-----------
1 files changed, 44 insertions(+), 15 deletions(-)
diff --git a/share/lua/intf/telnet.lua b/share/lua/intf/telnet.lua
index a72d4b1..da74c61 100644
--- a/share/lua/intf/telnet.lua
+++ b/share/lua/intf/telnet.lua
@@ -183,39 +183,68 @@ while not vlc.misc.should_die() do
-- Handle reads
for _, client in pairs(r) do
- local str = client:recv(1000)
+ local str = string.gsub(client:recv(1000),"\r","\n")
local done = false
- if not str then -- the telnet client program has leave
+
+ -- the telnet client program has leave
+ if not str then
client.buffer = "quit"
done = true
- elseif string.match(str,"\n$") then
- client.buffer = string.gsub(client.buffer..str,"\r?\n$","")
- done = true
+
+ -- Caught a ^D
elseif client.buffer == ""
and ((client.type == host.client_type.stdio and str == "")
or (client.type == host.client_type.net and str == "\004")) then
- -- Caught a ^D
client.buffer = "quit"
done = true
+
+ -- '\n' found: a command was sent
+ elseif string.match(str,"\n") then
+ client.buffer = client.buffer .. str
+ done = true
+
+ -- The command is not finished yet
else
client.buffer = client.buffer .. str
end
+
+ -- Some cleaning for telnet
if client.type == host.client_type.net then
telnet_commands( client )
end
+
+ -- If a command must be parsed
if done then
- if client.status == host.status.password then
- if client.buffer == password then
- client:send( IAC..WONT..ECHO.."\r\nWelcome, Master\r\n" )
- client.buffer = ""
+ -- loop on all commands (might have more than one commands seperated by '\n'
+ local returned_values = ""
+ while not (client.buffer == "") do
+ -- pick the first command
+ local commands = ""
+ if string.find(client.buffer, "\n") then
+ commands = string.sub(client.buffer, string.find(client.buffer, "\n") + 1)
+ client.buffer = string.sub(client.buffer, 0, string.find(client.buffer, "\n") - 1)
+ end
+ local cmd = client.buffer
+
+ if client.status == host.status.password then
+ if client.buffer == password then
+ client:send( IAC..WONT..ECHO.."\r\nWelcome, Master\r\n" )
+ client.buffer = ""
+ client:switch_status( host.status.write )
+ else
+ client:send( "\r\nWrong password\r\nPassword: " )
+ client.buffer = ""
+ end
+ elseif client_command( client ) then
client:switch_status( host.status.write )
- else
- client:send( "\r\nWrong password\r\nPassword: " )
- client.buffer = ""
+ -- special case to exit the loop
+ if cmd == "quit" or cmd == "shutdown" then break end
end
- elseif client_command( client ) then
- client:switch_status( host.status.write )
+ returned_values = returned_values .. client.buffer
+ client.buffer = commands
end
+ vlc.msg.err("end of loop")
+ client.buffer = returned_values
end
end
end
More information about the vlc-commits
mailing list