45{
50
56};
57
58
63
68
73
74
80static void
82{
84
88 control_pipe = NULL;
89}
90
91
97static void
99{
101 char sig;
102 char *pipe_fd;
104
107 if (
sizeof(sig) !=
ret)
108 {
113 control_pipe = NULL;
116 return;
117 }
119 GNUNET_assert ((NULL == pipe_fd) || (strlen (pipe_fd) <= 0));
121 "Got control code %d from parent via pipe %s\n",
122 sig,
123 pipe_fd);
125 control_pipe,
127 control_pipe);
129}
130
131
132void
134{
135 const char *env_buf;
136 char *env_buf_end;
138 uint64_t pipe_fd;
139
140 (void) cls;
142 {
143
145 return;
146 }
148 if ((NULL == env_buf) || (strlen (env_buf) <= 0))
149 {
151 "Not installing a handler because $%s is empty\n",
154 return;
155 }
156 errno = 0;
157 pipe_fd = strtoull (env_buf, &env_buf_end, 16);
158 if ((0 != errno) || (env_buf == env_buf_end))
159 {
162 return;
163 }
164 if (pipe_fd >= FD_SETSIZE)
165 {
167 "GNUNET_OS_CONTROL_PIPE `%s' contains garbage?\n",
168 env_buf);
170 return;
171 }
172
174
175 if (NULL == control_pipe)
176 {
179 return;
180 }
182 "Adding parent control handler pipe `%s' to the scheduler\n",
183 env_buf);
185 control_pipe,
187 control_pipe);
190}
191
192
203{
206}
207
208
209int
211 int sig)
212{
214 char csig;
215
216 csig = (char) sig;
218 {
220 "Sending signal %d to pid: %u via pipe\n",
221 sig,
224 if (
sizeof(csig) ==
ret)
225 return 0;
226 }
227
228 switch (sig)
229 {
230 case SIGHUP:
231 case SIGINT:
232 case SIGKILL:
233 case SIGTERM:
234#if (SIGTERM != GNUNET_TERM_SIG)
236#endif
238 "Sending signal %d to pid: %u via system call\n",
239 sig,
241 return kill (proc->
pid, sig);
242 default:
244 "Sending signal %d to pid: %u via system call\n",
245 sig,
247 return kill (proc->
pid, sig);
248 }
249}
250
251
252pid_t
254{
256}
257
258
259void
261{
264
266}
267
268
276static void
278 int flags)
279{
280 int fd;
281
282 fd = open ("/dev/null", flags);
283 if (-1 == fd)
284 {
286 return;
287 }
288 if (fd == target_fd)
289 return;
290 if (-1 == dup2 (fd, target_fd))
291 {
294 return;
295 }
297}
298
299
321 const int *lsocks,
323 char *const argv[])
324{
326 char fds[16];
330 int childpipe_read_fd;
331 int i;
332 int j;
333 int k;
334 int tgt;
335 int flags;
336 int *lscp;
338 int fd_stdout_write;
339 int fd_stdout_read;
340 int fd_stderr_write;
341 int fd_stderr_read;
342 int fd_stdin_read;
343 int fd_stdin_write;
344
347 return NULL;
349 {
351 int dup_childpipe_read_fd = -1;
352
354 if (NULL == childpipe)
355 return NULL;
356 childpipe_read =
358 childpipe_write =
361 if ((NULL == childpipe_read) || (NULL == childpipe_write) ||
363 &childpipe_read_fd)) ||
364 (-1 == (dup_childpipe_read_fd = dup (childpipe_read_fd))))
365 {
366 if (NULL != childpipe_read)
368 if (NULL != childpipe_write)
370 if (0 <= dup_childpipe_read_fd)
372 return NULL;
373 }
374 childpipe_read_fd = dup_childpipe_read_fd;
376 }
377 else
378 {
379 childpipe_write = NULL;
380 childpipe_read_fd = -1;
381 }
382 if (NULL != pipe_stdin)
383 {
388 &fd_stdin_read));
393 &fd_stdin_write));
394 }
395 if (NULL != pipe_stdout)
396 {
401 &fd_stdout_write));
406 &fd_stdout_read));
407 }
408 if (NULL != pipe_stderr)
409 {
414 &fd_stderr_read));
419 &fd_stderr_write));
420 }
421 lscp = NULL;
423 if (NULL != lsocks)
424 {
425 i = 0;
426 while (-1 != (k = lsocks[i++]))
429 }
430#if DARWIN
431
432 #pragma GCC diagnostic push
433 #pragma GCC diagnostic ignored "-Wdeprecated"
434 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
435 #pragma clang diagnostic push
436 #pragma clang diagnostic ignored "-Wdeprecated"
438 #pragma clang diagnostic pop
439 #pragma GCC diagnostic pop
440#else
442#endif
444 {
445 int eno = errno;
446
448 "fork");
451 0);
452 if (NULL != childpipe_write)
454 if (0 <= childpipe_read_fd)
456 errno = eno;
457 return NULL;
458 }
460 {
466 {
468 }
470 return gnunet_proc;
471 }
472 if (0 <= childpipe_read_fd)
473 {
474 char fdbuf[100];
475#ifndef DARWIN
476
478#endif
479 snprintf (fdbuf,
480 sizeof (fdbuf),
481 "%x",
482 childpipe_read_fd);
484 fdbuf,
485 1);
486 }
487 else
489 if (NULL != pipe_stdin)
490 {
492 if (-1 == dup2 (fd_stdin_read,
493 0))
495 "dup2");
497 }
499 {
502 O_RDONLY);
503 }
504 if (NULL != pipe_stdout)
505 {
507 if (-1 == dup2 (fd_stdout_write,
508 1))
510 "dup2");
512 close (fd_stdout_write));
513 }
515 {
518 O_WRONLY);
519 }
520 if (NULL != pipe_stderr)
521 {
523 if (-1 == dup2 (fd_stderr_write,
524 2))
527 }
529 {
532 O_WRONLY);
533 }
534 if (NULL != lscp)
535 {
537
538
539 i = 0;
540 tgt = 3;
541 while (-1 != lscp[i])
542 {
543 j = i + 1;
544 while (-1 != lscp[j])
545 {
546 if (lscp[j] == tgt)
547 {
548
549 k = dup (lscp[j]);
552 lscp[j] = k;
553 break;
554 }
555 j++;
556 }
557 if (lscp[i] != tgt)
558 {
559
560
563 tgt));
564 }
565
566 flags = fcntl (tgt,
567 F_GETFD);
569 flags &= ~FD_CLOEXEC;
570 fflush (stderr);
571 (void) fcntl (tgt,
572 F_SETFD,
573 flags);
574 {
575 char *tmp;
576
578 "%s:%d",
579 fdnames,
580 tgt);
582 fdnames = tmp;
583 }
584 tgt++;
585 i++;
586 }
588 sizeof(fds),
589 "%u",
590 i);
591 setenv ("LISTEN_FDS",
592 fds,
593 1);
594 if (0 != strlen (fdnames))
595 setenv ("LISTEN_FDNAMES",
596 fdnames + 1,
597 1);
599 }
600#ifndef DARWIN
601
604 0);
605#endif
607 argv);
609 "execvp",
611 _exit (1);
612}
613
614
621 char *const argv[])
622{
624 pipe_stdin,
625 pipe_stdout,
626 pipe_stderr,
627 NULL,
629 argv);
630}
631
632
639 va_list va)
640{
642 va_list ap;
643 char **argv;
644 int argc;
645
646 argc = 0;
647 va_copy (ap, va);
648 while (NULL != va_arg (ap, char *))
649 argc++;
650 va_end (ap);
652 argc = 0;
653 va_copy (ap, va);
654 while (NULL != (argv[argc] = va_arg (ap, char *)))
655 argc++;
656 va_end (ap);
658 pipe_stdin,
659 pipe_stdout,
660 pipe_stderr,
662 argv);
665}
666
667
674 ...)
675{
677 va_list ap;
678
681 pipe_stdin,
682 pipe_stdout,
683 pipe_stderr,
685 ap);
686 va_end (ap);
688}
689
690
693 const int *lsocks,
695 char *const argv[])
696{
698 NULL,
699 NULL,
700 NULL,
701 lsocks,
703 argv);
704}
705
706
709 const int *lsocks,
711 ...)
712{
713 va_list ap;
714 char **argv;
715 unsigned int argv_size;
717 const char *rpos;
718 char *pos;
719 char *cp;
720 const char *last;
722 char *binary_path;
723 int quote_on;
724 unsigned int i;
725 size_t len;
726
727 argv_size = 1;
730 last = NULL;
731 do
732 {
734 quote_on = 0;
735 while ('\0' != *rpos)
736 {
737 if ('"' == *rpos)
738 {
739 if (1 == quote_on)
740 quote_on = 0;
741 else
742 quote_on = 1;
743 }
744 if ((' ' == *rpos) && (0 == quote_on))
745 {
746 if (NULL != last)
747 argv_size++;
748 last = NULL;
749 rpos++;
750 while (' ' == *rpos)
751 rpos++;
752 }
753 if ((NULL == last) && ('\0' != *rpos))
754 last = rpos;
755 if ('\0' != *rpos)
756 rpos++;
757 }
758 if (NULL != last)
759 argv_size++;
760 }
761 while (NULL != (arg = (va_arg (ap, const char *))));
762 va_end (ap);
763
765 argv_size = 0;
768 last = NULL;
769 do
770 {
772 quote_on = 0;
773 pos = cp;
774 while ('\0' != *pos)
775 {
776 if ('"' == *pos)
777 {
778 if (1 == quote_on)
779 quote_on = 0;
780 else
781 quote_on = 1;
782 }
783 if ((' ' == *pos) && (0 == quote_on))
784 {
785 *pos = '\0';
786 if (NULL != last)
788 last = NULL;
789 pos++;
790 while (' ' == *pos)
791 pos++;
792 }
793 if ((NULL == last) && ('\0' != *pos))
794 last = pos;
795 if ('\0' != *pos)
796 pos++;
797 }
798 if (NULL != last)
800 last = NULL;
802 }
803 while (NULL != (arg = (va_arg (ap, const char *))));
804 va_end (ap);
805 argv[argv_size] = NULL;
806
807 for (i = 0; i < argv_size; i++)
808 {
809 len = strlen (argv[i]);
810 if ((argv[i][0] == '"') && (argv[i][len - 1] == '"'))
811 {
812 memmove (&argv[i][0], &argv[i][1], len - 2);
813 argv[i][len - 2] = '\0';
814 }
815 }
816 binary_path = argv[0];
818 lsocks,
819 binary_path,
820 argv);
821 while (argv_size > 0)
824 return proc;
825}
826
827
841 unsigned long *code,
843{
846
852 {
854 "waitpid");
856 }
858 {
860 *code = 0;
862 }
864 {
866 "waitpid");
868 }
870 {
872 *code = WEXITSTATUS (
status);
873 }
874 else if (WIFSIGNALED (
status))
875 {
877 *code = WTERMSIG (
status);
878 }
879 else if (WIFSTOPPED (
status))
880 {
882 *code = WSTOPSIG (
status);
883 }
884#ifdef WIFCONTINUED
885 else if (WIFCONTINUED (
status))
886 {
888 *code = 0;
889 }
890#endif
891 else
892 {
894 *code = 0;
895 }
896
898}
899
900
904 unsigned long *code)
905{
907}
908
909
913 unsigned long *code)
914{
916}
917
918
921{
924
925 while ((
pid != (
ret = waitpid (
pid, NULL, 0))) && (EINTR == errno))
926 ;
928 {
930 "waitpid");
932 }
934}
935
936
941{
946
951
956
961
966
971
976
981
986};
987
988
989void
991{
992 if (NULL != cmd->
proc)
993 {
996 }
1002}
1003
1004
1010static void
1012{
1018
1022 {
1023
1027 return;
1028 }
1031 sizeof(cmd->
buf) - cmd->
off);
1033 {
1034 if ((cmd->
off > 0) && (cmd->
off <
sizeof(cmd->
buf)))
1035 {
1036 cmd->
buf[cmd->
off] =
'\0';
1038 }
1042 return;
1043 }
1047 {
1052 end = memchr (cmd->
buf,
'\n', cmd->
off);
1053 }
1059 cmd);
1060}
1061
1062
1067 const char *binary,
1068 ...)
1069{
1073 va_list ap;
1074
1076 if (NULL == opipe)
1077 return NULL;
1078 va_start (ap, binary);
1079
1080 eip =
1082 NULL,
1083 opipe,
1084 NULL,
1085 binary,
1086 ap);
1087 va_end (ap);
1088 if (NULL == eip)
1089 {
1091 return NULL;
1092 }
1102 return cmd;
1103}
1104
1105
1106
struct GNUNET_GETOPT_CommandLineOption options[]
enum GNUNET_GenericReturnValue GNUNET_DISK_internal_file_handle_(const struct GNUNET_DISK_FileHandle *fh, int *dst)
Retrieve OS file handle.
static int ret
Final status code.
static struct GNUNET_TIME_Relative timeout
User defined timestamp for completing operations.
static int end
Set if we are to shutdown all services (including ARM).
static uint32_t type
Type string converted to DNS type value.
static struct GNUNET_NETWORK_Handle * ls
Listen socket for STUN processing.
static int status
The program status; 0 for success.
static void start_process()
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
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.
struct GNUNET_DISK_FileHandle * GNUNET_DISK_pipe_detach_end(struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd end)
Detaches one of the ends from the pipe.
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
struct GNUNET_DISK_PipeHandle * GNUNET_DISK_pipe(enum GNUNET_DISK_PipeFlags pf)
Creates an interprocess channel.
enum GNUNET_GenericReturnValue GNUNET_DISK_pipe_close(struct GNUNET_DISK_PipeHandle *p)
Closes an interprocess channel.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
struct GNUNET_DISK_FileHandle * GNUNET_DISK_get_handle_from_int_fd(int fno)
Get a handle from a native integer FD.
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.
enum GNUNET_GenericReturnValue GNUNET_DISK_pipe_close_end(struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd end)
Closes one half of an interprocess channel.
@ GNUNET_DISK_PF_NONE
No special options, use non-blocking read/write operations.
@ GNUNET_DISK_PF_BLOCKING_RW
Configure both pipe ends for blocking operations if set.
@ GNUNET_DISK_PIPE_END_WRITE
The writing-end of a pipe.
@ GNUNET_DISK_PIPE_END_READ
The reading-end of a pipe.
GNUNET_GenericReturnValue
Named constants for return values.
#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...
#define GNUNET_log_strerror_file(level, cmd, filename)
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_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_free_nz(ptr)
Wrapper around free.
int GNUNET_NETWORK_fdset_handle_isset(const struct GNUNET_NETWORK_FDSet *fds, const struct GNUNET_DISK_FileHandle *h)
Check if a file handle is part of an fd set.
void(* GNUNET_OS_LineProcessor)(void *cls, const char *line)
Type of a function to process a line of output.
struct GNUNET_OS_Process * GNUNET_OS_start_process(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,...)
Start a process.
GNUNET_OS_InheritStdioFlags
Flags that determine which of the standard streams should be inherited by the child process.
struct GNUNET_OS_Process * GNUNET_OS_start_process_v(enum GNUNET_OS_InheritStdioFlags std_inheritance, const int *lsocks, const char *filename, char *const argv[])
Start a process.
struct GNUNET_OS_Process * GNUNET_OS_process_current()
Get process structure for current process.
enum GNUNET_GenericReturnValue GNUNET_OS_process_wait_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
Retrieve the status of a process, waiting on it if dead.
void GNUNET_OS_install_parent_control_handler(void *cls)
Connects this process to its parent via pipe; essentially, the parent control handler will read signa...
void GNUNET_OS_command_stop(struct GNUNET_OS_CommandHandle *cmd)
Stop/kill a command.
struct GNUNET_OS_CommandHandle * GNUNET_OS_command_run(GNUNET_OS_LineProcessor proc, void *proc_cls, struct GNUNET_TIME_Relative timeout, const char *binary,...)
Run the given command line and call the given function for each line of the output.
struct GNUNET_OS_Process * GNUNET_OS_start_process_s(enum GNUNET_OS_InheritStdioFlags std_inheritance, const int *lsocks, const char *filename,...)
Start a process.
pid_t GNUNET_OS_process_get_pid(struct GNUNET_OS_Process *proc)
Get the pid of the process in question.
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.
enum GNUNET_GenericReturnValue GNUNET_OS_check_helper_binary(const char *binary, bool check_suid, const char *params)
Check whether an executable exists and possibly if the suid bit is set on the file.
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
enum GNUNET_GenericReturnValue GNUNET_OS_process_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
Retrieve the status of a process.
enum GNUNET_GenericReturnValue GNUNET_OS_process_wait(struct GNUNET_OS_Process *proc)
Wait for a process to terminate.
struct GNUNET_OS_Process * GNUNET_OS_start_process_va(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, va_list va)
Start a process.
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.
@ GNUNET_OS_INHERIT_STD_IN
When this flag is set, the child process will inherit stdin of the parent.
@ GNUNET_OS_INHERIT_STD_OUT
When this flag is set, the child process will inherit stdout of the parent.
@ GNUNET_OS_INHERIT_STD_ERR
When this flag is set, the child process will inherit stderr of the parent.
@ GNUNET_OS_INHERIT_STD_NONE
No standard streams should be inherited.
@ GNUNET_OS_USE_PIPE_CONTROL
Should a pipe be used to send signals to the child?
@ GNUNET_OS_PROCESS_SIGNALED
The process was killed by a signal.
@ GNUNET_OS_PROCESS_EXITED
The process exited with a return code.
@ GNUNET_OS_PROCESS_UNKNOWN
The process is not known to the OS (or at least not one of our children).
@ GNUNET_OS_PROCESS_RUNNING
The process is still running.
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...
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
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,...
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
void GNUNET_SIGNAL_raise(const int sig)
Raise the given signal by calling the installed signal handlers.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
#define GNUNET_OS_CONTROL_PIPE
static void parent_control_handler(void *cls)
This handler is called when there are control data to be read on the pipe.
static struct GNUNET_OS_Process current_process
Handle for 'this' process.
static struct GNUNET_SCHEDULER_Task * pch
Handle for the parent_control_handler() Task.
#define LOG_STRERROR_FILE(kind, syscall, filename)
static void shutdown_pch(void *cls)
This handler is called on shutdown to remove the pch.
static void open_dev_null(int target_fd, int flags)
Open '/dev/null' and make the result the given file descriptor.
static struct GNUNET_SCHEDULER_Task * spch
Handle for the shutdown_pch() Task.
#define LOG_STRERROR(kind, syscall)
static void cmd_read(void *cls)
Read from the process and call the line processor.
static enum GNUNET_GenericReturnValue process_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code, int options)
Retrieve the status of a process, waiting on it if dead.
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Handle used to access files (and pipes).
Handle used to manage a pipe.
struct GNUNET_DISK_PipeHandle * opipe
Handle to the output pipe.
struct GNUNET_OS_Process * eip
Process handle.
size_t off
Current read offset in buf.
char buf[1024]
Buffer for the output.
struct GNUNET_SCHEDULER_Task * rtask
Task reading from pipe.
struct GNUNET_TIME_Absolute timeout
When to time out.
void * proc_cls
Closure for proc.
GNUNET_OS_LineProcessor proc
Function to call on each line of output.
const struct GNUNET_DISK_FileHandle * r
Read-end of output pipe.
pid_t pid
PID of the process.
struct GNUNET_DISK_FileHandle * control_pipe
Pipe we use to signal the process.
Context information passed to each scheduler task.
const struct GNUNET_NETWORK_FDSet * read_ready
Set of file descriptors ready for reading; note that additional bits may be set that were not in the ...
Entry in list of pending tasks.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.