1.1 --- a/src/server.c Mon Mar 17 15:39:36 2014 +0100 1.2 +++ b/src/server.c Wed Mar 19 10:08:25 2014 +0100 1.3 @@ -28,40 +28,54 @@ 1.4 */ 1.5 1.6 #include "terminal-chess.h" 1.7 +#include "game.h" 1.8 #include <ncurses.h> 1.9 1.10 -int server_run(Settings *settings) { 1.11 - Server server; 1.12 - int exit_code = EXIT_SUCCESS; 1.13 - 1.14 - dump_gameinfo(&(settings->gameinfo)); 1.15 +static int server_open(Server *server, char *port) { 1.16 printw("\nListening for client...\n"); 1.17 refresh(); 1.18 - if (net_create(&server, settings->port)) { 1.19 + if (net_create(server, port)) { 1.20 perror("Server creation failed"); 1.21 - exit_code = EXIT_FAILURE; 1.22 - goto quit; 1.23 + return 1; 1.24 } 1.25 1.26 - if (net_listen(&server)) { 1.27 + if (net_listen(server)) { 1.28 perror("Listening for client failed"); 1.29 - exit_code = EXIT_FAILURE; 1.30 - goto quit; 1.31 + return 1; 1.32 } 1.33 + 1.34 + return 0; 1.35 +} 1.36 1.37 - /* net version handshake */ 1.38 - int fd = server.client->fd; 1.39 - net_send_code(fd, NETCODE_VERSION); 1.40 - if (net_recieve_code(fd) != NETCODE_VERSION) { 1.41 +static int server_handshake(Client *client) { 1.42 + net_send_code(client->fd, NETCODE_VERSION); 1.43 + if (net_recieve_code(client->fd) != NETCODE_VERSION) { 1.44 fprintf(stderr, "Client uses an incompatible software version.\n"); 1.45 - exit_code = EXIT_FAILURE; 1.46 - goto quit; 1.47 + return 1; 1.48 } 1.49 1.50 printw("Client connected - transmitting gameinfo..."); 1.51 refresh(); 1.52 + 1.53 + return 0; 1.54 +} 1.55 1.56 +int server_run(Settings *settings) { 1.57 + Server server; 1.58 + 1.59 + dump_gameinfo(&(settings->gameinfo)); 1.60 + 1.61 + if (server_open(&server, settings->port)) { 1.62 + net_destroy(&server); 1.63 + return EXIT_FAILURE; 1.64 + } 1.65 + 1.66 + if (server_handshake(server.client)) { 1.67 + net_destroy(&server); 1.68 + return EXIT_FAILURE; 1.69 + } 1.70 1.71 + int fd = server.client->fd; 1.72 net_send_code(fd, NETCODE_GAMEINFO); 1.73 net_send_data(fd, &(settings->gameinfo), sizeof(settings->gameinfo)); 1.74 printw("\rClient connected - awaiting challenge acceptance..."); 1.75 @@ -70,17 +84,17 @@ 1.76 if (code == NETCODE_ACCEPT) { 1.77 printw("\rClient connected - challenge accepted."); 1.78 clrtoeol(); 1.79 + 1.80 + game_start(settings, fd); 1.81 } else if (code == NETCODE_DECLINE) { 1.82 printw("\rClient connected - challenge declined."); 1.83 clrtoeol(); 1.84 } else { 1.85 fprintf(stderr, "Invalid client response\n"); 1.86 - exit_code = EXIT_FAILURE; 1.87 - goto quit; 1.88 + net_destroy(&server); 1.89 + return EXIT_FAILURE; 1.90 } 1.91 1.92 -quit: 1.93 - 1.94 net_destroy(&server); 1.95 - return exit_code; 1.96 + return EXIT_SUCCESS; 1.97 }