From: RĂ©mi Duraffort Date: Tue, 6 Jul 2010 19:16:01 +0000 (+0200) Subject: luatelnet: accept multiple commands seperated by '\n' or '\r'. X-Git-Tag: 1.2.0-pre1~5935 X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=f5b8b43a9e210a70e016871db6bab36929d6b866 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). --- diff --git a/share/lua/intf/telnet.lua b/share/lua/intf/telnet.lua index a72d4b1790..da74c6183a 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