Mon, 17 Mar 2014 15:39:36 +0100
separated server and client module
src/Makefile | file | annotate | diff | comparison | revisions | |
src/client.c | file | annotate | diff | comparison | revisions | |
src/main.c | file | annotate | diff | comparison | revisions | |
src/server.c | file | annotate | diff | comparison | revisions | |
src/terminal-chess.h | file | annotate | diff | comparison | revisions |
--- a/src/Makefile Mon Mar 17 14:35:53 2014 +0100 +++ b/src/Makefile Mon Mar 17 15:39:36 2014 +0100 @@ -31,6 +31,8 @@ SRC = main.c SRC += network.c SRC += input.c +SRC += server.c +SRC += client.c OBJ = $(SRC:%.c=../build/%$(OBJ_EXT))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/client.c Mon Mar 17 15:39:36 2014 +0100 @@ -0,0 +1,83 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2014 Mike Becker. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "terminal-chess.h" +#include "input.h" +#include <ncurses.h> + +int client_run(Settings *settings) { + Server server; + int exit_code = EXIT_SUCCESS; + + if (net_find(&server, settings->serverhost, settings->port)) { + fprintf(stderr, "Can't find server\n"); + exit_code = EXIT_FAILURE; + goto quit; + } + + if (net_connect(&server)) { + perror("Can't connect to server"); + exit_code = EXIT_FAILURE; + goto quit; + } + + /* net version handshake */ + int fd = server.fd; + if (net_recieve_code(fd) != NETCODE_VERSION) { + fprintf(stderr, "Server uses an incompatible software version.\n"); + exit_code = EXIT_FAILURE; + goto quit; + } else { + net_send_code(fd, NETCODE_VERSION); + } + + printw("Connection established!\n\n"); + refresh(); + + if (net_recieve_code(fd) == NETCODE_GAMEINFO) { + net_recieve_data(fd, &(settings->gameinfo), + sizeof(settings->gameinfo)); + dump_gameinfo(&(settings->gameinfo)); + printw("Accept challenge (y/n)? "); + if (prompt_yesno()) { + net_send_code(fd, NETCODE_ACCEPT); + // TODO: start game + } else { + net_send_code(fd, NETCODE_DECLINE); + } + } else { + fprintf(stderr, "Server sent invalid gameinfo.\n"); + exit_code = EXIT_FAILURE; + goto quit; + } + +quit: + net_destroy(&server); + return exit_code; +}
--- a/src/main.c Mon Mar 17 14:35:53 2014 +0100 +++ b/src/main.c Mon Mar 17 15:39:36 2014 +0100 @@ -31,7 +31,6 @@ #include <string.h> #include <time.h> #include <ncurses.h> -#include "input.h" int get_settings(int argc, char **argv, Settings *settings) { char *valid; @@ -126,17 +125,6 @@ refresh(); } -int cleanup(Settings *settings, int exitcode) { - - if (settings->server) { - if (net_destroy(settings->server)) { - perror("Server shutdown failed"); - } - } - - return exitcode; -} - static WINDOW* window; void leavescr() { @@ -179,88 +167,6 @@ cbreak(); atexit(leavescr); - Server server; - settings.server = &server; - - if (is_server(&settings)) { - dump_gameinfo(&(settings.gameinfo)); - printw("\nListening for client...\n"); - refresh(); - if (net_create(&server, settings.port)) { - perror("Server creation failed"); - return cleanup(&settings, EXIT_FAILURE); - } - - if (net_listen(&server)) { - perror("Listening for client failed"); - return cleanup(&settings, EXIT_FAILURE); - } - - /* net version handshake */ - int fd = server.client->fd; - net_send_code(fd, NETCODE_VERSION); - if (net_recieve_code(fd) != NETCODE_VERSION) { - fprintf(stderr, "Client uses an incompatible software version.\n"); - return cleanup(&settings, EXIT_FAILURE); - } - - printw("Client connected - transmitting gameinfo..."); - refresh(); - - - net_send_code(fd, NETCODE_GAMEINFO); - net_send_data(fd, &(settings.gameinfo), sizeof(settings.gameinfo)); - printw("\rClient connected - awaiting challenge acceptance..."); - refresh(); - int code = net_recieve_code(fd); - if (code == NETCODE_ACCEPT) { - printw("\rClient connected - challenge accepted."); - clrtoeol(); - } else if (code == NETCODE_DECLINE) { - printw("\rClient connected - challenge declined."); - clrtoeol(); - } else { - fprintf(stderr, "Invalid client response\n"); - return cleanup(&settings, EXIT_FAILURE); - } - } else { - if (net_find(&server, settings.serverhost, settings.port)) { - fprintf(stderr, "Can't find server\n"); - return cleanup(&settings, EXIT_FAILURE); - } - - if (net_connect(&server)) { - perror("Can't connect to server"); - return cleanup(&settings, EXIT_FAILURE); - } - - int fd = server.fd; - if (net_recieve_code(fd) != NETCODE_VERSION) { - fprintf(stderr, "Server uses an incompatible software version.\n"); - return cleanup(&settings, EXIT_FAILURE); - } else { - net_send_code(fd, NETCODE_VERSION); - } - - printw("Connection established!\n\n"); - refresh(); - - if (net_recieve_code(fd) == NETCODE_GAMEINFO) { - net_recieve_data(fd, &(settings.gameinfo), - sizeof(settings.gameinfo)); - dump_gameinfo(&(settings.gameinfo)); - printw("Accept challenge (y/n)? "); - if (prompt_yesno()) { - net_send_code(fd, NETCODE_ACCEPT); - // TODO: start game - } else { - net_send_code(fd, NETCODE_DECLINE); - } - } else { - fprintf(stderr, "Server sent invalid gameinfo.\n"); - } - } - - return cleanup(&settings, EXIT_SUCCESS); + return is_server(&settings) ? server_run(&settings) : client_run(&settings); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server.c Mon Mar 17 15:39:36 2014 +0100 @@ -0,0 +1,86 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2014 Mike Becker. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "terminal-chess.h" +#include <ncurses.h> + +int server_run(Settings *settings) { + Server server; + int exit_code = EXIT_SUCCESS; + + dump_gameinfo(&(settings->gameinfo)); + printw("\nListening for client...\n"); + refresh(); + if (net_create(&server, settings->port)) { + perror("Server creation failed"); + exit_code = EXIT_FAILURE; + goto quit; + } + + if (net_listen(&server)) { + perror("Listening for client failed"); + exit_code = EXIT_FAILURE; + goto quit; + } + + /* net version handshake */ + int fd = server.client->fd; + net_send_code(fd, NETCODE_VERSION); + if (net_recieve_code(fd) != NETCODE_VERSION) { + fprintf(stderr, "Client uses an incompatible software version.\n"); + exit_code = EXIT_FAILURE; + goto quit; + } + + printw("Client connected - transmitting gameinfo..."); + refresh(); + + + net_send_code(fd, NETCODE_GAMEINFO); + net_send_data(fd, &(settings->gameinfo), sizeof(settings->gameinfo)); + printw("\rClient connected - awaiting challenge acceptance..."); + refresh(); + int code = net_recieve_code(fd); + if (code == NETCODE_ACCEPT) { + printw("\rClient connected - challenge accepted."); + clrtoeol(); + } else if (code == NETCODE_DECLINE) { + printw("\rClient connected - challenge declined."); + clrtoeol(); + } else { + fprintf(stderr, "Invalid client response\n"); + exit_code = EXIT_FAILURE; + goto quit; + } + +quit: + + net_destroy(&server); + return exit_code; +}
--- a/src/terminal-chess.h Mon Mar 17 14:35:53 2014 +0100 +++ b/src/terminal-chess.h Mon Mar 17 15:39:36 2014 +0100 @@ -54,11 +54,15 @@ Gameinfo gameinfo; char* port; char* serverhost; /* NULL, if we are about to start a server */ - Server *server; } Settings; #define is_server(settings) !((settings)->serverhost) +void dump_gameinfo(Gameinfo *gameinfo); + +int server_run(Settings* settings); +int client_run(Settings* settings); + #ifdef __cplusplus } #endif