2005-11-09 Carl Worth <cworth@cworth.org>
authorCarl Worth <carl@theworths.org>
Wed, 9 Nov 2005 13:57:33 +0000 (13:57 +0000)
committerCarl Worth <carl@theworths.org>
Wed, 9 Nov 2005 13:57:33 +0000 (13:57 +0000)
        * src/ttt-args.h:
        * src/ttt-args.c: (ttt_args_help), (ttt_args_parse): Add support
        for -h,--host, -p,--port, and --log-file command-line arguments.

        * src/ttt-server.c: (main): Use host, port, and log-file
        command-line arguments.

        * src/ttt-client.c: (main): Track change in signature of
        ttt_args_parse.

        * src/x.h:
        * src/x.c: (xfdopen), (xfreopen): More wrappers.

ChangeLog
src/ttt-args.c
src/ttt-args.h
src/ttt-client.c
src/ttt-server.c
src/x.c
src/x.h

index b9e45631eadd88029b42ed81457d9b45057221ba..ec9cc3f958cb7396ec9e0e18673ab9e1b103b8b1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2005-11-09  Carl Worth  <cworth@cworth.org>
+
+       * src/ttt-args.h:
+       * src/ttt-args.c: (ttt_args_help), (ttt_args_parse): Add support
+       for -h,--host, -p,--port, and --log-file command-line arguments.
+       
+       * src/ttt-server.c: (main): Use host, port, and log-file
+       command-line arguments.
+
+       * src/ttt-client.c: (main): Track change in signature of
+       ttt_args_parse.
+       
+       * src/x.h:
+       * src/x.c: (xfdopen), (xfreopen): More wrappers.
+
 2005-11-08  Carl Worth  <cworth@cworth.org>
 
        * src/ttt.h:
index 2e4720594e6dee1c575f85c497d4afd0ee748735..18a7d255405cd49c0fda6cbf6be7120dccdf5cf2 100644 (file)
 
 static const char TTT_ARGS_PROGRAM_VERSION[] = VERSION;
 static const char TTT_ARGS_PROGRAM_DESCRIPTION[] = "client-server tic-tac-toe game";
-static const char TTT_ARGS_PROGRAM_BUG_ADDRESS[] = "<cworth@cworth.org>";
+static const char TTT_ARGS_PROGRAM_BUG_ADDRESS[] = "<carl@theworths.org>";
 
-/* XXX: SAMPLE: */
-static char TTT_ARGS_PROGRAM_ARGDOC[] = "<file>";
+static char TTT_ARGS_PROGRAM_ARGDOC[] = "";
 
 /* XXX: getopt is rather annoying in that you must maintain a
  * string-encoding of the options in addition to the table. For
@@ -46,14 +45,21 @@ static char TTT_ARGS_PROGRAM_ARGDOC[] = "<file>";
  * strings, so the args_help function below must also be maintained
  * manually.
  */
-static char ttt_args_optstring[] = "hV";
+
+enum {
+    TTT_ARGS_VAL_LOG_FILE = 256,
+    TTT_ARGS_VAL_HELP,
+    TTT_ARGS_VAL_VERSION
+};
+
+static char ttt_args_optstring[] = "h:p:";
 static struct option ttt_args_options[] = {
     /* name,           has_arg,        flag,   val */
-    /* XXX: SAMPLE:
-    {"display",                1,              0,      'd'},
-    */
-    {"help",           0,              0,      'h'},
-    {"version",                0,              0,      'V'},
+    {"host",           1,              0,      'h'},
+    {"port",           1,              0,      'p'},
+    {"log-file",       1,              0,      TTT_ARGS_VAL_LOG_FILE},
+    {"help",           0,              0,      TTT_ARGS_VAL_HELP},
+    {"version",                0,              0,      TTT_ARGS_VAL_VERSION},
     { 0 }
 };
 
@@ -63,11 +69,16 @@ ttt_args_help (const char *argv0)
     printf ("Usage: %s [OPTION] %s\n", argv0, TTT_ARGS_PROGRAM_ARGDOC);
     printf ("%s - %s\n", argv0, TTT_ARGS_PROGRAM_DESCRIPTION);
     puts ("");
-    printf ("  -h, --help\t\tGive this help list\n");
-    printf ("  -V, --version\t\tPrint program version\n");
-    /* XXX: SAMPLE:
-    printf ("  -d, --display=DISPLAY\tX server to connect to");
-    */
+    printf ("Options that are common to both client and server:\n");
+    puts ("");
+    printf ("  -h HOST, --host=HOST\tHost to connect/bind to\n");
+    printf ("  -p PORT, --port=PORT\tPort to connect/bind to\n");
+    printf ("           --help\tGive this help list\n");
+    printf ("           --version\tPrint program version\n");
+    puts ("");
+    printf ("Options that are specific to the server:\n");
+    puts ("");
+    printf ("           --log-file=FILE\tFile to use for logging\n");
 }
 
 static void
@@ -78,16 +89,16 @@ ttt_args_usage (const char *argv0)
 }
 
 int
