GNUnet  0.19.4
gnunet-auto-share.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2001--2012 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  */
29 #include "platform.h"
30 #include "gnunet_util_lib.h"
31 
32 #define MAX_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 4)
33 
34 #define MIN_DELAY GNUNET_TIME_UNIT_MINUTES
35 
36 
41 struct WorkItem
42 {
46  struct WorkItem *prev;
47 
51  struct WorkItem *next;
52 
56  char *filename;
57 
62  struct GNUNET_HashCode id;
63 };
64 
65 
69 static int ret;
70 
74 static unsigned int verbose;
75 
79 static const struct GNUNET_CONFIGURATION_Handle *cfg;
80 
84 static char *cfg_filename;
85 
89 static int disable_extractor;
90 
95 
100 
104 static unsigned int anonymity_level = 1;
105 
109 static unsigned int content_priority = 365;
110 
114 static unsigned int replication_level = 1;
115 
119 static const char *dir_name;
120 
124 static struct WorkItem *work_head;
125 
129 static struct WorkItem *work_tail;
130 
136 
140 static int do_shutdown;
141 
147 static struct GNUNET_TIME_Absolute start_time;
148 
153 
158 
159 
163 static char *
165 {
166  char *ret;
167 
169  "%s%s.auto-share",
170  dir_name,
171  (DIR_SEPARATOR == dir_name[strlen (dir_name) - 1])
172  ? ""
174  return ret;
175 }
176 
177 
181 static void
183 {
184  char *fn;
185  struct GNUNET_BIO_ReadHandle *rh;
186  uint32_t n;
187  struct GNUNET_HashCode id;
188  struct WorkItem *wi;
189  char *emsg;
190 
191  emsg = NULL;
192  fn = get_state_file ();
193  rh = GNUNET_BIO_read_open_file (fn);
194  GNUNET_free (fn);
195  if (NULL == rh)
196  return;
197  fn = NULL;
198  if (GNUNET_OK != GNUNET_BIO_read_int32 (rh, "number of files",
199  (int32_t *) &n))
200  goto error;
201  while (n-- > 0)
202  {
203  struct GNUNET_BIO_ReadSpec rs[] = {
204  GNUNET_BIO_read_spec_string ("filename", &fn, 1024),
205  GNUNET_BIO_read_spec_object ("id", &id, sizeof(struct GNUNET_HashCode)),
207  };
209  goto error;
210  wi = GNUNET_new (struct WorkItem);
211  wi->id = id;
212  wi->filename = fn;
214  "Loaded serialization ID for `%s' is `%s'\n",
215  wi->filename,
216  GNUNET_h2s (&id));
217  fn = NULL;
218  GNUNET_CRYPTO_hash (wi->filename, strlen (wi->filename), &id);
222  &id,
223  wi,
225  }
226  if (GNUNET_OK == GNUNET_BIO_read_close (rh, &emsg))
227  return;
228  rh = NULL;
229 error:
230  GNUNET_free (fn);
231  if (NULL != rh)
232  (void) GNUNET_BIO_read_close (rh, &emsg);
234  _ ("Failed to load state: %s\n"),
235  emsg);
236  GNUNET_free (emsg);
237 }
238 
239 
248 static int
249 write_item (void *cls, const struct GNUNET_HashCode *key, void *value)
250 {
251  struct GNUNET_BIO_WriteHandle *wh = cls;
252  struct WorkItem *wi = value;
253 
255  "Saving serialization ID of file `%s' with value `%s'\n",
256  wi->filename,
257  GNUNET_h2s (&wi->id));
258  struct GNUNET_BIO_WriteSpec ws[] = {
259  GNUNET_BIO_write_spec_string ("auto-share-write-item-filename",
260  wi->filename),
261  GNUNET_BIO_write_spec_object ("id", &wi->id, sizeof(struct
262  GNUNET_HashCode)),
264  };
266  return GNUNET_SYSERR; /* write error, abort iteration */
267  return GNUNET_OK;
268 }
269 
270 
274 static void
276 {
277  uint32_t n;
278  struct GNUNET_BIO_WriteHandle *wh;
279  char *fn;
280 
282  fn = get_state_file ();
284  if (NULL == wh)
285  {
287  _ ("Failed to save state to file %s\n"),
288  fn);
289  GNUNET_free (fn);
290  return;
291  }
292  if (GNUNET_OK != GNUNET_BIO_write_int32 (wh, "size of state", n))
293  {
294  (void) GNUNET_BIO_write_close (wh, NULL);
296  _ ("Failed to save state to file %s\n"),
297  fn);
298  GNUNET_free (fn);
299  return;
300  }
302  if (GNUNET_OK != GNUNET_BIO_write_close (wh, NULL))
304  _ ("Failed to save state to file %s\n"),
305  fn);
306  GNUNET_free (fn);
307 }
308 
309 
315 static void
316 do_stop_task (void *cls)
317 {
319  if (NULL != publish_proc)
320  {
322  return;
323  }
324  if (NULL != run_task)
325  {
327  run_task = NULL;
328  }
329 }
330 
331 
335 static void
336 schedule_next_task (void);
337 
338 
345 static void
346 maint_child_death (void *cls)
347 {
348  struct WorkItem *wi = cls;
349  struct GNUNET_HashCode key;
351  unsigned long code;
352  int ret;
353  char c;
354  const struct GNUNET_DISK_FileHandle *pr;
355  const struct GNUNET_SCHEDULER_TaskContext *tc;
356 
357  run_task = NULL;
361  {
362  /* shutdown scheduled us, someone else will kill child,
363  we should just try again */
365  pr,
367  wi);
368  return;
369  }
370  /* consume the signal */
371  GNUNET_break (0 < GNUNET_DISK_file_read (pr, &c, sizeof(c)));
372 
375  if (GNUNET_NO == ret)
376  {
377  /* process still running? Then where did the SIGCHLD come from?
378  Well, let's declare it spurious (kernel bug?) and keep rolling.
379  */
380  GNUNET_break (0);
382  pr,
384  wi);
385  return;
386  }
388 
390  publish_proc = NULL;
391 
392  if (GNUNET_YES == do_shutdown)
393  {
394  GNUNET_free (wi->filename);
395  GNUNET_free (wi);
396  return;
397  }
398  if ((GNUNET_OS_PROCESS_EXITED == type) && (0 == code))
399  {
401  _ ("Publication of `%s' done\n"),
402  wi->filename);
403  GNUNET_CRYPTO_hash (wi->filename, strlen (wi->filename), &key);
407  &key,
408  wi,
410  }
411  else
412  {
414  }
415  save_state ();
417 }
418 
419 
424 static void
426 {
427  static char c;
428  int old_errno = errno; /* back-up errno */
429 
430  GNUNET_break (
431  1 ==
434  &c,
435  sizeof(c)));
436  errno = old_errno; /* restore errno */
437 }
438 
439 
445 static void
446 work (void *cls)
447 {
448  static char *argv[14];
449  static char anon_level[20];
450  static char content_prio[20];
451  static char repl_level[20];
452  struct WorkItem *wi;
453  const struct GNUNET_DISK_FileHandle *pr;
454  int argc;
455 
456  run_task = NULL;
457  wi = work_head;
459  argc = 0;
460  argv[argc++] = "gnunet-publish";
461  if (verbose)
462  argv[argc++] = "-V";
463  if (disable_extractor)
464  argv[argc++] = "-D";
466  argv[argc++] = "-d";
467  argv[argc++] = "-c";
468  argv[argc++] = cfg_filename;
469  GNUNET_snprintf (anon_level, sizeof(anon_level), "%u", anonymity_level);
470  argv[argc++] = "-a";
471  argv[argc++] = anon_level;
472  GNUNET_snprintf (content_prio, sizeof(content_prio), "%u", content_priority);
473  argv[argc++] = "-p";
474  argv[argc++] = content_prio;
475  GNUNET_snprintf (repl_level, sizeof(repl_level), "%u", replication_level);
476  argv[argc++] = "-r";
477  argv[argc++] = repl_level;
478  argv[argc++] = wi->filename;
479  argv[argc] = NULL;
480  GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Publishing `%s'\n"), wi->filename);
481  GNUNET_assert (NULL == publish_proc);
483  NULL,
484  NULL,
485  NULL,
486  "gnunet-publish",
487  argv);
488  if (NULL == publish_proc)
489  {
491  _ ("Failed to run `%s'\n"),
492  "gnunet-publish");
494  run_task =
496  return;
497  }
500  pr,
502  wi);
503 }
504 
505 
514 static int
515 determine_id (void *cls, const char *filename)
516 {
517  struct GNUNET_HashCode *id = cls;
518  struct stat sbuf;
519  struct GNUNET_HashCode fx[2];
520  struct GNUNET_HashCode ft;
521 
522  if (0 != stat (filename, &sbuf))
523  {
525  return GNUNET_OK;
526  }
527  GNUNET_CRYPTO_hash (filename, strlen (filename), &fx[0]);
528  if (! S_ISDIR (sbuf.st_mode))
529  {
530  uint64_t fattr[2];
531 
532  fattr[0] = GNUNET_htonll (sbuf.st_size);
533  fattr[0] = GNUNET_htonll (sbuf.st_mtime);
534 
535  GNUNET_CRYPTO_hash (fattr, sizeof(fattr), &fx[1]);
536  }
537  else
538  {
539  memset (&fx[1], 1, sizeof(struct GNUNET_HashCode));
541  }
542  /* use hash here to make hierarchical structure distinct from
543  all files on the same level */
544  GNUNET_CRYPTO_hash (fx, sizeof(fx), &ft);
545  /* use XOR here so that order of the files in the directory
546  does not matter! */
547  GNUNET_CRYPTO_hash_xor (&ft, id, id);
548  return GNUNET_OK;
549 }
550 
551 
561 static int
562 add_file (void *cls, const char *filename)
563 {
564  struct WorkItem *wi;
565  struct GNUNET_HashCode key;
566  struct GNUNET_HashCode id;
567 
568  if (GNUNET_YES == do_shutdown)
569  return GNUNET_SYSERR;
570  if ((NULL != strstr (filename, "/.auto-share")) ||
571  (NULL != strstr (filename, "\\.auto-share")))
572  return GNUNET_OK; /* skip internal file */
573  GNUNET_CRYPTO_hash (filename, strlen (filename), &key);
575  memset (&id, 0, sizeof(struct GNUNET_HashCode));
576  determine_id (&id, filename);
577  if (NULL != wi)
578  {
579  if (0 == memcmp (&id, &wi->id, sizeof(struct GNUNET_HashCode)))
580  return GNUNET_OK; /* skip: we did this one already */
581  /* contents changed, need to re-do the directory... */
582  GNUNET_assert (
583  GNUNET_YES ==
585  }
586  else
587  {
588  wi = GNUNET_new (struct WorkItem);
590  }
591  wi->id = id;
593  if (GNUNET_YES == do_shutdown)
594  return GNUNET_SYSERR;
595  return GNUNET_OK;
596 }
597 
598 
604 static void
605 scan (void *cls)
606 {
607  run_task = NULL;
611 }
612 
613 
617 static void
619 {
621 
622  if (GNUNET_YES == do_shutdown)
623  return;
624  GNUNET_assert (NULL == run_task);
625  if (NULL == work_head)
626  {
627  /* delay by at most 4h, at least 1s, and otherwise in between depending
628  on how long it took to scan */
634  }
635  else
636  {
638  }
639 }
640 
641 
650 static void
651 run (void *cls,
652  char *const *args,
653  const char *cfgfile,
654  const struct GNUNET_CONFIGURATION_Handle *c)
655 {
656  /* check arguments */
657  if ((NULL == args[0]) || (NULL != args[1]) ||
659  {
660  printf (_ (
661  "You must specify one and only one directory name for automatic publication.\n"));
662  ret = -1;
663  return;
664  }
665  cfg_filename = GNUNET_strdup (cfgfile);
666  cfg = c;
667  dir_name = args[0];
669  load_state ();
671  &scan,
672  NULL);
674 }
675 
676 
685 static int
686 free_item (void *cls, const struct GNUNET_HashCode *key, void *value)
687 {
688  struct WorkItem *wi = value;
689 
690  GNUNET_free (wi->filename);
691  GNUNET_free (wi);
692  return GNUNET_OK;
693 }
694 
695 
703 int
704 main (int argc, char *const *argv)
705 {
708  "anonymity",
709  "LEVEL",
710  gettext_noop (
711  "set the desired LEVEL of sender-anonymity"),
712  &anonymity_level),
713 
715  'd',
716  "disable-creation-time",
717  gettext_noop (
718  "disable adding the creation time to the metadata of the uploaded file"),
720 
722  'D',
723  "disable-extractor",
724  gettext_noop ("do not use libextractor to add keywords or metadata"),
726 
728  "priority",
729  "PRIORITY",
730  gettext_noop (
731  "specify the priority of the content"),
733 
735  "replication",
736  "LEVEL",
737  gettext_noop (
738  "set the desired replication LEVEL"),
740 
742 
744  };
745  struct WorkItem *wi;
746  int ok;
748 
749  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
750  return 2;
752  GNUNET_assert (NULL != sigpipe);
753  shc_chld =
755  ok =
756  (GNUNET_OK ==
758  argc,
759  argv,
760  "gnunet-auto-share [OPTIONS] FILENAME",
761  gettext_noop ("Automatically publish files from a directory on GNUnet"),
762  options,
763  &run,
764  NULL))
765  ? ret
766  : 1;
767  if (NULL != work_finished)
768  {
770  &free_item,
771  NULL);
773  }
774  while (NULL != (wi = work_head))
775  {
777  GNUNET_free (wi->filename);
778  GNUNET_free (wi);
779  }
781  shc_chld = NULL;
783  sigpipe = NULL;
785  cfg_filename = NULL;
786  GNUNET_free_nz ((void *) argv);
787  return ok;
788 }
789 
790 
791 /* end of gnunet-auto-share.c */
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
static struct GNUNET_SIGNAL_Context * shc_chld
#define gettext_noop(String)
Definition: gettext.h:70
static struct GNUNET_SCHEDULER_Task * run_task
Handle for the main task that does scanning and working.
static int disable_extractor
Disable extractor option to use for publishing.
static unsigned int verbose
Are we running 'verbosely'?
static int do_shutdown
Set to GNUNET_YES if we are shutting down.
static struct WorkItem * work_head
Head of linked list of files still to publish.
#define MAX_DELAY
static void load_state()
Load the set of work_finished items from disk.
static const char * dir_name
Top-level directory we monitor to auto-publish.
static unsigned int content_priority
Content priority option to use for publishing.
static int do_disable_creation_time
Disable creation time option to use for publishing.
static int determine_id(void *cls, const char *filename)
Recursively scan the given file/directory structure to determine a unique ID that represents the curr...
static void schedule_next_task(void)
Decide what the next task is (working or scanning) and schedule it.
static int free_item(void *cls, const struct GNUNET_HashCode *key, void *value)
Free memory associated with the work item from the work_finished map.
static struct GNUNET_CONTAINER_MultiHashMap * work_finished
Map from the hash of the filename (!) to a struct WorkItem that was finished.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
static char * cfg_filename
Name of the configuration file.
static void maint_child_death(void *cls)
Task triggered whenever we receive a SIGCHLD (child process died).
static struct GNUNET_TIME_Absolute start_time
Start time of the current round; used to determine how long one iteration takes (which influences how...
static int add_file(void *cls, const char *filename)
Function called with a filename (or directory name) to publish (if it has changed since the last time...
static void scan(void *cls)
Periodically run task to update our view of the directory to share.
static int ret
Global return value from 'main'.
static struct GNUNET_OS_Process * publish_proc
Handle to the 'gnunet-publish' process that we executed.
static struct WorkItem * work_tail
Tail of linked list of files still to publish.
static unsigned int anonymity_level
Anonymity level option to use for publishing.
static struct GNUNET_DISK_PipeHandle * sigpipe
Pipe used to communicate 'gnunet-publish' completion (SIGCHLD) via signal.
static void sighandler_child_death()
Signal handler called for SIGCHLD.
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c)
Main function that will be run by the scheduler.
static unsigned int replication_level
Replication level option to use for publishing.
static void do_stop_task(void *cls)
Task run on shutdown.
static char * get_state_file()
Compute the name of the state database file we will use.
static void save_state()
Save the set of work_finished items on disk.
int main(int argc, char *const *argv)
The main function to automatically publish content to GNUnet.
#define MIN_DELAY
static void work(void *cls)
Function called to process work items.
static int write_item(void *cls, const struct GNUNET_HashCode *key, void *value)
Write work item from the work_finished map to the given write handle.
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
struct GNUNET_HashCode key
The key used in the DHT.
static char * filename
static char * value
Value of the record to add/remove.
static int ok
Return value from 'main' (0 == success)
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
static struct GNUNET_TESTBED_BarrierWaitHandle * wh
Our barrier wait handle.
struct GNUNET_BIO_ReadSpec GNUNET_BIO_read_spec_string(const char *what, char **result, size_t max_length)
Create the specification to read a 0-terminated string.
Definition: bio.c:956
int GNUNET_BIO_write_spec_commit(struct GNUNET_BIO_WriteHandle *h, struct GNUNET_BIO_WriteSpec *ws)
Execute the write specifications in order.
Definition: bio.c:1359
int GNUNET_BIO_read_int32(struct GNUNET_BIO_ReadHandle *h, const char *what, int32_t *i)
Read an (u)int32_t.
Definition: bio.c:427
struct GNUNET_BIO_ReadHandle * GNUNET_BIO_read_open_file(const char *fn)
Open a file for reading.
Definition: bio.c:114
struct GNUNET_BIO_ReadSpec GNUNET_BIO_read_spec_object(const char *what, void *result, size_t size)
Create the specification to read a certain amount of bytes.
Definition: bio.c:908
int GNUNET_BIO_write_close(struct GNUNET_BIO_WriteHandle *h, char **emsg)
Close an IO handle.
Definition: bio.c:556
int GNUNET_BIO_write_int32(struct GNUNET_BIO_WriteHandle *h, const char *what, int32_t i)
Write an (u)int32_t.
Definition: bio.c:847
struct GNUNET_BIO_WriteSpec GNUNET_BIO_write_spec_string(const char *what, const char *s)
Create the specification to write a 0-terminated string.
Definition: bio.c:1201
#define GNUNET_BIO_read_spec_end()
End of specifications marker.
int GNUNET_BIO_read_spec_commit(struct GNUNET_BIO_ReadHandle *h, struct GNUNET_BIO_ReadSpec *rs)
Execute the read specifications in order.
Definition: bio.c:1108
#define GNUNET_BIO_write_spec_end()
End of specifications marker.
int GNUNET_BIO_read_close(struct GNUNET_BIO_ReadHandle *h, char **emsg)
Close an open handle.
Definition: bio.c:162
struct GNUNET_BIO_WriteSpec GNUNET_BIO_write_spec_object(const char *what, void *source, size_t size)
Create the specification to read some bytes.
Definition: bio.c:1154
struct GNUNET_BIO_WriteHandle * GNUNET_BIO_write_open_file(const char *fn)
Open a file for writing.
Definition: bio.c:508
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_directory_test(const char *fil, int is_readable)
Test if fil is a directory and listable.
Definition: disk.c:403
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
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:814
@ GNUNET_DISK_PF_NONE
No special options, use non-blocking read/write operations.
@ GNUNET_DISK_PIPE_END_WRITE
The writing-end of a pipe.
@ GNUNET_DISK_PIPE_END_READ
The reading-end of a pipe.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_uint(char shortName, const char *name, const char *argumentHelp, const char *description, unsigned int *val)
Allow user to specify an unsigned int.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_verbose(unsigned int *level)
Define the '-V' verbosity option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
void GNUNET_CRYPTO_hash_xor(const struct GNUNET_HashCode *a, const struct GNUNET_HashCode *b, struct GNUNET_HashCode *result)
compute result = a ^ b
Definition: crypto_hash.c:135
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
#define GNUNET_log(kind,...)
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:37
@ GNUNET_SCHEDULER_PRIORITY_IDLE
Run when otherwise idle.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#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.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
#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
@ GNUNET_ERROR_TYPE_INFO
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
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_free(ptr)
Wrapper around free.
#define GNUNET_free_nz(ptr)
Wrapper around free.
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:567
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:260
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
Definition: os_priority.c:210
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.
Definition: os_priority.c:853
@ GNUNET_OS_USE_PIPE_CONTROL
Should a pipe be used to send signals to the child?
@ GNUNET_OS_PROCESS_EXITED
The process exited with a return code.
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
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1299
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_with_priority(enum GNUNET_SCHEDULER_Priority prio, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified priority.
Definition: scheduler.c:1226
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
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:752
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
@ GNUNET_SCHEDULER_REASON_READ_READY
The reading socket is ready.
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
enum GNUNET_GenericReturnValue GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1222
struct GNUNET_TIME_Relative GNUNET_TIME_relative_min(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the minimum of two relative time values.
Definition: time.c:343
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
Definition: time.c:436
struct GNUNET_TIME_Relative GNUNET_TIME_relative_saturating_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Saturating multiply relative time by a given factor.
Definition: time.c:531
struct GNUNET_TIME_Relative GNUNET_TIME_relative_max(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the maximum of two relative time values.
Definition: time.c:351
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:111
#define GNUNET_TIME_UNIT_MINUTES
One minute.
#define DIR_SEPARATOR
Definition: platform.h:165
#define DIR_SEPARATOR_STR
Definition: platform.h:166
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
#define GNUNET_SIGCHLD
Definition: platform.h:42
static struct GNUNET_SCHEDULER_TaskContext tc
Task context of the current task.
Definition: scheduler.c:431
Handle for buffered reading.
Definition: bio.c:69
Structure specifying a reading operation on an IO handle.
void * cls
Closure for rh.
GNUNET_BIO_ReadHandler rh
Function performing data deserialization.
Handle for buffered writing.
Definition: bio.c:466
Structure specifying a writing operation on an IO handle.
Internal representation of the hash map.
Handle used to access files (and pipes).
Handle used to manage a pipe.
Definition: disk.c:68
Definition of a command line option.
A 512-bit hashcode.
Context information passed to each scheduler task.
enum GNUNET_SCHEDULER_Reason reason
Reason why the task is run now.
Entry in list of pending tasks.
Definition: scheduler.c:136
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
Item in our work queue (or in the set of files/directories we have successfully published).
char * filename
Filename of the work item.
struct WorkItem * prev
PENDING Work is kept in a linked list.
struct WorkItem * next
PENDING Work is kept in a linked list.
struct GNUNET_HashCode id
Unique identity for this work item (used to detect if we need to do the work again).
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model