From 14500d43760661ffc3ffb67d929088c27fe46c64 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sat, 1 Jan 2011 21:04:17 +0100 Subject: Implemented a simple 'ls' command for the telnet server. --- telnet_connection.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) (limited to 'telnet_connection.cpp') diff --git a/telnet_connection.cpp b/telnet_connection.cpp index e2ea96f..457d1ba 100644 --- a/telnet_connection.cpp +++ b/telnet_connection.cpp @@ -1,12 +1,76 @@ #include "telnet_connection.h" +#include "commands.h" #include +#include +#include +#include + +#include telnet::Connection::Connection(boost::asio::io_service& io_service) : socket(io_service) { } void telnet::Connection::handle_read(const boost::system::error_code& error, size_t bytes_transferred) { - boost::asio::write(socket, buf); + if(error) { + return; + } + + std::string line; + std::istream is(&buf); + std::getline(is, line); + boost::trim(line); + + if(line == "exit") { + return; + } + + std::vector args = parse_args(line); + // no arguments, i.e. empty line + if(!args.size()) { + start(); + return; + } + + std::vector r; + try { + r = commands::execute(args); + } catch(commands::CommandException& ce) { + std::string s(ce.what()); + s += '\n'; + boost::asio::write(socket, boost::asio::buffer(s)); + start(); + return; + } + + for(std::vector::iterator it = r.begin(); it != r.end(); it++) { + boost::asio::write(socket, boost::asio::buffer(*it + "\n")); + } + + start(); +} + +std::vector telnet::Connection::parse_args(std::string& line) { + std::string::const_iterator begin = line.begin(); + std::string::const_iterator end = line.end(); + + boost::regex re("(\")?((?(1)[^\"]|[^ ])+)(?(1)\")"); + boost::match_results what; + boost::match_flag_type flags = boost::match_default; + + std::vector args; + + while(boost::regex_search(begin, end, what, re, flags)) { + std::string s = std::string(what[2].first, what[2].second); + boost::algorithm::trim(s); + // avoid empty strings when parsing multi-word arguments (a "b c") + if(s.size()) { + args.push_back(s); + } + begin = what[0].second; + } + + return args; } void telnet::Connection::start() { -- cgit v1.2.3