src/main.c

changeset 1
e5fbb8f9edbe
parent 0
98034084033f
child 2
0a08f79c320d
--- 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 <stdlib.h>
+#include "terminal-chess.h"
+#include <string.h>
+
+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);
 }
 

mercurial