X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-client.c;h=1c23fcc3aced5d29ffa25ba19b4c3bebde00fa50;hp=508aa88e91ecffba87e9c7e63a3caaa92db521ea;hb=82b903360548669988e41ffe055bc2215a28b404;hpb=f8bdcd97af8d0dcee79ab692fffb83dba5a5498a diff --git a/src/ttt-client.c b/src/ttt-client.c index 508aa88..1c23fcc 100644 --- a/src/ttt-client.c +++ b/src/ttt-client.c @@ -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)); }