diff -r 98034084033f -r e5fbb8f9edbe src/main.c --- a/src/main.c Thu Jan 23 14:45:34 2014 +0100 +++ b/src/main.c Wed Feb 05 14:07:43 2014 +0100 @@ -27,9 +27,98 @@ * */ -#include +#include "terminal-chess.h" +#include + +int get_settings(int argc, char **argv, Settings *settings) { + char *valid; + + for (char opt ; (opt = getopt(argc, argv, "hp:")) != -1 ;) { + switch (opt) { + case 'p': + if (strtol(optarg, &valid, 10) < 1025 || *valid != '\0') { + fprintf(stderr, + "Invalid port number (%s) - choose a number > 1024\n", + optarg); + return 1; + } else { + settings->port = optarg; + } + break; + case 'h': + case '?': + settings->printhelp = 1; + break; + } + } + + if (optind == argc - 1) { + settings->serverhost = argv[optind]; + } else if (optind < argc - 1) { + fprintf(stderr, "Too many arguments\n"); + return 1; + } + + return 0; +} + +Settings default_settings() { + Settings settings; + memset(&settings, 0, sizeof(Settings)); + settings.port = "27015"; + return settings; +} + +int cleanup(Settings *settings, int exitcode) { + if (settings->server) { + if (net_destroy(settings->server)) { + perror("Server shutdown failed"); + } + } + + return exitcode; +} int main(int argc, char **argv) { - return EXIT_SUCCESS; + + Settings settings = default_settings(); + get_settings(argc, argv, &settings); + + if (settings.printhelp) { + printf( + "Usage: %s [OPTION]... [HOST]\n" + "Starts/joins a network chess game\n\n" + " -h This help page\n" + " -p TCP port to use (default: 27015)\n", + argv[0]); + return EXIT_SUCCESS; + } + + Server server; + settings.server = &server; + + if (is_server(&settings)) { + if (net_find(&server, settings.serverhost, settings.port)) { + perror("Can't find server"); + return cleanup(&settings, EXIT_FAILURE); + } + + if (net_connect(&server)) { + perror("Can't connect to server"); + return cleanup(&settings, EXIT_FAILURE); + } + } else { + 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); + } + } + + return cleanup(&settings, EXIT_SUCCESS); }