1 #include "slp.hpp" 2 #include "slp_meta.hpp" 3 #include "slp_server.hpp" 4 #include "sock_channel.hpp" 5 6 #include <algorithm> 7 #include <iomanip> 8 9 /* Call Back for the sd event loop */ 10 static int requestHandler(sd_event_source* /*es*/, int fd, uint32_t /*revents*/, 11 void* /*userdata*/) 12 { 13 int rc = slp::SUCCESS; 14 timeval tv{slp::TIMEOUT, 0}; 15 udpsocket::Channel channel(fd, tv); 16 std::vector<uint8_t> recvBuff; 17 slp::Message req; 18 std::vector<uint8_t> resp; 19 // Read the packet 20 std::tie(rc, recvBuff) = channel.read(); 21 22 if (rc < 0) 23 { 24 std::cerr << "SLP Error in Read : " << std::hex << rc << "\n"; 25 return rc; 26 } 27 28 switch (recvBuff[0]) 29 { 30 case slp::VERSION_2: 31 { 32 // Parse the buffer and construct the req object 33 std::tie(rc, req) = slp::parser::parseBuffer(recvBuff); 34 if (!rc) 35 { 36 // Passing the req object to handler to serve it 37 std::tie(rc, resp) = slp::handler::processRequest(req); 38 } 39 break; 40 } 41 default: 42 std::cout << "SLP Unsupported Request Version=" << (int)recvBuff[0] 43 << "\n"; 44 45 rc = static_cast<uint8_t>(slp::Error::VER_NOT_SUPPORTED); 46 break; 47 } 48 49 // if there was error during Parsing of request 50 // or processing of request then handle the error. 51 if (rc) 52 { 53 resp = slp::handler::processError(req, rc); 54 } 55 56 channel.write(resp); 57 return slp::SUCCESS; 58 } 59 60 int main() 61 { 62 slp::udp::Server svr(slp::PORT, requestHandler); 63 return svr.run(); 64 } 65