GNUnet  0.20.0
gnunet-cmds-helper.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2021 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
39 #include "platform.h"
40 #include "gnunet_util_lib.h"
41 #include "gnunet_testing_lib.h"
42 #include "gnunet_testing_ng_lib.h"
43 #include "gnunet_testing_plugin.h"
45 #include "testing.h"
46 #include "testing_cmds.h"
47 #include "gnunet_testing_plugin.h"
48 #include "gnunet_testing_barrier.h"
49 #include <zlib.h>
50 
51 
55 #define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
56 
60 #define LOG_DEBUG(...) LOG (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
61 
62 #define NODE_BASE_IP "192.168.15."
63 
64 #define KNOWN_BASE_IP "92.68.151."
65 
66 #define ROUTER_BASE_IP "92.68.150."
67 
68 /* Use the IP addresses below instead of the public ones,
69  * if the start script was not started from within a new namespace
70  * created by unshare. The UPNP test case needs public IP
71  * addresse for miniupnpd to function.
72  * FIXME We should introduce a switch indicating if public
73  * addresses should be used or not. This info has to be
74  * propagated from the start script to the c code.
75 #define KNOWN_BASE_IP "172.16.151."
76 
77 #define ROUTER_BASE_IP "172.16.150."
78 */
79 
81 
83 
89 {
94  char *n;
95 
100  char *m;
101 
106  char *global_n;
107 
112  char *local_m;
113 
117  unsigned int *read_file;
118 
123 };
124 
128 struct WriteContext
129 {
133  void *data;
134 
138  size_t length;
139 
143  size_t pos;
144 };
145 
155 
160 
165 
170 
175 
180 
185 
189 static int done_reading;
190 
194 static int status;
195 
196 
202 static void
203 do_shutdown (void *cls)
204 {
205 
206  LOG_DEBUG ("Shutting down.\n");
207 
208  if (NULL != read_task_id)
209  {
211  read_task_id = NULL;
212  }
213  if (NULL != write_task_id)
214  {
215  struct WriteContext *wc;
216 
218  write_task_id = NULL;
219  GNUNET_free (wc->data);
220  GNUNET_free (wc);
221  }
222  if (NULL != stdin_fd)
224  if (NULL != stdout_fd)
227  tokenizer = NULL;
229  NULL);
231 }
232 
233 
239 static void
240 write_task (void *cls)
241 {
242  struct WriteContext *wc = cls;
243  ssize_t bytes_wrote;
244 
245  GNUNET_assert (NULL != wc);
246  write_task_id = NULL;
247  bytes_wrote = GNUNET_DISK_file_write (stdout_fd,
248  wc->data + wc->pos,
249  wc->length - wc->pos);
251  "message send to master loop\n");
252  if (GNUNET_SYSERR == bytes_wrote)
253  {
255  "Cannot reply back successful initialization\n");
256  GNUNET_free (wc->data);
257  GNUNET_free (wc);
258  return;
259  }
260  wc->pos += bytes_wrote;
261  if (wc->pos == wc->length)
262  {
263  GNUNET_free (wc->data);
264  GNUNET_free (wc);
265  return;
266  }
268  stdout_fd,
269  &write_task,
270  wc);
271 }
272 
273 
278 static void
280  size_t msg_length)
281 {
282  struct WriteContext *wc;
283 
285  "write message to master loop\n");
286  wc = GNUNET_new (struct WriteContext);
287  wc->length = msg_length;
288  wc->data = message;
291  stdout_fd,
292  &write_task,
293  wc);
294 }
295 
296 
297 static void
299 {
301  "doing shutdown after delay\n");
303 }
304 
305 
306 struct GNUNET_MessageHeader *
308 {
310  size_t msg_length;
311 
312  msg_length = sizeof(struct GNUNET_TESTING_CommandLocalFinished);
315  reply->header.size = htons ((uint16_t) msg_length);
316 
317  return (struct GNUNET_MessageHeader *) reply;
318 }
319 
320 
321 static void
323 {
325  size_t msg_length;
326 
327  msg_length = sizeof(struct GNUNET_TESTING_CommandLocalFinished);
330  reply->header.size = htons ((uint16_t) msg_length);
331  reply->rv = rv;
332 
334  "message prepared\n");
335  write_message ((struct GNUNET_MessageHeader *) reply, msg_length);
337  "message send\n");
338  // FIXME: bad hack, do not write 1s, have continuation after write_message() is done!
340  "delaying shutdown\n");
343  NULL);
344 }
345 
346 
359 static enum GNUNET_GenericReturnValue
360 tokenizer_cb (void *cls,
361  const struct GNUNET_MessageHeader *message)
362 {
363  struct NodeIdentifier *ni = cls;
365  struct GNUNET_TESTING_CommandHelperReply *reply;
366  char *binary;
367  char *plugin_name;
368  size_t plugin_name_size;
369  uint16_t msize;
370  uint16_t type;
371  size_t msg_length;
372  char *router_ip;
373  char *node_ip;
374  unsigned int namespace_n;
375 
376  type = ntohs (message->type);
377  msize = ntohs (message->size);
379  "Received message type %u and size %u\n",
380  type,
381  msize);
382  switch (type)
383  {
385  {
386  msg = (const struct GNUNET_TESTING_CommandHelperInit *) message;
387  plugin_name_size = ntohs (msg->plugin_name_size);
388  if ((sizeof(struct GNUNET_TESTING_CommandHelperInit) + plugin_name_size) >
389  msize)
390  {
391  GNUNET_break (0);
393  "Received unexpected message -- exiting\n");
394  goto error;
395  }
398  ((char *) &msg[1]),
399  plugin_name_size + 1);
400 
401  binary = GNUNET_OS_get_libexec_binary_path ("gnunet-cmd");
402 
403  plugin = GNUNET_new (struct TestcasePlugin);
405  NULL);
407 
408  plugin->global_n = ni->global_n;
409  plugin->local_m = ni->local_m;
410  plugin->n = ni->n;
411  plugin->m = ni->m;
412 
413  GNUNET_asprintf (&router_ip,
414  ROUTER_BASE_IP "%s",
415  plugin->n);
416  {
417  char dummy;
418 
419  if (1 !=
420  sscanf (plugin->n,
421  "%u%c",
422  &namespace_n,
423  &dummy))
424  {
425  // FIXME: how to handle error nicely?
426  GNUNET_break (0);
427  namespace_n = 0;
428  }
429  }
430 
431  if (0 == namespace_n)
432  {
434  "known node n: %s\n",
435  plugin->n);
436  GNUNET_asprintf (&node_ip,
437  KNOWN_BASE_IP "%s",
438  plugin->m);
439  }
440  else
441  {
443  "subnet node n: %s\n",
444  plugin->n);
445  GNUNET_asprintf (&node_ip,
446  NODE_BASE_IP "%s",
447  plugin->m);
448  }
449 
451  router_ip,
452  node_ip,
453  plugin->m,
454  plugin->n,
455  plugin->local_m,
456  ni->topology_data,
457  ni->read_file,
458  &finished_cb);
459  GNUNET_free (node_ip);
460  GNUNET_free (binary);
461  GNUNET_free (router_ip);
463 
464  msg_length = sizeof(struct GNUNET_TESTING_CommandHelperReply);
467  reply->header.size = htons ((uint16_t) msg_length);
468  write_message (&reply->header,
469  msg_length);
470  return GNUNET_OK;
471  }
473  {
474  const char *barrier_name;
475  struct CommandBarrierCrossable *adm = (struct
476  CommandBarrierCrossable *) message;
477 
478  barrier_name = (const char *) &adm[1];
480  "cross barrier %s\n",
481  barrier_name);
483  barrier_name);
484  return GNUNET_OK;
485  }
487  {
489  "all peers started\n");
491  return GNUNET_OK;
492  }
494  {
496  "all local tests prepared\n");
498  return GNUNET_OK;
499  }
500  default:
501  LOG (GNUNET_ERROR_TYPE_WARNING, "Received unexpected message -- exiting\n");
502  goto error;
503  }
504 
505 error:
508  "tokenizer shutting down!\n");
510  return GNUNET_SYSERR;
511 }
512 
513 
519 static void
520 read_task (void *cls)
521 {
523  ssize_t sread;
524 
525  read_task_id = NULL;
526  sread = GNUNET_DISK_file_read (stdin_fd, buf, sizeof(buf));
527  if ((GNUNET_SYSERR == sread) || (0 == sread))
528  {
529  LOG_DEBUG ("STDIN closed\n");
531  return;
532  }
533  if (GNUNET_YES == done_reading)
534  {
535  /* didn't expect any more data! */
536  GNUNET_break_op (0);
538  "tokenizer shutting down during reading, didn't expect any more data!\n");
540  return;
541  }
542  LOG_DEBUG ("Read %u bytes\n", (unsigned int) sread);
543  /* FIXME: could introduce a GNUNET_MST_read2 to read
544  directly from 'stdin_fd' and save a memcpy() here */
545  if (GNUNET_OK !=
547  {
548  GNUNET_break (0);
550  "tokenizer shutting down during reading, writing to buffer failed!\n");
552  return;
553  }
554  read_task_id /* No timeout while reading */
556  stdin_fd,
557  &read_task,
558  NULL);
559 }
560 
561 
570 static void
571 run (void *cls,
572  char *const *args,
573  const char *cfgfile,
574  const struct GNUNET_CONFIGURATION_Handle *cfg)
575 {
576  struct NodeIdentifier *ni = cls;
577 
579  "Starting interpreter loop helper...\n");
580 
582  ni);
586  stdin_fd,
587  &read_task,
588  NULL);
590  NULL);
592  "Interpreter loop helper started.\n");
593 }
594 
595 
599 static void
601 {
602  static char c;
603  int old_errno; /* back-up errno */
604 
605  old_errno = errno;
606  GNUNET_break (
607  1 ==
610  &c,
611  sizeof(c)));
612  errno = old_errno;
613 }
614 
615 
623 int
624 main (int argc, char **argv)
625 {
626  struct NodeIdentifier *ni;
630  };
631  int ret;
632  unsigned int sscanf_ret;
633  int i;
634  size_t topology_data_length = 0;
635  unsigned int read_file;
636  char cr[2] = "\n\0";
637 
638  GNUNET_log_setup ("gnunet-cmds-helper",
639  "DEBUG",
640  NULL);
641  ni = GNUNET_new (struct NodeIdentifier);
642  ni->global_n = argv[1];
643  ni->local_m = argv[2];
644  ni->m = argv[3];
645  ni->n = argv[4];
646 
647  errno = 0;
648  sscanf_ret = sscanf (argv[5], "%u", &read_file);
649 
650  if (errno != 0)
651  {
653  }
654  else if (1 == read_file)
655  ni->topology_data = argv[6];
656  else if (0 == read_file)
657  {
658  for (i = 6; i<argc; i++)
659  topology_data_length += strlen (argv[i]) + 1;
661  "topo data length %lu\n",
662  topology_data_length);
663  ni->topology_data = GNUNET_malloc (topology_data_length);
664  memset (ni->topology_data, '\0', topology_data_length);
665  for (i = 6; i<argc; i++)
666  {
667  strcat (ni->topology_data, argv[i]);
668  strcat (ni->topology_data, cr);
669  }
670  }
671  else
672  {
674  "Wrong input for the fourth argument\n");
675  }
676  GNUNET_assert (0 < sscanf_ret);
677  ni->read_file = &read_file;
678  ni->topology_data[topology_data_length - 1] = '\0';
680  "topo data %s\n",
681  ni->topology_data);
682 
683  status = GNUNET_OK;
684  if (NULL ==
686  {
687  GNUNET_break (0);
688  return 1;
689  }
690  shc_chld =
693  ret = GNUNET_PROGRAM_run (argc,
694  argv,
695  "gnunet-cmds-helper",
696  "Helper for starting a local interpreter loop",
697  options,
698  &run,
699  ni);
700 
702  "Finishing helper\n");
704  shc_chld = NULL;
706  GNUNET_free (ni);
707  if (GNUNET_OK != ret)
708  return 1;
709  return (GNUNET_OK == status) ? 0 : 1;
710 }
711 
712 
713 /* end of gnunet-cmds-helper.c */
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
static struct GNUNET_SIGNAL_Context * shc_chld
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
struct GNUNET_MessageHeader * GNUNET_TESTING_send_local_test_finished_msg()
static void write_message(struct GNUNET_MessageHeader *message, size_t msg_length)
Callback to write a message to the master loop.
struct GNUNET_MessageStreamTokenizer * tokenizer
Our message stream tokenizer.
static void finished_cb(enum GNUNET_GenericReturnValue rv)
static void read_task(void *cls)
Task to read from stdin.
int main(int argc, char **argv)
Main function.
struct TestcasePlugin * plugin
The process handle to the testbed service.
static struct GNUNET_DISK_FileHandle * stdout_fd
Disk handle for stdout.
static int status
Result to return in case we fail.
#define LOG_DEBUG(...)
Debug logging shorthand.
static void do_shutdown(void *cls)
Task to shut down cleanly.
static struct GNUNET_DISK_PipeHandle * sigpipe
Pipe used to communicate shutdown via signal.
static void sighandler_child_death()
Signal handler called for SIGCHLD.
struct GNUNET_SCHEDULER_Task * finished_task
#define NODE_BASE_IP
static struct GNUNET_SCHEDULER_Task * read_task_id
Task identifier for the read task.
#define ROUTER_BASE_IP
static void write_task(void *cls)
Task to write to the standard out.
#define KNOWN_BASE_IP
struct GNUNET_TESTING_Interpreter * is
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
Main function that will be run.
#define LOG(kind,...)
Generic logging shortcut.
static struct GNUNET_SCHEDULER_Task * write_task_id
Task identifier for the write task.
static struct GNUNET_DISK_FileHandle * stdin_fd
Disk handle from stdin.
static int done_reading
Are we done reading messages from stdin?
static enum GNUNET_GenericReturnValue tokenizer_cb(void *cls, const struct GNUNET_MessageHeader *message)
Functions with this signature are called whenever a complete message is received by the tokenizer.
static void delay_shutdown_cb()
static struct in_addr dummy
Target "dummy" address of the packet we pretend to respond to.
static char * plugin_name
Name of our plugin.
static char buf[2048]
API to manage barriers.
Convenience API for writing testcases for GNUnet.
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message,...
struct GNUNET_DISK_FileHandle * GNUNET_DISK_get_handle_from_native(FILE *fd)
Get a handle from a native FD.
Definition: disk.c:1346
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:686
enum GNUNET_GenericReturnValue GNUNET_DISK_pipe_close(struct GNUNET_DISK_PipeHandle *p)
Closes an interprocess channel.
Definition: disk.c:1587
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1308
ssize_t GNUNET_DISK_file_read(const struct GNUNET_DISK_FileHandle *h, void *result, size_t len)
Read the contents of a binary file into a buffer.
Definition: disk.c:622
const struct GNUNET_DISK_FileHandle * GNUNET_DISK_pipe_handle(const struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd n)
Get the handle to a particular pipe end.
Definition: disk.c:1617
struct GNUNET_DISK_PipeHandle * GNUNET_DISK_pipe(enum GNUNET_DISK_PipeFlags pf)
Creates an interprocess channel.
Definition: disk.c:1444
@ GNUNET_DISK_PF_NONE
No special options, use non-blocking read/write operations.
@ GNUNET_DISK_PIPE_END_WRITE
The writing-end of a pipe.
#define GNUNET_log(kind,...)
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
char * GNUNET_OS_get_libexec_binary_path(const char *progname)
Given the name of a gnunet-helper, gnunet-service or gnunet-daemon binary, try to prefix it with the ...
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:242
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:198
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:400
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_ALL_PEERS_STARTED
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_LOCAL_FINISHED
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_ALL_LOCAL_TESTS_PREPARED
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_BARRIER_CROSSABLE
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_REPLY
The reply message from gnunet-cmds-helper.
#define GNUNET_MESSAGE_TYPE_CMDS_HELPER_INIT
The initialization message towards gnunet-cmds-helper.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:562
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_file(struct GNUNET_TIME_Relative delay, const struct GNUNET_DISK_FileHandle *rfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition: scheduler.c:1656
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_write_file(struct GNUNET_TIME_Relative delay, const struct GNUNET_DISK_FileHandle *wfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition: scheduler.c:1689
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1334
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:975
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1272
enum GNUNET_GenericReturnValue GNUNET_MST_from_buffer(struct GNUNET_MessageStreamTokenizer *mst, const char *buf, size_t size, int purge, int one_shot)
Add incoming data to the receive buffer and call the callback for all complete messages.
Definition: mst.c:101
void GNUNET_MST_destroy(struct GNUNET_MessageStreamTokenizer *mst)
Destroys a tokenizer.
Definition: mst.c:404
struct GNUNET_MessageStreamTokenizer * GNUNET_MST_create(GNUNET_MessageTokenizerCallback cb, void *cb_cls)
Create a message stream tokenizer.
Definition: mst.c:86
struct GNUNET_SIGNAL_Context * GNUNET_SIGNAL_handler_install(int signal, GNUNET_SIGNAL_Handler handler)
Install a signal handler that will be run if the given signal is received.
Definition: signal.c:52
void GNUNET_SIGNAL_handler_uninstall(struct GNUNET_SIGNAL_Context *ctx)
Uninstall a previously installed signal handler.
Definition: signal.c:78
size_t GNUNET_strlcpy(char *dst, const char *src, size_t n)
Like strlcpy but portable.
Definition: strings.c:138
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_UNIT_SECONDS
One second.
enum GNUNET_GenericReturnValue read_file(char const *const filename, char **buffer)
Definition: pabc_helper.c:71
#define GNUNET_SIGCHLD
Definition: platform.h:42
Message send to a child loop to inform the child loop about a barrier being advanced.
Definition: testing.h:35
Handle used to access files (and pipes).
Handle used to manage a pipe.
Definition: disk.c:68
Definition of a command line option.
Header for all communications.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
Handle to a message stream tokenizer.
Definition: mst.c:45
Entry in list of pending tasks.
Definition: scheduler.c:136
Initialization message for gnunet-cmds-testbed to start cmd binary.
Definition: testing_cmds.h:39
Reply message from cmds helper process.
Definition: testing_cmds.h:58
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_CMDS_HELPER_REPLY.
Definition: testing_cmds.h:62
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_CMDS_HELPER_LOCAL_FINISHED.
Definition: testing_cmds.h:86
enum GNUNET_GenericReturnValue rv
The exit status local test return with.
Definition: testing_cmds.h:91
Global state of the interpreter, used by a command to access information about other commands.
GNUNET_TESTING_PLUGIN_ALL_LOCAL_TESTS_PREPARED all_local_tests_prepared
GNUNET_TESTING_PLUGIN_ALL_PEERS_STARTED all_peers_started
GNUNET_TESTING_PLUGIN_StartTestCase start_testcase
Struct with information about a specific node and the whole network namespace setup.
unsigned int * read_file
Shall we read the topology from file, or from a string.
char * topology_data
String with topology data or name of topology file.
char * m
The number of the node in the namespace.
char * n
The number of the namespace this node is in.
char * local_m
The number of local nodes per namespace.
char * global_n
The number of namespaces.
Handle for a plugin.
Definition: testing.h:94
char * global_n
The number of namespaces.
Definition: testing.h:121
char * local_m
The number of local nodes per namespace.
Definition: testing.h:127
char * n
The number of the namespace this node is in.
Definition: testing.h:133
char * m
The number of the node in the namespace.
Definition: testing.h:139
char * library_name
Name of the shared library.
Definition: testing.h:98
struct GNUNET_TESTING_PluginFunctions * api
Plugin API.
Definition: testing.h:103
Context for a single write on a chunk of memory.
size_t pos
The current position from where the write operation should begin.
size_t length
The length of the data.
void * data
The data to write.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
void TST_interpreter_finish_attached_cmds(struct GNUNET_TESTING_Interpreter *is, const char *barrier_name)
Finish all "barrier reached" comands attached to this barrier.
Message formats for communication between testing cmds helper and testcase plugins.