diff options
author | grothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96> | 2012-06-14 11:28:23 +0000 |
---|---|---|
committer | grothoff <grothoff@140774ce-b5e7-0310-ab8b-a85725594a96> | 2012-06-14 11:28:23 +0000 |
commit | 88cbda80015ed69f2e8c56c5638df8703be1c71a (patch) | |
tree | 0d0d85f026803decb2df4924abe0d2d583c5aec5 /src | |
parent | 7e5b0e4fa93cf7ed863ff6592e4cd80174a17a97 (diff) |
-pogen
git-svn-id: https://gnunet.org/svn/gnunet@21995 140774ce-b5e7-0310-ab8b-a85725594a96
Diffstat (limited to 'src')
-rw-r--r-- | src/testing/gnunet-testing-run-service.c | 166 |
1 files changed, 94 insertions, 72 deletions
diff --git a/src/testing/gnunet-testing-run-service.c b/src/testing/gnunet-testing-run-service.c index c9e1152607..fa98e1a6c4 100644 --- a/src/testing/gnunet-testing-run-service.c +++ b/src/testing/gnunet-testing-run-service.c @@ -44,109 +44,134 @@ #include "gnunet_os_lib.h" -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; +#define LOG(kind,...) \ + GNUNET_log_from (kind, "gnunet-testing", __VA_ARGS__) + + +/** + * FIXME + */ +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 || 'q' == c) - { - tid = GNUNET_SCHEDULER_NO_TASK; - cleanup (); - } - else - { - if ('r' == c) - { - 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) { my_peer = (struct GNUNET_TESTING_Peer *) peer; - tmpfilename = tmpnam (NULL); - if (NULL == tmpfilename) + if (NULL == (tmpfilename = GNUNET_DISK_mktemp ("gnunet-testing"))) { GNUNET_break (0); cleanup (); 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("started\n%s\n", tmpfilename); + printf("%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 + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREFER_REL, &cleanup); + 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,29 +182,26 @@ 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 configuration file to use"), 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; - } - - if (arg_start != 1 || argc != 2) - { - fprintf (stderr, "Invalid number of arguments\n"); - return 1; - } - - ret = GNUNET_TESTING_service_run_restartable ("gnunet_service_test", argv[1], - NULL, &testing_main, NULL); - if (ret) + ret = GNUNET_TESTING_service_run_restartable ("gnunet_service_test", srv_name, + cfg_name, &testing_main, NULL); + if (0 != ret) { printf ("error\n"); } |