]> git.cworth.org Git - ttt/blobdiff - src/ttt-client.c
2005-11-24 Carl Worth <cworth@cworth.org>
[ttt] / src / ttt-client.c
index 508aa88e91ecffba87e9c7e63a3caaa92db521ea..1c23fcc3aced5d29ffa25ba19b4c3bebde00fa50 100644 (file)
@@ -36,6 +36,7 @@ struct _ttt_client {
     yyscan_t scanner;
 
     char *name;
+    ttt_bool_t registered;
 
     char **request_strings;
     int num_request_strings;
@@ -50,16 +51,22 @@ _ttt_client_execute_helo (ttt_client_t *client,
                          char         **args,
                          int          num_args);
 
+static ttt_error_t
+_ttt_client_execute_quit (ttt_client_t *client,
+                         char         **args,
+                         int          num_args);
+
 typedef struct _ttt_command_description {
     const char *command;
-    int args_min;
-    int args_max;
+    int args_required;
     ttt_command_func_t execute;
 } ttt_command_description_t;
 
 ttt_command_description_t command_descriptions[] = {
-    {"HELO", 1, 1, _ttt_client_execute_helo}
+    {"HELO", 1, _ttt_client_execute_helo},
+    {"QUIT", 0, _ttt_client_execute_quit}
 };
+#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
 
 static ttt_error_t
 _ttt_client_execute_helo (ttt_client_t *client,
@@ -69,13 +76,16 @@ _ttt_client_execute_helo (ttt_client_t *client,
     ttt_error_t error;
     char *response;
 
-    if (num_args == 1)
-       ttt_client_set_name (client, args[0]);
+    assert (num_args == 1);
+
+    ttt_client_set_name (client, args[0]);
 
     error = ttt_server_register_client (client->server, client);
     if (error)
        return error;
 
+    client->registered = TRUE;
+
     xasprintf (&response, "HELO %s %s %s\n", client->name,
               ttt_server_get_host (client->server),
               ttt_server_get_port (client->server));
@@ -87,7 +97,15 @@ _ttt_client_execute_helo (ttt_client_t *client,
     return TTT_ERROR_NONE;
 }
 
-#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
+static ttt_error_t
+_ttt_client_execute_quit (ttt_client_t  *client,
+                         char          **args,
+                         int             num_args)
+{
+    assert (num_args == 0);
+
+    return TTT_ERROR_QUIT_REQUESTED;
+}
 
 static void
 _free_request (ttt_client_t *client);
@@ -112,6 +130,7 @@ _ttt_client_init (ttt_client_t      *client,
     client->num_request_strings = 0;
 
     client->name = NULL;
+    client->registered = FALSE;
 }
 
 static void
@@ -119,7 +138,8 @@ _ttt_client_fini (ttt_client_t *client)
 {
     pthread_mutex_lock (&client->mutex);
 
-    ttt_server_unregister_client (client->server, client);
+    if (client->registered)
+       ttt_server_unregister_client (client->server, client);
 
     free (client->name);
     client->name = NULL;
@@ -202,7 +222,7 @@ _execute_request (ttt_client_t *client)
     for (i=0; i < ARRAY_SIZE(command_descriptions); i++) {
        desc = &command_descriptions[i];
        if (strcmp(command, desc->command) == 0) {
-           if ((num_args < desc->args_min) || (num_args > desc->args_max))
+           if (num_args != desc->args_required)
                return TTT_ERROR_SYNTAX;
            return (desc->execute) (client, &client->request_strings[1], num_args);
            }
@@ -227,6 +247,8 @@ _handle_requests_thread (void *closure)
            ASSERT_NOT_REACHED;
 
        error = _execute_request (client);
+       if (error == TTT_ERROR_QUIT_REQUESTED)
+           break;
        if (error)
            ttt_client_send (client, ttt_error_string (error));
     }