GNUnet  0.11.x
testing_api_cmd_netjail_start.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 
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
28 #include "gnunet_testing_ng_lib.h"
29 
30 #define NETJAIL_START_SCRIPT "./../testing/netjail_start.sh"
31 
37 {
38  // Child Wait handle
40 
41  // Number of local nodes in each namespace.
42  char *local_m;
43 
44  // The number of namespaces.
45  char *global_n;
46 
51 
52  // Flag indication if the script finished.
53  unsigned int finished;
54 };
55 
56 
61 static void
63  const struct GNUNET_TESTING_Command *cmd)
64 {
65  struct NetJailState *ns = cls;
66 
68  "netjail_start_cleanup!\n");
69 
70  if (NULL != ns->cwh)
71  {
73  ns->cwh = NULL;
74  }
75  if (NULL != ns->start_proc)
76  {
77  GNUNET_assert (0 ==
78  GNUNET_OS_process_kill (ns->start_proc,
79  SIGKILL));
81  GNUNET_OS_process_wait (ns->start_proc));
82  GNUNET_OS_process_destroy (ns->start_proc);
83  ns->start_proc = NULL;
84  }
85  GNUNET_free (ns);
86 }
87 
88 
93 static int
95  const void **ret,
96  const char *trait,
97  unsigned int index)
98 {
99  return GNUNET_OK;
100 }
101 
102 
107 static void
110  long unsigned int exit_code)
111 {
112  struct NetJailState *ns = cls;
113 
114  if (0 == exit_code)
115  {
116  ns->finished = GNUNET_YES;
117  }
118  else
119  {
121  "Child completed with an error!\n");
122  ns->finished = GNUNET_SYSERR;
123  }
124  GNUNET_OS_process_destroy (ns->start_proc);
125  ns->start_proc = NULL;
126 }
127 
128 
129 
137 static void
138 netjail_start_run (void *cls,
139  const struct GNUNET_TESTING_Command *cmd,
141 {
142  struct NetJailState *ns = cls;
143  char *const script_argv[] = {NETJAIL_START_SCRIPT,
144  ns->local_m,
145  ns->global_n,
146  NULL};
147  unsigned int helper_check = GNUNET_OS_check_helper_binary (
149  GNUNET_YES,
150  NULL);
151 
152  if (GNUNET_NO == helper_check)
153  {
155  "No SUID for %s!\n",
158  }
159  else if (GNUNET_NO == helper_check)
160  {
162  "%s not found!\n",
165  }
166 
168  NULL,
169  NULL,
170  NULL,
172  script_argv);
173 
174  ns->cwh = GNUNET_wait_child (ns->start_proc,
176  ns);
177  GNUNET_break (NULL != ns->cwh);
178 }
179 
180 
185 static int
188  void *cont_cls)
189 {
190  struct NetJailState *ns = cls;
191 
192  if (ns->finished)
193  {
194  cont (cont_cls);
195  }
196  return ns->finished;
197 }
198 
209  char *local_m,
210  char *global_n)
211 {
212  struct NetJailState *ns;
213 
214  ns = GNUNET_new (struct NetJailState);
215  ns->local_m = local_m;
216  ns->global_n = global_n;
217  ns->finished = GNUNET_NO;
218 
219  struct GNUNET_TESTING_Command cmd = {
220  .cls = ns,
221  .label = label,
222  .run = &netjail_start_run,
223  .finish = &netjail_start_finish,
224  .cleanup = &netjail_start_cleanup,
225  .traits = &netjail_start_traits
226  };
227 
228  return cmd;
229 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static struct GNUNET_NAMESTORE_Handle * ns
Handle to the namestore.
Definition: gnunet-abd.c:41
static long unsigned int exit_code
Handler exit code.
Definition: gnunet-qr.c:54
void GNUNET_wait_child_cancel(struct GNUNET_ChildWaitHandle *cwh)
Stop waiting on this child.
struct GNUNET_ChildWaitHandle * GNUNET_wait_child(struct GNUNET_OS_Process *proc, GNUNET_ChildCompletedCallback cb, void *cb_cls)
Starts the handling of the child processes.
#define GNUNET_log(kind,...)
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_YES
Definition: gnunet_common.h:97
@ GNUNET_NO
Definition: gnunet_common.h:94
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
void GNUNET_TESTING_interpreter_fail()
Current command failed, clean up and fail the test case.
#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.
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
int GNUNET_OS_check_helper_binary(const char *binary, int check_suid, const char *params)
Check whether an executable exists and possibly if the suid bit is set on the file.
struct GNUNET_OS_Process * GNUNET_OS_start_process_vap(enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename, char *const argv[])
Start a process.
Definition: os_priority.c:604
int GNUNET_OS_process_wait(struct GNUNET_OS_Process *proc)
Wait for a process to terminate.
Definition: os_priority.c:983
GNUNET_OS_ProcessStatusType
Process status types.
void GNUNET_OS_process_destroy(struct GNUNET_OS_Process *proc)
Cleans up process structure contents (OS-dependent) and deallocates it.
Definition: os_priority.c:286
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
Definition: os_priority.c:224
@ GNUNET_OS_INHERIT_STD_ERR
When this flag is set, the child process will inherit stderr of the parent.
Definition: gnunet_os_lib.h:91
void(* GNUNET_SCHEDULER_TaskCallback)(void *cls)
Signature of the main function of a task.
Struct which defines a Child Wait handle.
A command to be run by the interpreter.
const char * label
Label for the command.
void * cls
Closure for all commands with command-specific context information.
Global state of the interpreter, used by a command to access information about other commands.
Definition: testing.h:35
Struct to hold information for callbacks.
struct GNUNET_ChildWaitHandle * cwh
struct GNUNET_OS_Process * start_proc
The process id of the start script.
char * local_m
Number of nodes in a network namespace.
char * global_n
Number of network namespaces.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static void child_completed_callback(void *cls, enum GNUNET_OS_ProcessStatusType type, long unsigned int exit_code)
Callback which will be called if the setup script finished.
static int netjail_start_traits(void *cls, const void **ret, const char *trait, unsigned int index)
Trait function of this cmd does nothing.
static void netjail_start_cleanup(void *cls, const struct GNUNET_TESTING_Command *cmd)
The cleanup function of this cmd frees resources the cmd allocated.
static int netjail_start_finish(void *cls, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
This function checks the flag NetJailState::finished, if this cmd finished.
struct GNUNET_TESTING_Command GNUNET_TESTING_cmd_netjail_start(const char *label, char *local_m, char *global_n)
Create command.
#define NETJAIL_START_SCRIPT
static void netjail_start_run(void *cls, const struct GNUNET_TESTING_Command *cmd, struct GNUNET_TESTING_Interpreter *is)
The run method starts the script which setup the network namespaces.
struct GNUNET_TESTING_Interpreter * is