From 3c6f5161b2903c1bf59bcc959301a7390c3c5c79 Mon Sep 17 00:00:00 2001
From: Sander Vrijders <sander.vrijders@intec.ugent.be>
Date: Mon, 21 Mar 2016 17:41:29 +0100
Subject: tools: Simple echo application

This adds a simple echo application written to show application how to
use the API. It also updates the dev.h header file with the insights
gained from performing this excercise.
---
 src/tools/echo/CMakeLists.txt |  16 +++++++
 src/tools/echo/echo.c         |  57 +++++++++++++++++++++++
 src/tools/echo/echo_client.c  |  69 ++++++++++++++++++++++++++++
 src/tools/echo/echo_server.c  | 103 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 245 insertions(+)
 create mode 100644 src/tools/echo/CMakeLists.txt
 create mode 100644 src/tools/echo/echo.c
 create mode 100644 src/tools/echo/echo_client.c
 create mode 100644 src/tools/echo/echo_server.c

(limited to 'src/tools/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;
+}
-- 
cgit v1.2.3