X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftesting%2Fgnunet-testing-run-service.c;h=988b67e4fc9d4dfdee550f2e55e76f3fb75a63a9;hb=bcbd694ad35e182e5a1486b545ea0706082ee94a;hp=fe0028971d4a2dad09fd54417ec0b3305de703de;hpb=0208a977b07da249d2a849c349b6f70dce62a8a5;p=oweals%2Fgnunet.git diff --git a/src/testing/gnunet-testing-run-service.c b/src/testing/gnunet-testing-run-service.c index fe0028971..988b67e4f 100644 --- a/src/testing/gnunet-testing-run-service.c +++ b/src/testing/gnunet-testing-run-service.c @@ -28,125 +28,147 @@ * Outputs the path to the temporary configuration file to stdout. * * The peer will run until this program is killed, - * or stdin is closed. When reading the character 'r' from stdin, the running service is - * restarted with the same configuration. + * or stdin is closed. When reading the character 'r' from stdin, + * the running service is restarted with the same configuration. * * This executable is intended to be used by gnunet-java, in order to reliably * start and stop services for test cases. */ - #include "platform.h" -#include "gnunet_getopt_lib.h" -#include "gnunet_program_lib.h" #include "gnunet_util_lib.h" -#include "gnunet_signal_lib.h" #include "gnunet_testing_lib-new.h" -#include "gnunet_os_lib.h" +#define LOG(kind,...) \ + GNUNET_log_from (kind, "gnunet-testing", __VA_ARGS__) -static struct GNUNET_DISK_FileHandle fh; -static char *tmpfilename = NULL; -static GNUNET_SCHEDULER_TaskIdentifier tid = GNUNET_SCHEDULER_NO_TASK; -static struct GNUNET_TESTING_Peer *my_peer = NULL; + +/** + * File handle to STDIN, for reading restart/quit commands. + */ +static struct GNUNET_DISK_FileHandle *fh; + +/** + * FIXME + */ +static char *tmpfilename; + +/** + * FIXME + */ +static GNUNET_SCHEDULER_TaskIdentifier tid; + +/** + * FIXME + */ +static struct GNUNET_TESTING_Peer *my_peer; -#define LOG(kind,...) \ - GNUNET_log_from (kind, "gnunettestingnew", __VA_ARGS__) /** * Cleanup called by signal handlers and when stdin is closed. - * Removes the temporary file with the configuration and shuts down the scheduler. + * Removes the temporary file. + * + * @param cls unused + * @param tc scheduler context */ -void -cleanup (void) +static void +cleanup (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { if (NULL != tmpfilename) { - remove (tmpfilename); + if (0 != UNLINK (tmpfilename)) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", tmpfilename); + } + if (GNUNET_SCHEDULER_NO_TASK != tid) + { + GNUNET_SCHEDULER_cancel (tid); + tid = GNUNET_SCHEDULER_NO_TASK; + } + if (NULL != fh) + { + GNUNET_DISK_file_close (fh); + fh = NULL; } - GNUNET_SCHEDULER_shutdown (); } + /** * Called whenever we can read stdin non-blocking + * + * @param cls unused + * @param tc scheduler context */ -void +static void stdin_cb (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { int c; - if (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason) - { - return; - } - if (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason) + tid = GNUNET_SCHEDULER_NO_TASK; + if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason)) + return; + GNUNET_assert (0 != (GNUNET_SCHEDULER_REASON_READ_READY & tc->reason)); + c = getchar (); + switch (c) { - c = getchar (); - if (EOF == c) - { - tid = GNUNET_SCHEDULER_NO_TASK; - cleanup (); - } - else - { - if (c == 'r') - { - GNUNET_TESTING_peer_stop(my_peer); - GNUNET_TESTING_peer_start(my_peer); - printf("restarted\n"); - fflush(stdout); - } - tid = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, &fh, &stdin_cb, NULL); - } + case EOF: + case 'q': + GNUNET_SCHEDULER_shutdown (); return; + case 'r': + GNUNET_TESTING_peer_stop (my_peer); + GNUNET_TESTING_peer_start (my_peer); + printf ("restarted\n"); + fflush (stdout); + break; + case '\n': + case '\r': + /* ignore whitespace */ + break; + default: + fprintf (stderr, _("Unknown command, use 'q' to quit or 'r' to restart peer\n")); + break; } - GNUNET_break (0); + tid = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, fh, + &stdin_cb, NULL); } + /** * Main function called by the testing library. * Executed inside a running scheduler. + * + * @param cls unused + * @param cfg configuration of the peer that was started + * @param peer handle to the peer */ -void +static void testing_main (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, - const struct GNUNET_TESTING_Peer *peer) + struct GNUNET_TESTING_Peer *peer) { - my_peer = (struct GNUNET_TESTING_Peer *) peer; - tmpfilename = tmpnam (NULL); - if (NULL == tmpfilename) + my_peer = peer; + if (NULL == (tmpfilename = GNUNET_DISK_mktemp ("gnunet-testing"))) { GNUNET_break (0); - cleanup (); + GNUNET_SCHEDULER_shutdown (); return; } - if (GNUNET_SYSERR == - GNUNET_CONFIGURATION_write((struct GNUNET_CONFIGURATION_Handle *) cfg, tmpfilename)) + GNUNET_CONFIGURATION_write ((struct GNUNET_CONFIGURATION_Handle *) cfg, + tmpfilename)) { GNUNET_break (0); return; } - - printf("%s\n", tmpfilename); + printf("ok\n%s\n", tmpfilename); fflush(stdout); - - GNUNET_break(NULL != GNUNET_SIGNAL_handler_install(SIGTERM, &cleanup)); - GNUNET_break(NULL != GNUNET_SIGNAL_handler_install(SIGINT, &cleanup)); - -#if !WINDOWS - fh.fd = 0; /* 0=stdin */ -#else - /* FIXME: box GetStdHandle(STD_INPUT_HANDLE) somehow. - * Note that it will only work if parent process spawns - * gnunet-testing-run-service with custom-created asynchronous standard input - */ -#endif - tid = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, &fh, &stdin_cb, NULL); + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup, NULL); + fh = GNUNET_DISK_get_handle_from_native (stdin); + tid = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, fh, + &stdin_cb, NULL); } - /** * The main function. * @@ -157,30 +179,33 @@ testing_main (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, int main (int argc, char *const *argv) { + static char *cfg_name; + static char *srv_name; static const struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_HELP("tool to start a service for testing"), + {'c', "config", "FILENAME", + gettext_noop ("name of the template configuration file to use (optional)"), 1, + &GNUNET_GETOPT_set_string, &cfg_name}, + {'s', "service", "SERVICE", + gettext_noop ("name of the service to run"), 1, + &GNUNET_GETOPT_set_string, &srv_name}, + GNUNET_GETOPT_OPTION_HELP ("tool to start a service for testing"), GNUNET_GETOPT_OPTION_END }; - int arg_start; int ret; - arg_start = GNUNET_GETOPT_run("gnunet-testing-run-service", options, argc, argv); - - if (arg_start == GNUNET_SYSERR) - { + if (GNUNET_SYSERR == + GNUNET_GETOPT_run("gnunet-testing-run-service", options, argc, argv)) return 1; + ret = GNUNET_TESTING_service_run ("gnunet_service_test", srv_name, + cfg_name, &testing_main, NULL); + if (0 != ret) + { + printf ("error\n"); } - - if (arg_start != 1 || argc != 2) + else { - fprintf (stderr, "Invalid number of arguments\n"); - return 1; + printf ("bye\n"); } - - ret = GNUNET_TESTING_service_run_restartable ("gnunet_service_test", argv[1], - NULL, &testing_main, NULL); - - printf ("bye\n"); - return ret; } +