From 521f5b79123aa5067f1a45c56bd2521155ec7edf Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 3 Sep 2016 22:30:37 +0200 Subject: [PATCH] Complete ping program --- programs/ping/src/main.cpp | 40 ++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/programs/ping/src/main.cpp b/programs/ping/src/main.cpp index f299fdb8..74ada11b 100644 --- a/programs/ping/src/main.cpp +++ b/programs/ping/src/main.cpp @@ -14,22 +14,54 @@ namespace { } // end of anonymous namespace -int main(int argc, char* argv[]){ - if(argc != 2){ +int main(int argc, char* argv[]) { + if (argc != 2) { tlib::print_line("usage: ping address_ip"); return 1; } - std::string ip(argv[0]); + std::string ip(argv[1]); + auto ip_parts = std::split(ip, '.'); + + if (ip_parts.size() != 4) { + tlib::print_line("Invalid address IP"); + return 1; + } auto socket = tlib::socket_open(tlib::socket_domain::AF_INET, tlib::socket_type::RAW, tlib::socket_protocol::ICMP); - if(!socket){ + if (!socket) { tlib::printf("ls: socket_open error: %s\n", std::error_message(socket.error())); return 1; } + tlib::icmp::packet_descriptor desc; + desc.payload_size = 0; + desc.target_ip = tlib::ip::make_address(std::atoui(ip_parts[0]), std::atoui(ip_parts[1]), std::atoui(ip_parts[2]), std::atoui(ip_parts[3])); + desc.type = tlib::icmp::type::ECHO_REQUEST; + desc.code = 0; + + auto packet = tlib::prepare_packet(*socket, &desc); + + if (!packet) { + tlib::printf("ping: prepare_packet error: %s\n", std::error_message(packet.error())); + return 1; + } + + auto* command_header = reinterpret_cast(packet->payload + packet->index); + + command_header->identifier = 0x666; + command_header->sequence = 0x1; + + auto status = tlib::finalize_packet(*socket, *packet); + if (!status) { + tlib::printf("ping: finalize_packet error: %s\n", std::error_message(status.error())); + return 1; + } + tlib::socket_close(*socket); + //TODO Wait for replies + return 0; }