-ttt_args_parse(ttt_args_t *args, int argc, char *argv[], int *args_first)
+ttt_args_parse(ttt_args_t *args, int argc, char *argv[])
 {
     char *argv0_copy = strdup (argv[0]);
     char *argv0 = basename (argv0_copy);
 
     int c;
 
-    /* XXX: SAMPLE:
-    args->display = NULL;
-    */
+    args->host = TTT_ARGS_HOST_DEFAULT;
+    args->port = TTT_ARGS_PORT_DEFAULT;
+    args->log_file = TTT_ARGS_LOG_FILE_DEFAULT;
 
     while (1) {
        c = getopt_long (argc, argv, ttt_args_optstring, ttt_args_options, NULL);
@@ -95,17 +106,21 @@ ttt_args_parse(ttt_args_t *args, int argc, char *argv[], int *args_first)
            break;
 
        switch (c) {
-       /* XXX: SAMPLE:
-       case 'd':
-           args->display = optarg;
+       case 'h':
+           args->host = optarg;
            break;
-       */
-       case 'V':
+       case 'p':
+           args->port = optarg;
+           break;
+       case TTT_ARGS_VAL_LOG_FILE:
+           args->log_file = optarg;
+           break;
+       case TTT_ARGS_VAL_VERSION:
            printf ("%s\n", VERSION);
            exit (0);
            break;
 
-       case 'h':
+       case TTT_ARGS_VAL_HELP:
            ttt_args_help (argv0);
            exit (0);
            break;
@@ -121,17 +136,6 @@ ttt_args_parse(ttt_args_t *args, int argc, char *argv[], int *args_first)
        }
     }
 
-    /* XXX: SAMPLE:
-    if (argc - optind == 1) {
-       args->file = argv[optind];
-    } else {
-        ttt_args_usage (argv0);
-    }
-    */
-
-    if (args_first)
-       *args_first = optind;
-
     free (argv0_copy);
 
     return 0;
index f5e117a607cc4fe089d574c1821086f717397fdb..7c18acde62878beb244004a16eedbcf9b390d1aa 100644 (file)
 #include "config.h"
 #endif
 
+#define TTT_ARGS_HOST_DEFAULT "localhost"
+#define TTT_ARGS_PORT_DEFAULT "5334"
+/* NULL means to just log to stderr. */
+#define TTT_ARGS_LOG_FILE_DEFAULT NULL
+
 typedef struct ttt_args
 {
-    /* XXX: SAMPLE:
-    char *display;
-    */
-    char *file;
-
+    char *host;
+    char *port;
+    char *log_file;
 } ttt_args_t;
 
 int
-ttt_args_parse(ttt_args_t *args, int argc, char *argv[], int *args_first);
+ttt_args_parse(ttt_args_t *args, int argc, char *argv[]);
 
 #endif
index b42db7a95064811b95fff78b4f0070236b4fe69c..d6b6fe7b4e474d9c7ce4f7962bdbe1fdaab876f4 100644 (file)
@@ -25,9 +25,8 @@ int
 main (int argc, char **argv)
 {
     ttt_args_t args;
-    int args_first;
 
-    ttt_args_parse (&args, argc, argv, &args_first);
+    ttt_args_parse (&args, argc, argv);
 
     /* XXX: insert code here */
 
index a248fa1a789b0a22f20db04551f0f531aaf472d5..d10d442e621f4b024c9e5cc31f6e8ed4f10d77ce 100644 (file)
@@ -131,18 +131,17 @@ int
 main (int argc, char **argv)
 {
     ttt_args_t args;
-    int args_first;
     int listen_socket, connected_socket;
     struct sockaddr_in addr;
 
-    ttt_args_parse (&args, argc, argv, &args_first);
+    ttt_args_parse (&args, argc, argv);
 
-    listen_socket = xsocket (PF_INET, SOCK_STREAM, 0);
+    if (args.log_file)
+       stderr = xfreopen (args.log_file, "a", stderr);
 
-#define HOST "localhost"
-#define PORT "5534"
+    listen_socket = xsocket (PF_INET, SOCK_STREAM, 0);
 
-    _sockaddr_init (&addr, HOST, PORT);
+    _sockaddr_init (&addr, args.host, args.port);
 
 #ifdef SO_REUSEADDR
     {
@@ -156,7 +155,7 @@ main (int argc, char **argv)
 
     xlisten (listen_socket, SOMAXCONN);
 
-    printf (WELCOME_MESSAGE, HOST, PORT, HOST, PORT);
+    printf (WELCOME_MESSAGE, args.host, args.port, args.host, args.port);
 
     connected_socket = _wait_for_connection (listen_socket);
 
diff --git a/src/x.c b/src/x.c
index 1695374c8c72a3c6423a69b69d15728c575055ee..3e46abdd03fb0c388c60d5494cce359cdcaf2cc6 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -127,7 +127,23 @@ xfdopen (int filedes, const char *mode)
     ret = fdopen (filedes, mode);
 
     if (ret == NULL) {
-       fprintf (stderr, "Error: fdopen failed: %s. Aborting.\n", strerror (errno));
+       fprintf (stderr, "Error: fdopen failed: %s. Aborting.\n",
+                strerror (errno));
+       exit (1);
+    }
+
+    return ret;
+}
+
+FILE *
+xfreopen (const char *path, const char *mode, FILE *stream)
+{
+    FILE *ret;
+
+    ret = freopen (path, mode, stream);
+    if (ret == NULL) {
+       fprintf (stderr, "Error: freopen of %s failed: %s. Aborting.\n",
+                path, strerror (errno));
        exit (1);
     }
 
diff --git a/src/x.h b/src/x.h
index e3efdb8f0d89547c0350845e7eeeef41c743e464..024d8c283885590596cfe566e6cb70747b23b2b6 100644 (file)
--- a/src/x.h
+++ b/src/x.h
@@ -46,6 +46,9 @@ xrealloc (void *ptr, size_t size);
 FILE *
 xfdopen (int filedes, const char *mode);
 
+FILE *
+xfreopen (const char *path, const char *mode, FILE *stream);
+
 char *
 xstrdup (const char *s);