diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-08-21 21:12:03 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-08-21 21:12:03 +0200 |
commit | f0d4305c067044e74c44032c32ce6c4db3c6fffa (patch) | |
tree | d895b25fb5a8f7af106c6c2d3228b62ade81b3b4 /src/tools | |
parent | ba27593e3e8406e109393ae383f17c7416675c1e (diff) | |
parent | cee5ae97ee14438b2dabc06bfad9b02e42e4d816 (diff) | |
download | ouroboros-f0d4305c067044e74c44032c32ce6c4db3c6fffa.tar.gz ouroboros-f0d4305c067044e74c44032c32ce6c4db3c6fffa.zip |
Merged in dstaesse/ouroboros/be-irmd-refactor (pull request #213)
irmd, lib: Rebuild the IRMd data model
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/cbr/cbr.c | 16 | ||||
-rw-r--r-- | src/tools/cbr/cbr_server.c | 5 | ||||
-rw-r--r-- | src/tools/echo/echo.c | 24 | ||||
-rw-r--r-- | src/tools/echo/echo_server.c | 5 | ||||
-rw-r--r-- | src/tools/irm/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/tools/irm/irm.c | 4 | ||||
-rw-r--r-- | src/tools/irm/irm_bind.c | 87 | ||||
-rw-r--r-- | src/tools/irm/irm_bind_ap.c | 98 | ||||
-rw-r--r-- | src/tools/irm/irm_bind_api.c | 68 | ||||
-rw-r--r-- | src/tools/irm/irm_ipcp.c | 2 | ||||
-rw-r--r-- | src/tools/irm/irm_ops.h | 10 | ||||
-rw-r--r-- | src/tools/irm/irm_unbind.c | 58 | ||||
-rw-r--r-- | src/tools/irm/irm_unbind_ap.c | 68 | ||||
-rw-r--r-- | src/tools/irm/irm_unbind_api.c | 69 | ||||
-rw-r--r-- | src/tools/oping/oping.c | 17 | ||||
-rw-r--r-- | src/tools/oping/oping_server.c | 13 |
16 files changed, 437 insertions, 113 deletions
diff --git a/src/tools/cbr/cbr.c b/src/tools/cbr/cbr.c index 65783119..e42492df 100644 --- a/src/tools/cbr/cbr.c +++ b/src/tools/cbr/cbr.c @@ -72,14 +72,10 @@ int main(int argc, char ** argv) int ret = 0; char * rem = NULL; char * s_apn = NULL; + char ** argv_dup = argv; bool server = false; - if (ap_init(argv[0]) < 0) { - printf("Failed to init.\n"); - exit(EXIT_FAILURE); - } - server_settings.interval = 1; /* One second reporting interval */ server_settings.timeout = 1; @@ -133,8 +129,18 @@ int main(int argc, char ** argv) } if (server) { + if (ap_init(argv_dup[0]) < 0) { + printf("Failed to init.\n"); + exit(EXIT_FAILURE); + } + ret = server_main(); } else { + if (ap_init(NULL) < 0) { + printf("Failed to init.\n"); + exit(EXIT_FAILURE); + } + if (s_apn == NULL) { printf("No server specified.\n"); usage(); diff --git a/src/tools/cbr/cbr_server.c b/src/tools/cbr/cbr_server.c index d0666551..8eff4a4c 100644 --- a/src/tools/cbr/cbr_server.c +++ b/src/tools/cbr/cbr_server.c @@ -219,11 +219,6 @@ int server_main() return -1; } - if (api_bind(NULL) < 0) { - printf("Failed to bind the server api."); - return -1; - } - for (i = 0; i < THREADS_SIZE; i++) pthread_create(&threads[i], NULL, worker, NULL); diff --git a/src/tools/echo/echo.c b/src/tools/echo/echo.c index ab7d5557..28ae4c1a 100644 --- a/src/tools/echo/echo.c +++ b/src/tools/echo/echo.c @@ -41,19 +41,15 @@ static void usage() int main(int argc, char ** argv) { int ret = -1; - if (ap_init(argv[0])) { - printf("Failed to init AP.\n"); - return -1; - } + char ** argv_dup = argv; + bool server = false; argc--; argv++; while (argc > 0) { if (strcmp(*argv, "-l") == 0 || strcmp(*argv, "--listen") == 0) { - ret = server_main(); - ap_fini(); - return ret; + server = true; } else { usage(); return 0; @@ -62,7 +58,19 @@ int main(int argc, char ** argv) argv++; } - ret = client_main(); + if (server) { + if (ap_init(argv_dup[0])) { + printf("Failed to init AP.\n"); + return -1; + } + ret = server_main(); + } else { + if (ap_init(NULL)) { + printf("Failed to init AP.\n"); + return -1; + } + ret = client_main(); + } ap_fini(); diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c index 3106ee35..e6ab9cfd 100644 --- a/src/tools/echo/echo_server.c +++ b/src/tools/echo/echo_server.c @@ -39,11 +39,6 @@ int server_main() char buf[BUF_SIZE]; ssize_t count = 0; - if (api_bind(NULL) < 0) { - printf("Failed to bind the server api."); - return -1; - } - printf("Starting the server.\n"); /* Manual cleanup is required for now */ diff --git a/src/tools/irm/CMakeLists.txt b/src/tools/irm/CMakeLists.txt index 68297615..f59d9af0 100644 --- a/src/tools/irm/CMakeLists.txt +++ b/src/tools/irm/CMakeLists.txt @@ -7,10 +7,16 @@ include_directories(${CMAKE_BINARY_DIR}/include) set(SOURCE_FILES # Add source files here irm.c + irm_bind_ap.c + irm_bind_api.c + irm_bind_ipcp.c irm_ipcp_create.c irm_ipcp_destroy.c irm_ipcp_bootstrap.c irm_ipcp_enroll.c + irm_unbind_ap.c + irm_unbind_api.c + irm_unbind_ipcp.c irm_unbind.c irm_bind.c irm_ipcp.c diff --git a/src/tools/irm/irm.c b/src/tools/irm/irm.c index 14420207..c260feb9 100644 --- a/src/tools/irm/irm.c +++ b/src/tools/irm/irm.c @@ -46,8 +46,8 @@ static const struct cmd { int (* func)(int argc, char ** argv); } cmds[] = { { "ipcp", ipcp_cmd }, - { "bind", do_bind }, - { "unbind", do_unbind }, + { "bind", bind_cmd }, + { "unbind", unbind_cmd }, { "register", do_register }, { "unregister", do_unregister }, { "help", do_help }, diff --git a/src/tools/irm/irm_bind.c b/src/tools/irm/irm_bind.c index 061aeef5..9b37e800 100644 --- a/src/tools/irm/irm_bind.c +++ b/src/tools/irm/irm_bind.c @@ -1,8 +1,9 @@ /* * Ouroboros - Copyright (C) 2016 * - * Bind AP to a name + * Bind names in the processing system * + * Dimitri Staessens <dimitri.staessens@intec.ugent.be> * Sander Vrijders <sander.vrijders@intec.ugent.be> * * This program is free software; you can redistribute it and/or modify @@ -21,75 +22,57 @@ */ #include <stdio.h> -#include <string.h> #include <ouroboros/irm.h> -#include <ouroboros/errno.h> #include "irm_ops.h" #include "irm_utils.h" static void usage() { - printf("Usage: irm bind\n" - " name <name>\n" - " apn <application process name>\n" - " [auto] (instantiate apn if not running)\n" - " [unique] (there can only be one instantiation)\n" - " [-- <application arguments>]\n"); + printf("Usage: irm bind [OPERATION]\n" + "where OPERATION = {ap api ipcp help}\n"); } - -int do_bind(int argc, char ** argv) +static int do_help(int argc, char **argv) { - char * name = NULL; - char * ap_name = NULL; - uint16_t flags = 0; - int ret = 0; + usage(); + return 0; +} - while (argc > 0) { - if (matches(*argv, "name") == 0) { - name = *(argv + 1); - ++argv; - --argc; - } else if (matches(*argv, "apn") == 0) { - ap_name = *(argv + 1); - ++argv; - --argc; - } else if (strcmp(*argv, "auto") == 0) { - flags |= BIND_AP_AUTO; - } else if (strcmp(*argv, "unique") == 0) { - flags |= BIND_AP_UNIQUE; - } else if (strcmp(*argv, "--") == 0) { - ++argv; - --argc; - break; - } else { - printf("\"%s\" is unknown, try \"irm " - "bind\".\n", *argv); - return -1; - } +static const struct cmd { + const char * cmd; + int (* func)(int argc, char ** argv); +} cmds[] = { + { "ap", do_bind_ap }, + { "api", do_bind_api }, + { "ipcp", do_bind_ipcp }, + { "help", do_help }, + { 0 } +}; - ++argv; - --argc; - } +static int do_cmd(const char * argv0, + int argc, + char ** argv) +{ + const struct cmd * c; - if (name == NULL || ap_name == NULL) { - usage(); - return -1; + for (c = cmds; c->cmd; ++c) { + if (!matches(argv0, c->cmd)) + return c->func(argc, argv); } - ret = irm_bind(name, ap_name, flags, argc, argv); - if (ret == -ENOENT) { - printf("%s does not exist.\n", ap_name); - return -1; - } + fprintf(stderr, "\"%s\" is unknown, try \"irm bind help\".\n", argv0); + + return -1; +} - if (ret == -EPERM) { - printf("Cannot execute %s, please check permissions.\n", - ap_name); +int bind_cmd(int argc, char ** argv) +{ + if (argc < 1) { + usage(); return -1; } - return ret; + return do_cmd(argv[0], argc, argv); } diff --git a/src/tools/irm/irm_bind_ap.c b/src/tools/irm/irm_bind_ap.c new file mode 100644 index 00000000..a525c077 --- /dev/null +++ b/src/tools/irm/irm_bind_ap.c @@ -0,0 +1,98 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Bind AP to a name + * + * Dimitri Staessens <dimitri.staessens@intec.ugent.be> + * 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> + +#include <ouroboros/irm.h> +#include <ouroboros/errno.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm bind ap <ap>\n" + " name <name>\n" + " [auto] (instantiate apn if not running)\n" + " [loc] (location-dependent application)\n" + " [unique] (there can only be one instantiation)\n" + " [-- <application arguments>]\n"); +} + + +int do_bind_ap(int argc, char ** argv) +{ + char * name = NULL; + char * ap_name = NULL; + uint16_t flags = 0; + int ret = 0; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "ap") == 0) { + ap_name = *(argv + 1); + ++argv; + --argc; + } else if (strcmp(*argv, "auto") == 0) { + flags |= BIND_AP_AUTO; + } else if (strcmp(*argv, "unique") == 0) { + flags |= BIND_AP_UNIQUE; + } else if (strcmp(*argv, "loc") == 0) { + flags |= BIND_AP_LOC; + } else if (strcmp(*argv, "--") == 0) { + ++argv; + --argc; + break; + } else { + printf("\"%s\" is unknown, try \"irm " + "bind\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (name == NULL || ap_name == NULL) { + usage(); + return -1; + } + + ret = irm_bind_ap(ap_name, name, flags, argc, argv); + if (ret == -ENOENT) { + printf("%s does not exist.\n", ap_name); + return -1; + } + + if (ret == -EPERM) { + printf("Cannot execute %s, please check permissions.\n", + ap_name); + return -1; + } + + return ret; +} diff --git a/src/tools/irm/irm_bind_api.c b/src/tools/irm/irm_bind_api.c new file mode 100644 index 00000000..b21d305c --- /dev/null +++ b/src/tools/irm/irm_bind_api.c @@ -0,0 +1,68 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Bind AP-I to a name + * + * Dimitri Staessens <dimitri.staessens@intec.ugent.be> + * 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 <stdlib.h> + +#include <ouroboros/irm.h> +#include <ouroboros/errno.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm bind api <pid> name <name>\n"); +} + +int do_bind_api(int argc, char ** argv) +{ + pid_t api = -1; + char * name = NULL; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "api") == 0) { + api = strtol(*(argv + 1), NULL, 10); + ++argv; + --argc; + } else { + printf("\"%s\" is unknown, try \"irm " + "bind api\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (api < 0 || name == NULL) { + usage(); + return -1; + } + + return irm_bind_api(api, name); +} diff --git a/src/tools/irm/irm_ipcp.c b/src/tools/irm/irm_ipcp.c index f658ead5..1b523feb 100644 --- a/src/tools/irm/irm_ipcp.c +++ b/src/tools/irm/irm_ipcp.c @@ -29,7 +29,7 @@ static void usage() { printf("Usage: irm ipcp [OPERATION]\n\n" "where OPERATION = {create destroy\n" - " bootstrap enroll help\n"); + " bootstrap enroll help}\n"); } static int do_help(int argc, char **argv) diff --git a/src/tools/irm/irm_ops.h b/src/tools/irm/irm_ops.h index 24eee0df..9a59d69a 100644 --- a/src/tools/irm/irm_ops.h +++ b/src/tools/irm/irm_ops.h @@ -26,7 +26,13 @@ int do_destroy_ipcp(int argc, char ** argv); int do_bootstrap_ipcp(int argc, char ** argv); int do_enroll_ipcp(int argc, char ** argv); -int do_bind(int argc, char ** argv); -int do_unbind(int argc, char ** argv); +int bind_cmd(int argc, char ** argv); +int do_bind_ap(int argc, char ** argv); +int do_bind_api(int argc, char ** argv); +int do_bind_ipcp(int argc, char ** argv); +int unbind_cmd(int argc, char ** argv); +int do_unbind_ap(int argc, char ** argv); +int do_unbind_api(int argc, char ** argv); +int do_unbind_ipcp(int argc, char ** argv); int do_register(int argc, char ** argv); int do_unregister(int argc, char ** argv); diff --git a/src/tools/irm/irm_unbind.c b/src/tools/irm/irm_unbind.c index 9e8f3c9c..0290e678 100644 --- a/src/tools/irm/irm_unbind.c +++ b/src/tools/irm/irm_unbind.c @@ -3,6 +3,7 @@ * * Unbind names in the processing system * + * Dimitri Staessens <dimitri.staessens@intec.ugent.be> * Sander Vrijders <sander.vrijders@intec.ugent.be> * * This program is free software; you can redistribute it and/or modify @@ -29,35 +30,46 @@ static void usage() { - printf("Usage: irm unbind\n" - " name <name>\n" - " ap <application process name>\n"); + printf("Usage: irm unbind [OPERATION]\n" + "where OPERATION = {ap api ipcp help}\n"); } -int do_unbind(int argc, char ** argv) +static int do_help(int argc, char **argv) { - char * name = NULL; - char * ap_name = NULL; - - while (argc > 0) { - if (matches(*argv, "name") == 0) { - name = *(argv + 1); - } else if (matches(*argv, "ap") == 0) { - ap_name = *(argv + 1); - } else { - printf("\"%s\" is unknown, try \"irm " - "unbind\".\n", *argv); - return -1; - } - - argc -= 2; - argv += 2; - } + usage(); + return 0; +} + +static const struct cmd { + const char * cmd; + int (* func)(int argc, char ** argv); +} cmds[] = { + { "ap", do_unbind_ap }, + { "api", do_unbind_api }, + { "ipcp", do_unbind_ipcp }, + { "help", do_help }, + { 0 } +}; + +static int do_cmd(const char * argv0, int argc, char ** argv) +{ + const struct cmd * c; - if (name == NULL && ap_name == NULL) { + for (c = cmds; c->cmd; ++c) + if (!matches(argv0, c->cmd)) + return c->func(argc, argv); + + fprintf(stderr, "\"%s\" is unknown, try \"irm unbind help\".\n", argv0); + + return -1; +} + +int unbind_cmd(int argc, char ** argv) +{ + if (argc < 1) { usage(); return -1; } - return irm_unbind(name, ap_name, 0); + return do_cmd(argv[0], argc, argv); } diff --git a/src/tools/irm/irm_unbind_ap.c b/src/tools/irm/irm_unbind_ap.c new file mode 100644 index 00000000..bdfcbaad --- /dev/null +++ b/src/tools/irm/irm_unbind_ap.c @@ -0,0 +1,68 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Unbind AP names + * + * Dimitri Staessens <dimitri.staessens@intec.ugent.be> + * 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 <stdlib.h> + +#include <ouroboros/irm.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm unbind ap <ap>\n" + " [name <name>, omit: remove all AP info]\n"); +} + +int do_unbind_ap(int argc, char ** argv) +{ + char * name = NULL; + char * ap_name = NULL; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "ap") == 0) { + ap_name = *(argv + 1); + ++argv; + --argc; + } else { + printf("\"%s\" is unknown, try \"irm " + "unbind ap\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (ap_name == NULL) { + usage(); + return -1; + } + + return irm_unbind_ap(ap_name, name); +} diff --git a/src/tools/irm/irm_unbind_api.c b/src/tools/irm/irm_unbind_api.c new file mode 100644 index 00000000..b69a4579 --- /dev/null +++ b/src/tools/irm/irm_unbind_api.c @@ -0,0 +1,69 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Unbind AP-I names + * + * Dimitri Staessens <dimitri.staessens@intec.ugent.be> + * 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 <stdlib.h> +#include <sys/types.h> + +#include <ouroboros/irm.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm unbind api <pid>\n" + " [name <name>, omit: remove all AP-I info]\n"); +} + +int do_unbind_api(int argc, char ** argv) +{ + pid_t api = -1; + char * name = NULL; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "api") == 0) { + api = strtol(*(argv + 1), NULL, 10); + ++argv; + --argc; + } else { + printf("\"%s\" is unknown, try \"irm " + "unbind api\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (api < 0) { + usage(); + return -1; + } + + return irm_unbind_api(api, name); +} diff --git a/src/tools/oping/oping.c b/src/tools/oping/oping.c index cf8dc485..2871e79e 100644 --- a/src/tools/oping/oping.c +++ b/src/tools/oping/oping.c @@ -60,6 +60,7 @@ struct c { struct s { struct timespec times[OPING_MAX_FLOWS]; + bool flows[OPING_MAX_FLOWS]; pthread_mutex_t lock; pthread_t cleaner_pt; @@ -95,11 +96,7 @@ int main(int argc, char ** argv) int ret = -1; char * rem = NULL; bool serv = false; - - if (ap_init(argv[0])) { - printf("Failed to init AP.\n"); - exit(EXIT_FAILURE); - } + char ** argv_dup = argv; argc--; argv++; @@ -138,8 +135,18 @@ int main(int argc, char ** argv) } if (serv) { + if (ap_init(argv_dup[0])) { + printf("Failed to init AP.\n"); + exit(EXIT_FAILURE); + } + ret = server_main(); } else { + if (ap_init(NULL)) { + printf("Failed to init AP.\n"); + exit(EXIT_FAILURE); + } + if (client.s_apn == NULL) { printf("No server specified.\n"); usage(); diff --git a/src/tools/oping/oping_server.c b/src/tools/oping/oping_server.c index 9e2fa12f..7761110d 100644 --- a/src/tools/oping/oping_server.c +++ b/src/tools/oping/oping_server.c @@ -53,8 +53,11 @@ void * cleaner_thread(void * o) clock_gettime(CLOCK_REALTIME, &now); pthread_mutex_lock(&server.lock); for (i = 0; i < OPING_MAX_FLOWS; ++i) - if (ts_diff_ms(&server.times[i], &now) > deadline_ms) + if (server.flows[i] && + ts_diff_ms(&server.times[i], &now) > deadline_ms) { + server.flows[i] = false; flow_dealloc(i); + } pthread_mutex_unlock(&server.lock); sleep(1); @@ -123,6 +126,7 @@ void * accept_thread(void * o) clock_gettime(CLOCK_REALTIME, &now); pthread_mutex_lock(&server.lock); + server.flows[fd] = true; server.times[fd] = now; pthread_mutex_unlock(&server.lock); @@ -135,6 +139,7 @@ void * accept_thread(void * o) int server_main() { struct sigaction sig_act; + int i = 0; memset(&sig_act, 0, sizeof sig_act); sig_act.sa_sigaction = &shutdown_server; @@ -148,10 +153,8 @@ int server_main() return -1; } - if (api_bind(NULL) < 0) { - printf("Failed to bind the server instance."); - return -1; - } + for (i = 0; i < OPING_MAX_FLOWS; ++i) + server.flows[i] = false; pthread_create(&server.cleaner_pt, NULL, cleaner_thread, NULL); pthread_create(&server.accept_pt, NULL, accept_thread, NULL); |