X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Fgnunet-helper-testbed.c;h=f3c56eb9db7806a904bb636b7c47f62a3f261848;hb=5742938289524f4c5fba7883742e4dd69cccf11d;hp=34640e4831c58d462490cb959d0fe23055fc99ad;hpb=f88a14b5347c832574a9862e49ebed59353ac6bf;p=oweals%2Fgnunet.git diff --git a/src/testbed/gnunet-helper-testbed.c b/src/testbed/gnunet-helper-testbed.c index 34640e483..f3c56eb9d 100644 --- a/src/testbed/gnunet-helper-testbed.c +++ b/src/testbed/gnunet-helper-testbed.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - Copyright (C) 2008--2013 Christian Grothoff (and other contributing authors) + Copyright (C) 2008--2013 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -124,23 +124,18 @@ static struct GNUNET_DISK_PipeHandle *sigpipe; /** * Task identifier for the read task */ -static struct GNUNET_SCHEDULER_Task * read_task_id; +static struct GNUNET_SCHEDULER_Task *read_task_id; /** * Task identifier for the write task */ -static struct GNUNET_SCHEDULER_Task * write_task_id; +static struct GNUNET_SCHEDULER_Task *write_task_id; /** * Task to kill the child */ static struct GNUNET_SCHEDULER_Task * child_death_task_id; -/** - * shutdown task id - */ -static struct GNUNET_SCHEDULER_Task * shutdown_task_id; - /** * Are we done reading messages from stdin? */ @@ -156,13 +151,11 @@ static int status; * Task to shut down cleanly * * @param cls NULL - * @param tc the task context */ static void -shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +shutdown_task (void *cls) { LOG_DEBUG ("Shutting down\n"); - shutdown_task_id = NULL; if (NULL != testbed) { LOG_DEBUG ("Killing testbed\n"); @@ -175,8 +168,12 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } if (NULL != write_task_id) { - GNUNET_SCHEDULER_cancel (write_task_id); + struct WriteContext *wc; + + wc = GNUNET_SCHEDULER_cancel (write_task_id); write_task_id = NULL; + GNUNET_free (wc->data); + GNUNET_free (wc); } if (NULL != child_death_task_id) { @@ -203,44 +200,26 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } -/** - * Scheduler shutdown task to be run now. - */ -static void -shutdown_now (void) -{ - if (NULL != shutdown_task_id) - GNUNET_SCHEDULER_cancel (shutdown_task_id); - shutdown_task_id = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); -} - - /** * Task to write to the standard out * * @param cls the WriteContext - * @param tc the TaskContext */ static void -write_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +write_task (void *cls) { struct WriteContext *wc = cls; ssize_t bytes_wrote; GNUNET_assert (NULL != wc); write_task_id = NULL; - if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) - { - GNUNET_free (wc->data); - GNUNET_free (wc); - return; - } bytes_wrote = GNUNET_DISK_file_write (stdout_fd, wc->data + wc->pos, wc->length - wc->pos); if (GNUNET_SYSERR == bytes_wrote) { - LOG (GNUNET_ERROR_TYPE_WARNING, "Cannot reply back configuration\n"); + LOG (GNUNET_ERROR_TYPE_WARNING, + "Cannot reply back configuration\n"); GNUNET_free (wc->data); GNUNET_free (wc); return; @@ -253,7 +232,8 @@ write_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) return; } write_task_id = - GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL, stdout_fd, + GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL, + stdout_fd, &write_task, wc); } @@ -263,10 +243,9 @@ write_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * process died). * * @param cls closure, NULL if we need to self-restart - * @param tc context */ static void -child_death_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +child_death_task (void *cls) { const struct GNUNET_DISK_FileHandle *pr; char c[16]; @@ -276,13 +255,6 @@ child_death_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) pr = GNUNET_DISK_pipe_handle (sigpipe, GNUNET_DISK_PIPE_END_READ); child_death_task_id = NULL; - if (0 == (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) - { - child_death_task_id = - GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, - pr, &child_death_task, NULL); - return; - } /* consume the signal */ GNUNET_break (0 < GNUNET_DISK_file_read (pr, &c, sizeof (c))); LOG_DEBUG ("Got SIGCHLD\n"); @@ -301,7 +273,7 @@ child_death_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (0 != PLIBC_KILL (0, GNUNET_TERM_SIG)) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "signal"); - shutdown_now (); /* Couldn't send the signal, we shutdown frowning */ + GNUNET_SCHEDULER_shutdown (); /* Couldn't send the signal, we shutdown frowning */ } return; } @@ -420,13 +392,16 @@ tokenizer_cb (void *cls, void *client, if (NULL != evstr) { #ifdef WINDOWS - GNUNET_assert (0 != SetEnvironmentVariable (GNUNET_TESTING_PREFIX, evstr)); + GNUNET_assert (0 != SetEnvironmentVariable (GNUNET_TESTING_PREFIX, + evstr)); #else - static char evar[2* PATH_MAX]; + char *evar; - GNUNET_assert (0 < GNUNET_snprintf (evar, sizeof (evar), - GNUNET_TESTING_PREFIX "=%s", evstr)); - putenv (evar); + GNUNET_asprintf (&evar, + GNUNET_TESTING_PREFIX "=%s", + evstr); + GNUNET_assert (0 == putenv (evar)); /* consumes 'evar', + see putenv(): becomes part of envrionment! */ #endif GNUNET_free (evstr); evstr = NULL; @@ -451,12 +426,15 @@ tokenizer_cb (void *cls, void *client, LOG_DEBUG ("Staring testbed with config: %s\n", config); binary = GNUNET_OS_get_libexec_binary_path ("gnunet-service-testbed"); { - static char evar[2 * PATH_MAX]; + char *evar; /* expose testbed configuration through env variable */ - GNUNET_assert (0 < GNUNET_snprintf (evar, sizeof (evar), - "%s=%s", ENV_TESTBED_CONFIG, config)); - GNUNET_assert (0 == putenv (evar)); + GNUNET_asprintf (&evar, + "%s=%s", + ENV_TESTBED_CONFIG, + config); + GNUNET_assert (0 == putenv (evar)); /* consumes 'evar', + see putenv(): becomes part of envrionment! */ evstr = NULL; } testbed = @@ -492,7 +470,8 @@ tokenizer_cb (void *cls, void *client, reply->config_size = htons ((uint16_t) config_size); wc->data = reply; write_task_id = - GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL, stdout_fd, + GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL, + stdout_fd, &write_task, wc); child_death_task_id = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, @@ -503,7 +482,7 @@ tokenizer_cb (void *cls, void *client, error: status = GNUNET_SYSERR; - shutdown_now (); + GNUNET_SCHEDULER_shutdown (); return GNUNET_SYSERR; } @@ -512,42 +491,41 @@ error: * Task to read from stdin * * @param cls NULL - * @param tc the task context */ static void -read_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +read_task (void *cls) { char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE]; ssize_t sread; read_task_id = NULL; - if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) - return; sread = GNUNET_DISK_file_read (stdin_fd, buf, sizeof (buf)); if ((GNUNET_SYSERR == sread) || (0 == sread)) { LOG_DEBUG ("STDIN closed\n"); - shutdown_now (); + GNUNET_SCHEDULER_shutdown (); return; } if (GNUNET_YES == done_reading) { /* didn't expect any more data! */ GNUNET_break_op (0); - shutdown_now (); + GNUNET_SCHEDULER_shutdown (); return; } - LOG_DEBUG ("Read %u bytes\n", sread); + LOG_DEBUG ("Read %u bytes\n", + (unsigned int) sread); if (GNUNET_OK != GNUNET_SERVER_mst_receive (tokenizer, NULL, buf, sread, GNUNET_NO, GNUNET_NO)) { GNUNET_break (0); - shutdown_now (); + GNUNET_SCHEDULER_shutdown (); return; } read_task_id = /* No timeout while reading */ - GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, stdin_fd, + GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, + stdin_fd, &read_task, NULL); } @@ -561,7 +539,9 @@ read_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * @param cfg configuration */ static void -run (void *cls, char *const *args, const char *cfgfile, +run (void *cls, + char *const *args, + const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { LOG_DEBUG ("Starting testbed helper...\n"); @@ -569,11 +549,11 @@ run (void *cls, char *const *args, const char *cfgfile, stdin_fd = GNUNET_DISK_get_handle_from_native (stdin); stdout_fd = GNUNET_DISK_get_handle_from_native (stdout); read_task_id = - GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, stdin_fd, + GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, + stdin_fd, &read_task, NULL); - shutdown_task_id = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, - NULL); + GNUNET_SCHEDULER_add_shutdown (&shutdown_task, + NULL); }