GNUnet 0.22.2
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
42{
46 struct WorkItem *prev;
47
51 struct WorkItem *next;
52
56 char *filename;
57
63};
64
65
69static int ret;
70
74static unsigned int verbose;
75
79static const struct GNUNET_CONFIGURATION_Handle *cfg;
80
84static char *cfg_filename;
85
90
95
100
104static unsigned int anonymity_level = 1;
105
109static unsigned int content_priority = 365;
110
114static unsigned int replication_level = 1;
115
119static const char *dir_name;
120
124static struct WorkItem *work_head;
125
129static struct WorkItem *work_tail;
130
136
140static int do_shutdown;
141
148
153
158
159
163static char *
165{
166 char *retval;
167
168 GNUNET_asprintf (&retval,
169 "%s%s.auto-share",
170 dir_name,
171 (DIR_SEPARATOR == dir_name[strlen (dir_name) - 1])
172 ? ""
174 return retval;
175}
176
177
181static 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 ();
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;
229error:
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
248static int
249write_item (void *cls, const struct GNUNET_HashCode *key, void *value)
250{
251 struct GNUNET_BIO_WriteHandle *wh = cls;
252 struct WorkItem *wi = value;
253
254 struct GNUNET_BIO_WriteSpec ws[] = {
255 GNUNET_BIO_write_spec_string ("auto-share-write-item-filename",
256 wi->filename),
257 GNUNET_BIO_write_spec_object ("id", &wi->id, sizeof(struct
260 };
262 "Saving serialization ID of file `%s' with value `%s'\n",
263 wi->filename,
264 GNUNET_h2s (&wi->id));
266 return GNUNET_SYSERR; /* write error, abort iteration */
267 return GNUNET_OK;
268}
269
270
274static 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
315static void
316do_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
335static void
336schedule_next_task (void);
337
338
345static void
347{
348 struct WorkItem *wi = cls;
349 struct GNUNET_HashCode key;
351 unsigned long code;
352 int retval;
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
373 retval = GNUNET_OS_process_status (publish_proc, &type, &code);
374 GNUNET_assert (GNUNET_SYSERR != retval);
375 if (GNUNET_NO == retval)
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 }
387 GNUNET_assert (GNUNET_OK == retval);
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
424static void
426{
427 static char c;
428 int old_errno = errno; /* back-up errno */
429
431 1 ==
434 ,
435 &c,
436 sizeof(c)));
437 errno = old_errno; /* restore errno */
438}
439
440
446static void
447work (void *cls)
448{
449 static const char *argv[14];
450 static char anon_level[20];
451 static char content_prio[20];
452 static char repl_level[20];
453 struct WorkItem *wi;
454 const struct GNUNET_DISK_FileHandle *pr;
455 int argc;
456
457 run_task = NULL;
458 wi = work_head;
460 argc = 0;
461 argv[argc++] = "gnunet-publish";
462 if (verbose)
463 argv[argc++] = "-V";
465 argv[argc++] = "-D";
467 argv[argc++] = "-d";
468 argv[argc++] = "-c";
469 argv[argc++] = cfg_filename;
470 GNUNET_snprintf (anon_level, sizeof(anon_level), "%u", anonymity_level);
471 argv[argc++] = "-a";
472 argv[argc++] = anon_level;
473 GNUNET_snprintf (content_prio, sizeof(content_prio), "%u", content_priority);
474 argv[argc++] = "-p";
475 argv[argc++] = content_prio;
476 GNUNET_snprintf (repl_level, sizeof(repl_level), "%u", replication_level);
477 argv[argc++] = "-r";
478 argv[argc++] = repl_level;
479 argv[argc++] = wi->filename;
480 argv[argc] = NULL;
481 GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Publishing `%s'\n"), wi->filename);
482 GNUNET_assert (NULL == publish_proc);
484 NULL,
485 NULL,
486 NULL,
487 "gnunet-publish",
488 (char * const*) argv);
489 if (NULL == publish_proc)
490 {
492 _ ("Failed to run `%s'\n"),
493 "gnunet-publish");
495 run_task =
497 return;
498 }
501 pr,
503 wi);
504}
505
506
515static int
516determine_id (void *cls, const char *filename)
517{
518 struct GNUNET_HashCode *id = cls;
519 struct stat sbuf;
520 struct GNUNET_HashCode fx[2];
521 struct GNUNET_HashCode ft;
522
523 if (0 != stat (filename, &sbuf))
524 {
526 return GNUNET_OK;
527 }
528 GNUNET_CRYPTO_hash (filename, strlen (filename), &fx[0]);
529 if (! S_ISDIR (sbuf.st_mode))
530 {
531 uint64_t fattr[2];
532
533 fattr[0] = GNUNET_htonll (sbuf.st_size);
534 fattr[0] = GNUNET_htonll (sbuf.st_mtime);
535
536 GNUNET_CRYPTO_hash (fattr, sizeof(fattr), &fx[1]);
537 }
538 else
539 {
540 memset (&fx[1], 1, sizeof(struct GNUNET_HashCode));
542 }
543 /* use hash here to make hierarchical structure distinct from
544 all files on the same level */
545 GNUNET_CRYPTO_hash (fx, sizeof(fx), &ft);
546 /* use XOR here so that order of the files in the directory
547 does not matter! */
548 GNUNET_CRYPTO_hash_xor (&ft, id, id);
549 return GNUNET_OK;
550}
551
552
562static int
563add_file (void *cls, const char *filename)
564{
565 struct WorkItem *wi;
566 struct GNUNET_HashCode key;
567 struct GNUNET_HashCode id;
568
569 if (GNUNET_YES == do_shutdown)
570 return GNUNET_SYSERR;
571 if ((NULL != strstr (filename, "/.auto-share")) ||
572 (NULL != strstr (filename, "\\.auto-share")))
573 return GNUNET_OK; /* skip internal file */
576 memset (&id, 0, sizeof(struct GNUNET_HashCode));
577 determine_id (&id, filename);
578 if (NULL != wi)
579 {
580 if (0 == memcmp (&id, &wi->id, sizeof(struct GNUNET_HashCode)))
581 return GNUNET_OK; /* skip: we did this one already */
582 /* contents changed, need to re-do the directory... */
584 GNUNET_YES ==
586 }
587 else
588 {
589 wi = GNUNET_new (struct WorkItem);
591 }
592 wi->id = id;
594 if (GNUNET_YES == do_shutdown)
595 return GNUNET_SYSERR;
596 return GNUNET_OK;
597}
598
599
605static void
606scan (void *cls)
607{
608 run_task = NULL;
612}
613
614
618static void
620{
621 struct GNUNET_TIME_Relative delay;
622
623 if (GNUNET_YES == do_shutdown)
624 return;
625 GNUNET_assert (NULL == run_task);
626 if (NULL == work_head)
627 {
628 /* delay by at most 4h, at least 1s, and otherwise in between depending
629 on how long it took to scan */
631 delay = GNUNET_TIME_relative_saturating_multiply (delay, 100);
632 delay = GNUNET_TIME_relative_min (delay, MAX_DELAY);
633 delay = GNUNET_TIME_relative_max (delay, MIN_DELAY);
635 }
636 else
637 {
639 }
640}
641
642
651static void
652run (void *cls,
653 char *const *args,
654 const char *cfgfile,
655 const struct GNUNET_CONFIGURATION_Handle *c)
656{
657 /* check arguments */
658 if ((NULL == args[0]) || (NULL != args[1]) ||
660 {
661 printf (_ (
662 "You must specify one and only one directory name for automatic publication.\n"));
663 ret = -1;
664 return;
665 }
666 cfg_filename = GNUNET_strdup (cfgfile);
667 cfg = c;
668 dir_name = args[0];
670 load_state ();
672 &scan,
673 NULL);
675}
676
677
686static int
687free_item (void *cls, const struct GNUNET_HashCode *key, void *value)
688{
689 struct WorkItem *wi = value;
690
691 GNUNET_free (wi->filename);
692 GNUNET_free (wi);
693 return GNUNET_OK;
694}
695
696
704int
705main (int argc, char *const *argv)
706{
709 "anonymity",
710 "LEVEL",
712 "set the desired LEVEL of sender-anonymity"),
714
716 'd',
717 "disable-creation-time",
719 "disable adding the creation time to the metadata of the uploaded file")
720 ,
722
724 'D',
725 "disable-extractor",
726 gettext_noop ("do not use libextractor to add keywords or metadata"),
728
730 "priority",
731 "PRIORITY",
733 "specify the priority of the content"),
735
737 "replication",
738 "LEVEL",
740 "set the desired replication LEVEL"),
742
744
746 };
747 struct WorkItem *wi;
748 int ok;
750
752 GNUNET_assert (NULL != sigpipe);
753 shc_chld =
755 ok =
756 (GNUNET_OK ==
759 argc,
760 argv,
761 "gnunet-auto-share [OPTIONS] FILENAME",
762 gettext_noop ("Automatically publish files from a directory on GNUnet"),
763 options,
764 &run,
765 NULL))
766 ? ret
767 : 1;
768 if (NULL != work_finished)
769 {
771 &free_item,
772 NULL);
774 }
775 while (NULL != (wi = work_head))
776 {
778 GNUNET_free (wi->filename);
779 GNUNET_free (wi);
780 }
782 shc_chld = NULL;
784 sigpipe = NULL;
786 cfg_filename = NULL;
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:74
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 * get_state_file()
Compute the name of the state database file we will 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 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.
struct GNUNET_HashCode key
The key used in the DHT.
static char * filename
static struct GNUNET_IDENTITY_Handle * id
Handle to IDENTITY.
static char * value
Value of the record to add/remove.
static uint32_t type
Type string converted to DNS type value.
enum GNUNET_GenericReturnValue GNUNET_BIO_write_close(struct GNUNET_BIO_WriteHandle *h, char **emsg)
Close an IO handle.
Definition: bio.c:556
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:954
struct GNUNET_BIO_WriteHandle * GNUNET_BIO_write_open_file(const char *fn)
Open a file for writing.
Definition: bio.c:508
enum GNUNET_GenericReturnValue GNUNET_BIO_write_int32(struct GNUNET_BIO_WriteHandle *h, const char *what, int32_t i)
Write an (u)int32_t.
Definition: bio.c:845
enum GNUNET_GenericReturnValue GNUNET_BIO_read_spec_commit(struct GNUNET_BIO_ReadHandle *h, struct GNUNET_BIO_ReadSpec *rs)
Execute the read specifications in order.
Definition: bio.c:1106
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:906
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:1199
#define GNUNET_BIO_read_spec_end()
End of specifications marker.
#define GNUNET_BIO_write_spec_end()
End of specifications marker.
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:1152
enum GNUNET_GenericReturnValue GNUNET_BIO_write_spec_commit(struct GNUNET_BIO_WriteHandle *h, struct GNUNET_BIO_WriteSpec *ws)
Execute the write specifications in order.
Definition: bio.c:1357
enum GNUNET_GenericReturnValue GNUNET_BIO_read_close(struct GNUNET_BIO_ReadHandle *h, char **emsg)
Close an open handle.
Definition: bio.c:162
enum GNUNET_GenericReturnValue 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
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:1602
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:682
struct GNUNET_DISK_PipeHandle * GNUNET_DISK_pipe(enum GNUNET_DISK_PipeFlags pf)
Creates an interprocess channel.
Definition: disk.c:1425
enum GNUNET_GenericReturnValue GNUNET_DISK_pipe_close(struct GNUNET_DISK_PipeHandle *p)
Closes an interprocess channel.
Definition: disk.c:1572
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_test(const char *fil, int is_readable)
Test if fil is a directory and listable.
Definition: disk.c:427
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:646
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:811
@ 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:132
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the 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.
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.
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.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
@ 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.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
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
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_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(const struct GNUNET_OS_ProjectData *pd, 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:407
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:1661
const struct GNUNET_SCHEDULER_TaskContext * GNUNET_SCHEDULER_get_task_context(void)
Obtain the reasoning why the current task was started.
Definition: scheduler.c:758
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:1339
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
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:1304
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:1277
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:1231
@ 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
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:344
#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:438
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:533
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:352
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.
GNUNET_BIO_WriteHandler wh
Function performing data serialization.
Internal representation of the hash map.
Handle used to access files (and pipes).
Handle used to manage a pipe.
Definition: disk.c:69
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).