diff options
author | Dimitri Staessens <dimitri.staessens@intec.ugent.be> | 2016-03-22 15:27:23 +0100 |
---|---|---|
committer | Dimitri Staessens <dimitri.staessens@intec.ugent.be> | 2016-03-22 15:27:23 +0100 |
commit | eb46e3ddc161c543ea268c54f0c6db40019d25c1 (patch) | |
tree | ad998716754303d8bb791baaa6506835539a01f2 /src/tools | |
parent | 8d2ac4877bb14df8e10d13b61d5db6c5e11d87c3 (diff) | |
parent | 3c6f5161b2903c1bf59bcc959301a7390c3c5c79 (diff) | |
download | ouroboros-eb46e3ddc161c543ea268c54f0c6db40019d25c1.tar.gz ouroboros-eb46e3ddc161c543ea268c54f0c6db40019d25c1.zip |
Merged in sandervrijders/ouroboros/be (pull request #38)
tools: Simple echo application
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/tools/echo/CMakeLists.txt | 16 | ||||
-rw-r--r-- | src/tools/echo/echo.c | 57 | ||||
-rw-r--r-- | src/tools/echo/echo_client.c | 69 | ||||
-rw-r--r-- | src/tools/echo/echo_server.c | 103 | ||||
-rw-r--r-- | src/tools/irm/irm.c | 3 |
6 files changed, 247 insertions, 2 deletions
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 6e00c17b..73b749f8 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -1 +1,2 @@ add_subdirectory(irm) +add_subdirectory(echo) diff --git a/src/tools/echo/CMakeLists.txt b/src/tools/echo/CMakeLists.txt new file mode 100644 index 00000000..b3d88089 --- /dev/null +++ b/src/tools/echo/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + echo.c +) + +add_executable(echo-app ${SOURCE_FILES}) + +target_link_libraries(echo-app LINK_PUBLIC ouroboros) + +install(TARGETS echo-app RUNTIME DESTINATION bin) diff --git a/src/tools/echo/echo.c b/src/tools/echo/echo.c new file mode 100644 index 00000000..849c0ca8 --- /dev/null +++ b/src/tools/echo/echo.c @@ -0,0 +1,57 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <string.h> + +#define SERVER_AP_NAME "echo-server" +#define BUF_SIZE 256 + +#include "echo_client.c" +#include "echo_server.c" + +static void usage() +{ + printf("Usage: echo-app [OPTION]...\n" + "Sends an echo between a server and a client\n\n" + " -l, --listen Run in server mode\n" + " --help Display this help text and exit\n"); +} + +int main(int argc, char ** argv) { + + argc--; + argv++; + while (argc > 0) { + if (strcmp(*argv, "-l") == 0 || + strcmp(*argv, "--listen") == 0) { + return server_main(); + } else { + usage(); + return 0; + } + argc--; + argv++; + } + + return client_main(); +} diff --git a/src/tools/echo/echo_client.c b/src/tools/echo/echo_client.c new file mode 100644 index 00000000..2f80a52a --- /dev/null +++ b/src/tools/echo/echo_client.c @@ -0,0 +1,69 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define CLIENT_AP_NAME "echo-client" + +#include <ouroboros/dev.h> +#include <ouroboros/rina_name.h> + +int client_main() +{ + int fd = 0; + int result = 0; + uint8_t buf[BUF_SIZE]; + char * message = "Client says hi!"; + ssize_t count = 0; + + fd = flow_alloc(SERVER_AP_NAME, NULL, + CLIENT_AP_NAME, NULL, + NULL, 0); + if (fd < 0) { + printf("Failed to allocate flow\n"); + return -1; + } + + result = flow_alloc_res(fd); + if (result < 0) { + printf("Flow allocation refused\n"); + flow_dealloc(fd); + return -1; + } + + if (flow_write(fd, message, strlen(message) + 1) == -1) { + printf("Failed to write SDU\n"); + flow_dealloc(fd); + return -1; + } + + count = flow_read(fd, buf, BUF_SIZE); + if (count < 0) { + printf("Failed to read SDU\n"); + flow_dealloc(fd); + return -1; + } + + printf("Server replied with %.*s\n", (int) count, buf); + + flow_dealloc(fd); + + return 0; +} diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c new file mode 100644 index 00000000..f9682ab7 --- /dev/null +++ b/src/tools/echo/echo_server.c @@ -0,0 +1,103 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdbool.h> +#include <signal.h> +#include <unistd.h> +#include <stdlib.h> + +#include <ouroboros/dev.h> +#include <ouroboros/rina_name.h> + +#define DIF_NAME "*" + +void shutdown_server(int signo) +{ + char * dif = DIF_NAME; + + if (ap_unreg(SERVER_AP_NAME, NULL, &dif, 1)) { + printf("Failed to unregister application\n"); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} + +int server_main() +{ + int server_fd = 0; + int client_fd = 0; + char * dif = DIF_NAME; + char * client_name = NULL; + uint8_t buf[BUF_SIZE]; + ssize_t count = 0; + + printf("Starting the server\n"); + + /* Manual cleanup is required for now */ + if (signal(SIGINT, shutdown_server) == SIG_ERR) { + printf("Can't install signal handler\n"); + return -1; + } + + server_fd = ap_reg(SERVER_AP_NAME, NULL, &dif, 1); + if (server_fd < 0) { + printf("Failed to register application\n"); + return -1; + } + + while (true) { + client_fd = flow_accept(server_fd, + client_name, NULL); + if (client_fd < 0) { + printf("Failed to accept flow\n"); + continue; + } + + printf("New flow from %s", client_name); + + if (flow_alloc_resp(client_fd, 0)) { + printf("Failed to give an allocate response\n"); + flow_dealloc(client_fd); + continue; + } + + count = flow_read(client_fd, buf, BUF_SIZE); + if (count < 0) { + printf("Failed to read SDU\n"); + flow_dealloc(client_fd); + continue; + } + + printf("Message from client is %.*s\n", (int) count, buf); + + if (flow_write(client_fd, buf, count) == -1) { + printf("Failed to write SDU\n"); + flow_dealloc(client_fd); + continue; + } + + flow_dealloc(client_fd); + } + + return 0; +} diff --git a/src/tools/irm/irm.c b/src/tools/irm/irm.c index 426118d1..895d52c2 100644 --- a/src/tools/irm/irm.c +++ b/src/tools/irm/irm.c @@ -73,8 +73,7 @@ static int do_cmd(const char * argv0, return -1; } - -int main (int argc, char ** argv) { +int main(int argc, char ** argv) { if (argc < 2) { usage(); |