From dd5612fda0a14a944ff5f0c99044449adca55605 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 11 May 2010 13:06:16 +0000 Subject: [PATCH] arm-specific --- src/arm/gnunet-service-arm.c | 52 ++++++++++++++++++++ src/arm/mockup-service.c | 4 +- src/include/gnunet_protocols.h | 17 ++----- src/util/client.c | 46 +++++++++--------- src/util/service.c | 86 ---------------------------------- 5 files changed, 81 insertions(+), 124 deletions(-) diff --git a/src/arm/gnunet-service-arm.c b/src/arm/gnunet-service-arm.c index 71a2aa446..aa4f89bdb 100644 --- a/src/arm/gnunet-service-arm.c +++ b/src/arm/gnunet-service-arm.c @@ -966,12 +966,64 @@ maint_child_death (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } +static size_t +transmit_shutdown_ack (void *cls, size_t size, void *buf) +{ + struct GNUNET_SERVER_Client *client = cls; + struct GNUNET_MessageHeader *msg; + + if (size < sizeof (struct GNUNET_MessageHeader)) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Failed to transmit shutdown ACK.\n")); + GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + return 0; /* client disconnected */ + } + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Transmitting shutdown ACK.\n")); + + msg = (struct GNUNET_MessageHeader *) buf; + msg->type = htons (GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN_ACK); + msg->size = htons (sizeof (struct GNUNET_MessageHeader)); + GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVER_client_drop(client); + return sizeof (struct GNUNET_MessageHeader); +} + +/** + * Handler for SHUTDOWN message. + * + * @param cls closure (refers to service) + * @param client identification of the client + * @param message the actual message + */ +static void +handle_shutdown (void *cls, + struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) +{ + GNUNET_SERVER_client_keep(client); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Initiating shutdown as requested by client.\n")); + + GNUNET_SERVER_notify_transmit_ready (client, + sizeof(struct GNUNET_MessageHeader), + GNUNET_TIME_UNIT_FOREVER_REL, + &transmit_shutdown_ack, client); + GNUNET_SERVER_client_persist_ (client); + GNUNET_SCHEDULER_shutdown (sched); +} + + /** * List of handlers for the messages understood by this service. */ static struct GNUNET_SERVER_MessageHandler handlers[] = { {&handle_start, NULL, GNUNET_MESSAGE_TYPE_ARM_START, 0}, {&handle_stop, NULL, GNUNET_MESSAGE_TYPE_ARM_STOP, 0}, + {&handle_shutdown, NULL, GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN, + sizeof (struct GNUNET_MessageHeader)}, {NULL, NULL, 0, 0} }; diff --git a/src/arm/mockup-service.c b/src/arm/mockup-service.c index dd0f5b122..8a4940630 100644 --- a/src/arm/mockup-service.c +++ b/src/arm/mockup-service.c @@ -49,7 +49,7 @@ transmit_shutdown_ack (void *cls, size_t size, void *buf) _("Transmitting shutdown ACK.\n")); msg = (struct GNUNET_MessageHeader *) buf; - msg->type = htons (GNUNET_MESSAGE_TYPE_SHUTDOWN_ACK); + msg->type = htons (GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN_ACK); msg->size = htons (sizeof (struct GNUNET_MessageHeader)); GNUNET_SERVER_receive_done (client, GNUNET_OK); GNUNET_SERVER_client_drop(client); @@ -87,7 +87,7 @@ handle_shutdown (void *cls, * struct. */ static const struct GNUNET_SERVER_MessageHandler handlers[] = { - {&handle_shutdown, NULL, GNUNET_MESSAGE_TYPE_SHUTDOWN, + {&handle_shutdown, NULL, GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN, sizeof (struct GNUNET_MessageHeader)}, {NULL, NULL, 0, 0} }; diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 069c6d5ee..1a29069c3 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -40,11 +40,6 @@ extern "C" */ #define GNUNET_MESSAGE_TYPE_TEST 0 -/** - * Request service shutdown. - */ -#define GNUNET_MESSAGE_TYPE_SHUTDOWN 1 - /** * Request DNS resolution. @@ -105,17 +100,15 @@ extern "C" #define GNUNET_MESSAGE_TYPE_ARM_IS_UNKNOWN 12 /** - * Acknowledge service shutting down, disconnect - * indicates service stopped. + * Request ARM service shutdown. */ -#define GNUNET_MESSAGE_TYPE_SHUTDOWN_ACK 13 +#define GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN 13 /** - * Deny service shutdown, disconnect indicates - * service won't be stopped as a result of shutdown - * message. + * Acknowledge service shutting down, disconnect + * indicates service stopped. */ -#define GNUNET_MESSAGE_TYPE_SHUTDOWN_REFUSE 14 +#define GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN_ACK 14 /** * HELLO message used for communicating peer addresses. diff --git a/src/util/client.c b/src/util/client.c index 55eb68d13..c87d239e6 100644 --- a/src/util/client.c +++ b/src/util/client.c @@ -624,30 +624,28 @@ service_shutdown_handler (void *cls, const struct GNUNET_MessageHeader *msg) else { GNUNET_assert(ntohs(msg->size) == sizeof(struct GNUNET_MessageHeader)); - switch (ntohs(msg->type)) - { - case GNUNET_MESSAGE_TYPE_SHUTDOWN_ACK: - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, - "Received confirmation for service shutdown.\n"); - shutdown_ctx->confirmed = GNUNET_YES; - GNUNET_CLIENT_receive (shutdown_ctx->sock, - &service_shutdown_handler, - shutdown_ctx, - GNUNET_TIME_UNIT_FOREVER_REL); - break; - case GNUNET_MESSAGE_TYPE_SHUTDOWN_REFUSE: - default: /* Fall through */ - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, - "Service shutdown refused!\n"); - if (shutdown_ctx->cont != NULL) - shutdown_ctx->cont(shutdown_ctx->cont_cls, GNUNET_YES); - - GNUNET_SCHEDULER_cancel(shutdown_ctx->sched, shutdown_ctx->cancel_task); - GNUNET_CLIENT_disconnect (shutdown_ctx->sock, GNUNET_NO); - GNUNET_free(shutdown_ctx); - break; - } + { + case GNUNET_MESSAGE_TYPE_SHUTDOWN_ACK: + GNUNET_log(GNUNET_ERROR_TYPE_WARNING, + "Received confirmation for service shutdown.\n"); + shutdown_ctx->confirmed = GNUNET_YES; + GNUNET_CLIENT_receive (shutdown_ctx->sock, + &service_shutdown_handler, + shutdown_ctx, + GNUNET_TIME_UNIT_FOREVER_REL); + break; + default: /* Fall through */ + GNUNET_log(GNUNET_ERROR_TYPE_WARNING, + "Service shutdown refused!\n"); + if (shutdown_ctx->cont != NULL) + shutdown_ctx->cont(shutdown_ctx->cont_cls, GNUNET_YES); + + GNUNET_SCHEDULER_cancel(shutdown_ctx->sched, shutdown_ctx->cancel_task); + GNUNET_CLIENT_disconnect (shutdown_ctx->sock, GNUNET_NO); + GNUNET_free(shutdown_ctx); + break; + } } } @@ -701,7 +699,7 @@ write_shutdown (void *cls, size_t size, void *buf) &service_shutdown_cancel, shutdown_ctx); msg = (struct GNUNET_MessageHeader *) buf; - msg->type = htons (GNUNET_MESSAGE_TYPE_SHUTDOWN); + msg->type = htons (GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN); msg->size = htons (sizeof (struct GNUNET_MessageHeader)); return sizeof (struct GNUNET_MessageHeader); } diff --git a/src/util/service.c b/src/util/service.c index 2214efe10..2022395f7 100644 --- a/src/util/service.c +++ b/src/util/service.c @@ -570,90 +570,6 @@ handle_test (void *cls, } -static size_t -transmit_shutdown_deny (void *cls, size_t size, void *buf) -{ - struct GNUNET_SERVER_Client *client = cls; - struct GNUNET_MessageHeader *msg; - - if (size < sizeof (struct GNUNET_MessageHeader)) - { - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return 0; /* client disconnected */ - } - msg = (struct GNUNET_MessageHeader *) buf; - msg->type = htons (GNUNET_MESSAGE_TYPE_SHUTDOWN_REFUSE); - msg->size = htons (sizeof (struct GNUNET_MessageHeader)); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - GNUNET_SERVER_client_drop(client); - return sizeof (struct GNUNET_MessageHeader); -} - -static size_t -transmit_shutdown_ack (void *cls, size_t size, void *buf) -{ - struct GNUNET_SERVER_Client *client = cls; - struct GNUNET_MessageHeader *msg; - - if (size < sizeof (struct GNUNET_MessageHeader)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Failed to transmit shutdown ACK.\n")); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return 0; /* client disconnected */ - } - - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Transmitting shutdown ACK.\n")); - - msg = (struct GNUNET_MessageHeader *) buf; - msg->type = htons (GNUNET_MESSAGE_TYPE_SHUTDOWN_ACK); - msg->size = htons (sizeof (struct GNUNET_MessageHeader)); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - GNUNET_SERVER_client_drop(client); - return sizeof (struct GNUNET_MessageHeader); -} - -/** - * Handler for SHUTDOWN message. - * - * @param cls closure (refers to service) - * @param client identification of the client - * @param message the actual message - */ -static void -handle_shutdown (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) -{ - struct GNUNET_SERVICE_Context *service = cls; - - GNUNET_SERVER_client_keep(client); - if (!service->allow_shutdown) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - _ - ("Received shutdown request, but configured to ignore!\n")); - GNUNET_SERVER_notify_transmit_ready (client, - sizeof(struct GNUNET_MessageHeader), - GNUNET_TIME_UNIT_FOREVER_REL, - &transmit_shutdown_deny, client); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Initiating shutdown as requested by client.\n")); - - GNUNET_SERVER_notify_transmit_ready (client, - sizeof(struct GNUNET_MessageHeader), - GNUNET_TIME_UNIT_FOREVER_REL, - &transmit_shutdown_ack, client); - - GNUNET_assert (service->sched != NULL); - GNUNET_SERVER_client_persist_ (client); - GNUNET_SCHEDULER_shutdown (service->sched); -} - - /** * Default handlers for all services. Will be copied and the * "callback_cls" fields will be replaced with the specific service @@ -662,8 +578,6 @@ handle_shutdown (void *cls, static const struct GNUNET_SERVER_MessageHandler defhandlers[] = { {&handle_test, NULL, GNUNET_MESSAGE_TYPE_TEST, sizeof (struct GNUNET_MessageHeader)}, - {&handle_shutdown, NULL, GNUNET_MESSAGE_TYPE_SHUTDOWN, - sizeof (struct GNUNET_MessageHeader)}, {NULL, NULL, 0, 0} }; -- 2.25.1