diff -r f7dfef88947d -r daaf6e5b3501 src/client.c --- a/src/client.c Mon Mar 17 15:39:36 2014 +0100 +++ b/src/client.c Wed Mar 19 10:08:25 2014 +0100 @@ -29,55 +29,67 @@ #include "terminal-chess.h" #include "input.h" +#include "game.h" #include -int client_run(Settings *settings) { - Server server; - int exit_code = EXIT_SUCCESS; - - if (net_find(&server, settings->serverhost, settings->port)) { +static int client_connect(Server *server, char *host, char *port) { + if (net_find(server, host, port)) { fprintf(stderr, "Can't find server\n"); - exit_code = EXIT_FAILURE; - goto quit; + return 1; } - if (net_connect(&server)) { + if (net_connect(server)) { perror("Can't connect to server"); - exit_code = EXIT_FAILURE; - goto quit; + return 1; } + + return 0; +} - /* net version handshake */ - int fd = server.fd; - if (net_recieve_code(fd) != NETCODE_VERSION) { +static int client_handshake(Server *server) { + if (net_recieve_code(server->fd) != NETCODE_VERSION) { fprintf(stderr, "Server uses an incompatible software version.\n"); - exit_code = EXIT_FAILURE; - goto quit; + return 1; } else { - net_send_code(fd, NETCODE_VERSION); + net_send_code(server->fd, NETCODE_VERSION); } printw("Connection established!\n\n"); refresh(); + + return 0; +} - if (net_recieve_code(fd) == NETCODE_GAMEINFO) { - net_recieve_data(fd, &(settings->gameinfo), +int client_run(Settings *settings) { + Server server; + + if (client_connect(&server, settings->serverhost, settings->port)) { + net_destroy(&server); + return EXIT_FAILURE; + } + + if (client_handshake(&server)) { + net_destroy(&server); + return EXIT_FAILURE; + } + + if (net_recieve_code(server.fd) == NETCODE_GAMEINFO) { + net_recieve_data(server.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 + net_send_code(server.fd, NETCODE_ACCEPT); + game_start(settings, server.fd); } else { - net_send_code(fd, NETCODE_DECLINE); + net_send_code(server.fd, NETCODE_DECLINE); } } else { fprintf(stderr, "Server sent invalid gameinfo.\n"); - exit_code = EXIT_FAILURE; - goto quit; + net_destroy(&server); + return EXIT_FAILURE; } -quit: net_destroy(&server); - return exit_code; + return EXIT_SUCCESS; }