diff -r f7dfef88947d -r daaf6e5b3501 src/server.c --- a/src/server.c Mon Mar 17 15:39:36 2014 +0100 +++ b/src/server.c Wed Mar 19 10:08:25 2014 +0100 @@ -28,40 +28,54 @@ */ #include "terminal-chess.h" +#include "game.h" #include -int server_run(Settings *settings) { - Server server; - int exit_code = EXIT_SUCCESS; - - dump_gameinfo(&(settings->gameinfo)); +static int server_open(Server *server, char *port) { printw("\nListening for client...\n"); refresh(); - if (net_create(&server, settings->port)) { + if (net_create(server, port)) { perror("Server creation failed"); - exit_code = EXIT_FAILURE; - goto quit; + return 1; } - if (net_listen(&server)) { + if (net_listen(server)) { perror("Listening for client failed"); - exit_code = EXIT_FAILURE; - goto quit; + return 1; } + + return 0; +} - /* net version handshake */ - int fd = server.client->fd; - net_send_code(fd, NETCODE_VERSION); - if (net_recieve_code(fd) != NETCODE_VERSION) { +static int server_handshake(Client *client) { + net_send_code(client->fd, NETCODE_VERSION); + if (net_recieve_code(client->fd) != NETCODE_VERSION) { fprintf(stderr, "Client uses an incompatible software version.\n"); - exit_code = EXIT_FAILURE; - goto quit; + return 1; } printw("Client connected - transmitting gameinfo..."); refresh(); + + return 0; +} +int server_run(Settings *settings) { + Server server; + + dump_gameinfo(&(settings->gameinfo)); + + if (server_open(&server, settings->port)) { + net_destroy(&server); + return EXIT_FAILURE; + } + + if (server_handshake(server.client)) { + net_destroy(&server); + return EXIT_FAILURE; + } + int fd = server.client->fd; net_send_code(fd, NETCODE_GAMEINFO); net_send_data(fd, &(settings->gameinfo), sizeof(settings->gameinfo)); printw("\rClient connected - awaiting challenge acceptance..."); @@ -70,17 +84,17 @@ if (code == NETCODE_ACCEPT) { printw("\rClient connected - challenge accepted."); clrtoeol(); + + game_start(settings, fd); } else if (code == NETCODE_DECLINE) { printw("\rClient connected - challenge declined."); clrtoeol(); } else { fprintf(stderr, "Invalid client response\n"); - exit_code = EXIT_FAILURE; - goto quit; + net_destroy(&server); + return EXIT_FAILURE; } -quit: - net_destroy(&server); - return exit_code; + return EXIT_SUCCESS; }