GNUnet 0.26.2-98-gb402d9955
 
Loading...
Searching...
No Matches
gnunet-service-fs.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2014, 2016, 2026 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 <float.h>
28#include "gnunet_core_service.h"
29#include "gnunet_pils_service.h"
30#include "gnunet_dht_service.h"
32#include "gnunet_load_lib.h"
33#include "gnunet_protocols.h"
34#include "gnunet_signatures.h"
36#include "gnunet_util_lib.h"
44#include "fs.h"
45#include "fs_api.h"
46
52#define FS_DHT_HT_SIZE 1024
53
54
60#define COVER_AGE_FREQUENCY GNUNET_TIME_relative_multiply ( \
61 GNUNET_TIME_UNIT_SECONDS, 5)
62
66#define INSANE_STATISTICS GNUNET_NO
67
68
100
101
107{
112
117
122
126 size_t msize;
127};
128
129
166
167
215
216
217/* ****************************** globals ****************************** */
218
223
228
233
238
243
249
250
262
267
273
279
284
290
296
301
302/* ***************************** locals ******************************* */
303
308
313
318
323
324
333static void *
335 struct GNUNET_SERVICE_Client *client,
336 struct GNUNET_MQ_Handle *mq)
337{
338 struct GSF_LocalClient *pos;
339
340 pos = GNUNET_new (struct GSF_LocalClient);
341 pos->client = client;
342 pos->mq = mq;
343 return pos;
344}
345
346
352static void
354{
355 struct ClientRequest *cr = cls;
356 struct GSF_LocalClient *lc = cr->lc;
357
358 cr->kill_task = NULL;
360 lc->cr_tail,
361 cr);
363 GNUNET_YES);
365 gettext_noop ("# client searches active"),
366 -1,
367 GNUNET_NO);
368 GNUNET_free (cr);
369}
370
371
390static void
393 struct GSF_PendingRequest *pr,
394 uint32_t reply_anonymity_level,
396 struct GNUNET_TIME_Absolute last_transmission,
398 const void *data,
399 size_t data_len)
400{
401 struct ClientRequest *cr = cls;
402 struct GSF_LocalClient *lc;
403 struct GNUNET_MQ_Envelope *env;
404 struct ClientPutMessage *pm;
405 const struct GSF_PendingRequestData *prd;
406
407 if (NULL == data)
408 {
409 /* local-only request, with no result, clean up. */
410 if (NULL == cr->kill_task)
412 cr);
413 return;
414 }
417 if ((prd->type != type) && (prd->type != GNUNET_BLOCK_TYPE_ANY))
418 {
419 GNUNET_break (0);
420 return;
421 }
424 ("# replies received for local clients"), 1,
425 GNUNET_NO);
426 GNUNET_assert (pr == cr->pr);
427 lc = cr->lc;
429 data_len,
431 pm->type = htonl (type);
433 pm->last_transmission = GNUNET_TIME_absolute_hton (last_transmission);
434 pm->num_transmissions = htonl (prd->num_transmissions);
435 pm->respect_offered = htonl (prd->respect_offered);
436 GNUNET_memcpy (&pm[1],
437 data,
438 data_len);
439 GNUNET_MQ_send (lc->mq,
440 env);
442 "Queued reply to query `%s' for local client\n",
443 GNUNET_h2s (&prd->query));
444 if (GNUNET_BLOCK_REPLY_OK_LAST != eval)
445 {
447 "Evaluation %d - keeping query alive\n",
448 (int) eval);
449 return;
450 }
451 if (NULL == cr->kill_task)
453 cr);
454}
455
456
465static void
467 struct GNUNET_SERVICE_Client *client,
468 void *app_ctx)
469{
470 struct GSF_LocalClient *lc = app_ctx;
471 struct IndexStartContext *isc;
472 struct ClientRequest *cr;
473 struct ClientResponse *res;
474
475 while (NULL != (cr = lc->cr_head))
476 {
477 if (NULL != cr->kill_task)
480 }
481 while (NULL != (res = lc->res_head))
482 {
484 lc->res_tail,
485 res);
487 }
488 while (NULL != (isc = lc->isc_head))
489 {
491 lc->isc_tail,
492 isc);
494 GNUNET_free (isc);
495 }
496 GNUNET_free (lc);
497}
498
499
505static void
515
516
523void
531
532
543int
545{
546 double ld;
547
549 if (ld < 1)
550 return GNUNET_SYSERR;
551 if (ld <= priority)
552 return GNUNET_NO;
553 return GNUNET_YES;
554}
555
556
565static int
566check_p2p_put (void *cls,
567 const struct PutMessage *put)
568{
570
571 type = ntohl (put->type);
573 {
574 GNUNET_break_op (0);
575 return GNUNET_SYSERR;
576 }
577 return GNUNET_OK;
578}
579
580
590static void
592 const struct GNUNET_PeerIdentity *peer,
593 struct GSF_ConnectedPeer *cp,
594 const struct GSF_PeerPerformanceData *ppd)
595{
596 struct GSF_PendingRequest *pr = cls;
597
598 if (GNUNET_YES !=
600 {
601#if INSANE_STATISTICS
603 gettext_noop ("# Loopback routes suppressed"), 1,
604 GNUNET_NO);
605#endif
606 return;
607 }
608 GSF_plan_add_ (cp,
609 pr);
610}
611
612
623void
625 struct GSF_PendingRequest *pr,
627{
629 return; /* we're done... */
630 if (GNUNET_YES !=
632 return; /* request is not actually active, skip! */
634 pr);
635}
636
637
646static int
647check_p2p_get (void *cls,
648 const struct GetMessage *gm)
649{
650 size_t msize;
651 unsigned int bm;
652 unsigned int bits;
653 size_t bfsize;
654
655 msize = ntohs (gm->header.size);
656 bm = ntohl (gm->hash_bitmap);
657 bits = 0;
658 while (bm > 0)
659 {
660 if (1 == (bm & 1))
661 bits++;
662 bm >>= 1;
663 }
664 if (msize < sizeof(struct GetMessage) + bits * sizeof(struct
666 {
667 GNUNET_break_op (0);
668 return GNUNET_SYSERR;
669 }
670 bfsize = msize - sizeof(struct GetMessage) - bits * sizeof(struct
672 /* bfsize must be power of 2, check! */
673 if (0 != ((bfsize - 1) & bfsize))
674 {
675 GNUNET_break_op (0);
676 return GNUNET_SYSERR;
677 }
678 return GNUNET_OK;
679}
680
681
692static void
694 struct GSF_PendingRequest *pr,
696{
697 struct GSF_LocalClient *lc = cls;
698 struct GSF_PendingRequestData *prd;
699
702 return; /* we're done, 'pr' was already destroyed... */
705 "Finished database lookup for local request `%s' with result %d\n",
706 GNUNET_h2s (&prd->query),
707 result);
708 if (0 == prd->anonymity_level)
709 {
710 switch (prd->type)
711 {
714 /* the above block types MAY be available via 'cadet' */
716 "Considering cadet-based download for block\n");
718 break;
719
721 /* the above block types are in the DHT */
723 "Considering DHT-based search for block\n");
724 GSF_dht_lookup_ (pr);
725 break;
726
727 default:
728 GNUNET_break (0);
729 break;
730 }
731 }
733 pr,
734 result);
735}
736
737
746static int
748 const struct SearchMessage *sm)
749{
750 uint16_t msize;
751
752 msize = ntohs (sm->header.size) - sizeof(struct SearchMessage);
753 if (0 != msize % sizeof(struct GNUNET_HashCode))
754 {
755 GNUNET_break (0);
756 return GNUNET_SYSERR;
757 }
758 return GNUNET_OK;
759}
760
761
772static void
774 const struct SearchMessage *sm)
775{
776 static struct GNUNET_PeerIdentity all_zeros;
777 struct GSF_LocalClient *lc = cls;
778 struct ClientRequest *cr;
779 struct GSF_PendingRequestData *prd;
780 uint16_t msize;
781 unsigned int sc;
784
786 gettext_noop ("# client searches received"),
787 1,
788 GNUNET_NO);
789 msize = ntohs (sm->header.size) - sizeof(struct SearchMessage);
790 sc = msize / sizeof(struct GNUNET_HashCode);
791 type = ntohl (sm->type);
793 "Received request for `%s' of type %u from local client\n",
794 GNUNET_h2s (&sm->query),
795 (unsigned int) type);
796 cr = NULL;
797 /* detect duplicate UBLOCK requests */
800 {
801 cr = lc->cr_head;
802 while (NULL != cr)
803 {
805 /* only unify with queries that hae not yet started local processing
806 (SEARCH_MESSAGE_OPTION_CONTINUED was always set) and that have a
807 matching query and type */
808 if ((GNUNET_YES != prd->has_started) &&
809 (0 != memcmp (&prd->query,
810 &sm->query,
811 sizeof(struct GNUNET_HashCode))) &&
812 (prd->type == type))
813 break;
814 cr = cr->next;
815 }
816 }
817 if (NULL != cr)
818 {
820 "Have existing request, merging content-seen lists.\n");
822 (const struct GNUNET_HashCode *) &sm[1],
823 sc);
826 "# client searches updated (merged content seen list)"),
827 1,
828 GNUNET_NO);
829 }
830 else
831 {
833 gettext_noop ("# client searches active"),
834 1,
835 GNUNET_NO);
836 cr = GNUNET_new (struct ClientRequest);
837 cr->lc = lc;
839 lc->cr_tail,
840 cr);
842 if (0 != (SEARCH_MESSAGE_OPTION_LOOPBACK_ONLY & ntohl (sm->options)))
845 &sm->query,
846 (0 !=
847 memcmp (&sm->target,
848 &all_zeros,
849 sizeof(struct
851 ? &sm->target : NULL, NULL,
852 0 /* bf */,
853 ntohl (sm->anonymity_level),
854 0 /* priority */,
855 0 /* ttl */,
856 0 /* sender PID */,
857 0 /* origin PID */,
858 (const struct
859 GNUNET_HashCode *) &sm[1], sc,
861 cr);
862 }
863 if (0 != (SEARCH_MESSAGE_OPTION_CONTINUED & ntohl (sm->options)))
864 {
866 return;
867 }
871 lc);
872}
873
874
881static void
883 const struct RequestLocSignatureMessage *msg)
884{
885 struct GSF_LocalClient *lc = cls;
886 struct GNUNET_FS_Uri base;
887 struct GNUNET_FS_Uri *loc;
888 struct GNUNET_MQ_Envelope *env;
889 struct ResponseLocSignatureMessage *resp;
890
892 ntohl (msg->purpose));
893 base.type = GNUNET_FS_URI_CHK;
894 base.data.chk.chk = msg->chk;
895 base.data.chk.file_length = GNUNET_ntohll (msg->file_length);
896 loc = GNUNET_FS_uri_loc_create (&base,
897 &pk,
899 msg->expiration_time));
900 env = GNUNET_MQ_msg (resp,
904 loc->data.loc.expirationTime);
905 resp->signature = loc->data.loc.contentSignature;
906 resp->peer = loc->data.loc.peer;
908 GNUNET_MQ_send (lc->mq,
909 env);
911}
912
913
921static int
923 const struct IndexStartMessage *ism)
924{
925 char *fn;
926
928 if (0 != ism->reserved)
929 {
930 GNUNET_break (0);
931 return GNUNET_SYSERR;
932 }
933 fn = GNUNET_STRINGS_filename_expand ((const char *) &ism[1]);
934 if (NULL == fn)
935 {
936 GNUNET_break (0);
937 return GNUNET_SYSERR;
938 }
939 GNUNET_free (fn);
940 return GNUNET_OK;
941}
942
943
950static void
952{
953 struct GSF_LocalClient *lc = isc->lc;
954 struct GNUNET_MQ_Envelope *env;
956
958 &isc->file_id);
961 GNUNET_MQ_send (lc->mq,
962 env);
963 GNUNET_free (isc->filename);
964 GNUNET_free (isc);
966}
967
968
976static void
978 const struct GNUNET_HashCode *res)
979{
980 struct IndexStartContext *isc = cls;
981 struct GSF_LocalClient *lc = isc->lc;
982 struct GNUNET_MQ_Envelope *env;
984
986 lc->isc_tail,
987 isc);
988 isc->fhc = NULL;
989 if ((NULL == res) ||
990 (0 != memcmp (res,
991 &isc->file_id,
992 sizeof(struct GNUNET_HashCode))))
993 {
995 _ (
996 "Hash mismatch trying to index file `%s' which does not have hash `%s'\n"),
997 isc->filename,
998 GNUNET_h2s (&isc->file_id));
999
1000 const char *emsg = "hash mismatch";
1001 const size_t msize = strlen (emsg) + 1;
1002
1004 msize,
1006 memcpy ((char*) &msg[1], emsg, msize);
1007 GNUNET_MQ_send (lc->mq,
1008 env);
1010 GNUNET_free (isc);
1011 return;
1012 }
1013 signal_index_ok (isc);
1014}
1015
1016
1023static void
1025 const struct IndexStartMessage *ism)
1026{
1027 struct GSF_LocalClient *lc = cls;
1028 struct IndexStartContext *isc;
1029 char *fn;
1030 uint64_t dev;
1031 uint64_t ino;
1032 uint64_t mydev;
1033 uint64_t myino;
1034
1035 fn = GNUNET_STRINGS_filename_expand ((const char *) &ism[1]);
1036 GNUNET_assert (NULL != fn);
1037 dev = GNUNET_ntohll (ism->device);
1038 ino = GNUNET_ntohll (ism->inode);
1039 isc = GNUNET_new (struct IndexStartContext);
1040 isc->filename = fn;
1041 isc->file_id = ism->file_id;
1043 "Received START_INDEX message for file `%s'\n",
1044 isc->filename);
1045 isc->lc = lc;
1046 mydev = 0;
1047 myino = 0;
1048 if (((dev != 0) ||
1049 (ino != 0)) &&
1051 &mydev,
1052 &myino)) &&
1053 (dev == mydev) &&
1054 (ino == myino))
1055 {
1056 /* fast validation OK! */
1057 signal_index_ok (isc);
1058 return;
1059 }
1061 "Mismatch in file identifiers (%llu != %llu or %u != %u), need to hash.\n",
1062 (unsigned long long) ino,
1063 (unsigned long long) myino,
1064 (unsigned int) dev,
1065 (unsigned int) mydev);
1066 /* slow validation, need to hash full file (again) */
1068 lc->isc_tail,
1069 isc);
1071 isc->filename,
1074 isc);
1075 if (NULL == isc->fhc)
1076 hash_for_index_val (isc,
1077 NULL);
1078}
1079
1080
1087static void
1089 const struct GNUNET_MessageHeader *message)
1090{
1091 struct GSF_LocalClient *lc = cls;
1092
1095}
1096
1097
1104static void
1106 const struct UnindexMessage *um)
1107{
1108 struct GSF_LocalClient *lc = cls;
1109 struct GNUNET_MQ_Envelope *env;
1110 struct GNUNET_MessageHeader *msg;
1111 int found;
1112
1113 GNUNET_break (0 == um->reserved);
1116 "Client requested unindexing of file `%s': %s\n",
1117 GNUNET_h2s (&um->file_id),
1118 found ? "found" : "not found");
1121 GNUNET_MQ_send (lc->mq,
1122 env);
1124}
1125
1126
1132static void
1173
1174
1180static int
1182{
1183 struct GNUNET_MQ_MessageHandler no_p2p_handlers[] = {
1185 };
1186 struct GNUNET_MQ_MessageHandler p2p_handlers[] = {
1187 GNUNET_MQ_hd_var_size (p2p_get,
1189 struct GetMessage,
1190 NULL),
1191 GNUNET_MQ_hd_var_size (p2p_put,
1193 struct PutMessage,
1194 NULL),
1195 GNUNET_MQ_hd_fixed_size (p2p_migration_stop,
1197 struct MigrationStopMessage,
1198 NULL),
1200 };
1201 int anon_p2p_off;
1202 struct GNUNET_CORE_ServiceInfo service_info = {
1204 .version = { 1, 0 },
1205 .version_max = { 1, 0 },
1206 .version_min = { 1, 0 },
1207 };
1208
1209 /* this option is really only for testcases that need to disable
1210 _anonymous_ file-sharing for some reason */
1211 anon_p2p_off = (GNUNET_YES ==
1213 "fs",
1214 "DISABLE_ANON_TRANSFER")
1215 );
1216 GSF_pils = GNUNET_PILS_connect (GSF_cfg, NULL, NULL);
1217 if (NULL == GSF_pils)
1218 {
1220 _ ("Failed to connect to `%s' service.\n"),
1221 "pils");
1222 return GNUNET_SYSERR;
1223 }
1224 GSF_core
1226 NULL,
1227 NULL,
1230 (GNUNET_YES == anon_p2p_off)
1231 ? no_p2p_handlers
1232 : p2p_handlers,
1233 &service_info);
1234 if (NULL == GSF_core)
1235 {
1237 _ ("Failed to connect to `%s' service.\n"),
1238 "core");
1239 return GNUNET_SYSERR;
1240 }
1244 NULL);
1248 NULL);
1249 return GNUNET_OK;
1250}
1251
1252
1260static void
1261run (void *cls,
1262 const struct GNUNET_CONFIGURATION_Handle *cfg,
1264{
1265 unsigned long long dqs;
1266
1267 GSF_cfg = cfg;
1268 if (GNUNET_OK !=
1270 "fs",
1271 "DATASTORE_QUEUE_SIZE",
1272 &dqs))
1273 {
1275 "fs",
1276 "DATASTORE_QUEUE_SIZE");
1277 dqs = 32;
1278 }
1279 GSF_datastore_queue_size = (unsigned int) dqs;
1283 if (NULL == GSF_dsh)
1284 {
1286 return;
1287 }
1292 GNUNET_assert (NULL != GSF_block_ctx);
1294 GSF_plan_init ();
1297
1298 GSF_push_init_ ();
1299 GSF_put_init_ ();
1301 GSF_dsh)) ||
1302 (GNUNET_OK != main_init (cfg)))
1303 {
1305 shutdown_task (NULL);
1306 return;
1307 }
1308}
1309
1310
1316 "fs",
1318 &run,
1321 NULL,
1322 GNUNET_MQ_hd_var_size (client_index_start,
1324 struct IndexStartMessage,
1325 NULL),
1326 GNUNET_MQ_hd_fixed_size (client_index_list_get,
1328 struct GNUNET_MessageHeader,
1329 NULL),
1330 GNUNET_MQ_hd_fixed_size (client_unindex,
1332 struct UnindexMessage,
1333 NULL),
1334 GNUNET_MQ_hd_var_size (client_start_search,
1336 struct SearchMessage,
1337 NULL),
1338 GNUNET_MQ_hd_fixed_size (client_loc_sign,
1341 NULL),
1343
1344
1345/* end of gnunet-service-fs.c */
struct GNUNET_GETOPT_CommandLineOption options[]
Definition 002.c:5
struct GNUNET_MessageHeader * msg
Definition 005.c:2
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
definitions for the entire fs module
#define HASHING_BLOCKSIZE
Blocksize to use when hashing files for indexing (blocksize for IO, not for the DBlocks).
Definition fs.h:48
#define SEARCH_MESSAGE_OPTION_LOOPBACK_ONLY
Only search the local datastore (no network)
Definition fs.h:254
#define SEARCH_MESSAGE_OPTION_CONTINUED
Request is too large to fit in 64k format.
Definition fs.h:262
shared definitions for the FS library
@ GNUNET_FS_URI_CHK
Content-hash-key (simple file).
Definition fs_api.h:144
#define gettext_noop(String)
Definition gettext.h:74
static int start
Set if we are to start default services (including ARM).
Definition gnunet-arm.c:38
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static char * data
The data to insert into the dht.
static struct GNUNET_TIME_Relative expiration
User supplied expiration value.
struct GNUNET_SCHEDULER_Task * shutdown_task
static char * res
Currently read line or NULL on EOF.
static uint32_t type
Type string converted to DNS type value.
static int result
Global testing status.
static struct GNUNET_FS_SearchContext * sc
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
static struct GNUNET_SCHEDULER_Task * cover_age_task
ID of our task that we use to age the cover counters.
static void handle_client_loc_sign(void *cls, const struct RequestLocSignatureMessage *msg)
Handle request to sign a LOC URI (from client).
#define COVER_AGE_FREQUENCY
How quickly do we age cover traffic? At the given time interval, remaining cover traffic counters are...
int GSF_enable_randomized_delays
Are we introducing randomized delays for better anonymity?
static struct GNUNET_LOAD_Value * datastore_get_load
Datastore 'GET' load tracking.
static int check_p2p_get(void *cls, const struct GetMessage *gm)
Check P2P "GET" request.
struct GNUNET_PILS_Handle * GSF_pils
Pointer to handle of the pils service (points to NULL until we've connected to it).
void GSF_update_datastore_delay_(struct GNUNET_TIME_Absolute start)
We've just now completed a datastore request.
struct GNUNET_BLOCK_Context * GSF_block_ctx
Our block context.
static void hash_for_index_val(void *cls, const struct GNUNET_HashCode *res)
Function called once the hash computation over an indexed file has completed.
static void start_p2p_processing(void *cls, struct GSF_PendingRequest *pr, enum GNUNET_BLOCK_ReplyEvaluationResult result)
We're done with the local lookup, now consider P2P processing (depending on request options and resul...
static void handle_client_start_search(void *cls, const struct SearchMessage *sm)
Handle GNUNET_MESSAGE_TYPE_FS_START_SEARCH-message (search request from client).
static void handle_client_unindex(void *cls, const struct UnindexMessage *um)
Handle UNINDEX-message.
static void handle_client_index_start(void *cls, const struct IndexStartMessage *ism)
Handle INDEX_START-message.
static int check_client_index_start(void *cls, const struct IndexStartMessage *ism)
Check INDEX_START-message.
static void handle_client_index_list_get(void *cls, const struct GNUNET_MessageHeader *message)
Handle INDEX_LIST_GET-message.
struct GNUNET_DHT_Handle * GSF_dht
Handle for DHT operations.
static struct GNUNET_CRYPTO_EddsaPrivateKey pk
Private key of this peer.
static void consider_request_for_forwarding(void *cls, const struct GNUNET_PeerIdentity *peer, struct GSF_ConnectedPeer *cp, const struct GSF_PeerPerformanceData *ppd)
We have a new request, consider forwarding it to the given peer.
int GSF_test_get_load_too_high_(uint32_t priority)
Test if the DATABASE (GET) load on this peer is too high to even consider processing the query at all...
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
Creates a fresh local client handle.
struct GNUNET_STATISTICS_Handle * GSF_stats
Handle for reporting statistics.
static void signal_index_ok(struct IndexStartContext *isc)
We've validated the hash of the file we're about to index.
double GSF_current_priorities
Typical priorities we're seeing from other peers right now.
unsigned int GSF_cover_query_count
How many query messages have we received 'recently' that have not yet been claimed as cover traffic?
const struct GNUNET_CONFIGURATION_Handle * GSF_cfg
Our configuration.
static int check_p2p_put(void *cls, const struct PutMessage *put)
Check P2P "PUT" message.
void GSF_consider_forwarding(void *cls, struct GSF_PendingRequest *pr, enum GNUNET_BLOCK_ReplyEvaluationResult result)
Function to be called after we're done processing replies from the local lookup.
static void age_cover_counters(void *cls)
Task that periodically ages our cover traffic statistics.
struct GNUNET_CORE_Handle * GSF_core
Pointer to handle to the core service (points to NULL until we've connected to it).
unsigned int GSF_cover_content_count
How many content messages have we received 'recently' that have not yet been claimed as cover traffic...
static void client_response_handler(void *cls, enum GNUNET_BLOCK_ReplyEvaluationResult eval, struct GSF_PendingRequest *pr, uint32_t reply_anonymity_level, struct GNUNET_TIME_Absolute expiration, struct GNUNET_TIME_Absolute last_transmission, enum GNUNET_BLOCK_Type type, const void *data, size_t data_len)
Handle a reply to a pending request.
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
A client disconnected from us.
struct GNUNET_TIME_Relative GSF_avg_latency
Running average of the observed latency to other peers (round trip).
static int main_init(const struct GNUNET_CONFIGURATION_Handle *c)
Process fs requests.
struct GNUNET_LOAD_Value * GSF_rt_entry_lifetime
How long do requests typically stay in the routing table?
struct GNUNET_DATASTORE_Handle * GSF_dsh
Our connection to the datastore.
#define FS_DHT_HT_SIZE
Size for the hash map for DHT requests from the FS service.
static void client_request_destroy(void *cls)
Free the given client request.
unsigned int GSF_datastore_queue_size
Size of the datastore queue we assume for common requests.
static int check_client_start_search(void *cls, const struct SearchMessage *sm)
Check GNUNET_MESSAGE_TYPE_FS_START_SEARCH-message (search request from client).
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *service)
Process fs requests.
static struct GNUNET_CONFIGURATION_Handle * block_cfg
Configuration for block library.
#define DATASTORE_LOAD_AUTODECLINE
At what frequency should our datastore load decrease automatically (since if we don't use it,...
non-anonymous file-transfer
void GSF_cadet_stop_server(void)
Shutdown subsystem for non-anonymous file-sharing.
void GSF_cadet_start_server(void)
Initialize subsystem for non-anonymous file-sharing.
void GSF_connected_peer_done_()
Shutdown peer management subsystem.
void GSF_peer_disconnect_handler(void *cls, const struct GNUNET_PeerIdentity *peer, void *internal_cls)
A peer disconnected from us.
void GSF_iterate_connected_peers_(GSF_ConnectedPeerIterator it, void *it_cls)
Iterate over all connected peers.
void GSF_connected_peer_init_()
Initialize peer management subsystem.
void * GSF_peer_connect_handler(void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq, enum GNUNET_CORE_PeerClass class)
A peer connected to us.
API to handle 'connected peers'.
int GNUNET_FS_indexing_do_unindex(const struct GNUNET_HashCode *fid)
Remove a file from the index.
void GNUNET_FS_add_to_index(const char *filename, const struct GNUNET_HashCode *file_id)
Add the given file to the list of indexed files.
int GNUNET_FS_indexing_init(const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_DATASTORE_Handle *d)
Initialize the indexing submodule.
void GNUNET_FS_indexing_send_list(struct GNUNET_MQ_Handle *mq)
Transmit information about indexed files to mq.
void GNUNET_FS_indexing_done()
Shutdown the module.
indexing for the file-sharing service
void GSF_plan_init()
Initialize plan subsystem.
void GSF_plan_add_(struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
Create a new query plan entry.
void GSF_plan_done()
Shutdown plan subsystem.
API to manage query plan.
int GSF_pending_request_test_target_(struct GSF_PendingRequest *pr, const struct GNUNET_PeerIdentity *target)
Is the given target a legitimate peer for forwarding the given request?
struct GSF_PendingRequest * GSF_pending_request_create_(enum GSF_PendingRequestOptions options, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *query, const struct GNUNET_PeerIdentity *target, const char *bf_data, size_t bf_size, uint32_t anonymity_level, uint32_t priority, int32_t ttl, GNUNET_PEER_Id sender_pid, GNUNET_PEER_Id origin_pid, const struct GNUNET_HashCode *replies_seen, unsigned int replies_seen_count, GSF_PendingRequestReplyHandler rh, void *rh_cls)
Create a new pending request.
void GSF_cadet_lookup_(struct GSF_PendingRequest *pr)
Consider downloading via cadet (if possible)
void GSF_dht_lookup_(struct GSF_PendingRequest *pr)
Consider looking up the data in the DHT (anonymity-level permitting).
void GSF_local_lookup_(struct GSF_PendingRequest *pr, GSF_LocalLookupContinuation cont, void *cont_cls)
Look up the request in the local datastore.
void GSF_pending_request_init_()
Setup the subsystem.
struct GSF_PendingRequestData * GSF_pending_request_get_data_(struct GSF_PendingRequest *pr)
Obtain the public data associated with a pending request.
int GSF_pending_request_test_active_(struct GSF_PendingRequest *pr)
Check if the given request is still active.
void GSF_pending_request_done_()
Shutdown the subsystem.
void GSF_pending_request_cancel_(struct GSF_PendingRequest *pr, int full_cleanup)
Explicitly cancel a pending request.
void GSF_pending_request_update_(struct GSF_PendingRequest *pr, const struct GNUNET_HashCode *replies_seen, unsigned int replies_seen_count)
Update a given pending request with additional replies that have been seen.
API to handle pending requests.
GSF_PendingRequestOptions
Options for pending requests (bits to be ORed).
@ GSF_PRO_LOCAL_REQUEST
Option mask for typical local requests.
@ GSF_PRO_LOCAL_ONLY
Request must only be processed locally.
void GSF_push_init_()
Setup the module.
void GSF_push_done_()
Shutdown the module.
support for pushing out content
void GSF_put_init_()
Setup the module.
void GSF_put_done_()
Shutdown the module.
support for putting content into the DHT
static struct GNUNET_TRANSPORT_PluginMonitor * pm
Handle if we are monitoring plugin session activity.
Core service; the main API for encrypted P2P communications.
GNUNET_BLOCK_Type
WARNING: This header is generated! In order to add DHT block types, you must register them in GANA,...
@ GNUNET_BLOCK_TYPE_FS_DBLOCK
Data block (leaf) in the CHK tree.
@ GNUNET_BLOCK_TYPE_FS_ONDEMAND
Type of a block representing a block to be encoded on demand from disk.
@ GNUNET_BLOCK_TYPE_FS_IBLOCK
Inner block in the CHK tree.
@ GNUNET_BLOCK_TYPE_ANY
Identifier for any block.
@ GNUNET_BLOCK_TYPE_FS_UBLOCK
Type of a block representing any type of search result (universal).
API to the DHT service.
Functions related to load calculations.
struct GNUNET_PILS_Handle * GNUNET_PILS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_PILS_PidChangeCallback pid_change_cb, void *cls)
Connect to the PILS service.
Definition pils_api.c:465
void GNUNET_PILS_disconnect(struct GNUNET_PILS_Handle *handle)
Disconnect from the PILS service.
Definition pils_api.c:488
Constants for network protocols.
#define GNUNET_SIGNATURE_PURPOSE_PEER_PLACEMENT
Signature by which a peer affirms that it is providing a certain bit of content for use in LOCation U...
API to create, modify and access statistics.
GNUNET_BLOCK_ReplyEvaluationResult
Possible ways for how a block may relate to a query.
void GNUNET_BLOCK_context_destroy(struct GNUNET_BLOCK_Context *ctx)
Destroy the block context.
Definition block.c:158
struct GNUNET_BLOCK_Context * GNUNET_BLOCK_context_create(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a block context.
Definition block.c:140
@ GNUNET_BLOCK_REPLY_OK_LAST
Last possible valid result.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_size(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *size)
Get a configuration value that should be a size in bytes.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_yesno(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Get a configuration value that should be in a set of "YES" or "NO".
struct GNUNET_CORE_Handle * GNUNET_CORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, void *cls, GNUNET_CORE_StartupCallback init, GNUNET_CORE_ConnectEventHandler connects, GNUNET_CORE_DisconnectEventHandler disconnects, const struct GNUNET_MQ_MessageHandler *handlers, const struct GNUNET_CORE_ServiceInfo *service_info)
Connect to the core service.
Definition core_api.c:698
void GNUNET_CORE_disconnect(struct GNUNET_CORE_Handle *handle)
Disconnect from the core service.
Definition core_api.c:744
@ GNUNET_CORE_SERVICE_FS
Identifier for fs (file sharing) service.
void GNUNET_DATASTORE_disconnect(struct GNUNET_DATASTORE_Handle *h, int drop)
Disconnect from the datastore service (and free associated resources).
struct GNUNET_DATASTORE_Handle * GNUNET_DATASTORE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the datastore service.
struct GNUNET_DHT_Handle * GNUNET_DHT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int ht_len)
Initialize the connection with the DHT service.
Definition dht_api.c:1036
void GNUNET_DHT_disconnect(struct GNUNET_DHT_Handle *handle)
Shutdown connection with the DHT service.
Definition dht_api.c:1059
enum GNUNET_GenericReturnValue GNUNET_DISK_file_get_identifiers(const char *filename, uint64_t *dev, uint64_t *ino)
Obtain some unique identifiers for the given file that can be used to identify it in the local system...
Definition disk.c:254
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_FS_Uri * GNUNET_FS_uri_loc_create(const struct GNUNET_FS_Uri *base_uri, const struct GNUNET_CRYPTO_EddsaPrivateKey *sign_key, struct GNUNET_TIME_Absolute expiration_time)
Construct a location URI (this peer will be used for the location).
Definition fs_uri.c:869
void GNUNET_FS_uri_destroy(struct GNUNET_FS_Uri *uri)
Free URI.
Definition fs_uri.c:677
struct GNUNET_CRYPTO_FileHashContext * GNUNET_CRYPTO_hash_file(enum GNUNET_SCHEDULER_Priority priority, const char *filename, size_t blocksize, GNUNET_CRYPTO_HashCompletedCallback callback, void *callback_cls)
Compute the hash of an entire file.
#define GNUNET_log(kind,...)
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
void GNUNET_CRYPTO_hash_file_cancel(struct GNUNET_CRYPTO_FileHashContext *fhc)
Cancel a file hashing operation.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_SCHEDULER_PRIORITY_IDLE
Run when otherwise idle.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
struct GNUNET_LOAD_Value * GNUNET_LOAD_value_init(struct GNUNET_TIME_Relative autodecline)
Create a new load value.
Definition load.c:124
void GNUNET_LOAD_update(struct GNUNET_LOAD_Value *load, uint64_t data)
Update the current load.
Definition load.c:236
double GNUNET_LOAD_get_load(struct GNUNET_LOAD_Value *load)
Get the current load.
Definition load.c:200
#define GNUNET_LOAD_value_free(lv)
Free a load value.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#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).
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition mq.c:305
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
#define GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_GET
Request from client for list of indexed files.
#define GNUNET_MESSAGE_TYPE_FS_UNINDEX_OK
Reply to client indicating unindex receipt.
#define GNUNET_MESSAGE_TYPE_FS_START_SEARCH
Client asks FS service to start a (keyword) search.
#define GNUNET_MESSAGE_TYPE_FS_INDEX_START
Message sent by fs client to start indexing.
#define GNUNET_MESSAGE_TYPE_FS_PUT
P2P response with content or active migration of content.
#define GNUNET_MESSAGE_TYPE_FS_GET
P2P request for content (one FS to another).
#define GNUNET_MESSAGE_TYPE_FS_MIGRATION_STOP
Peer asks us to stop migrating content towards it for a while.
#define GNUNET_MESSAGE_TYPE_FS_UNINDEX
Request from client to unindex a file.
#define GNUNET_MESSAGE_TYPE_FS_INDEX_START_FAILED
Response to a request for start indexing that refuses.
#define GNUNET_MESSAGE_TYPE_FS_REQUEST_LOC_SIGN
Message sent by fs client to request LOC signature.
#define GNUNET_MESSAGE_TYPE_FS_REQUEST_LOC_SIGNATURE
Reply sent by fs service with LOC signature.
#define GNUNET_MESSAGE_TYPE_FS_INDEX_START_OK
Affirmative response to a request for start indexing.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition scheduler.c:572
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:1345
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
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:1310
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:1283
#define GNUNET_SERVICE_MAIN(pd, service_name, service_options, init_cb, connect_cb, disconnect_cb, cls,...)
Creates the "main" function for a GNUnet service.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition service.c:2434
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
char * GNUNET_STRINGS_filename_expand(const char *fil)
Complete filename (a la shell) from abbrevition.
Definition strings.c:525
#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_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition time.c:737
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition time.c:636
#define _(String)
GNU gettext support macro.
Definition platform.h:179
static struct GNUNET_MQ_Handle * mq
Our connection to the resolver service, created on-demand, but then persists until error or shutdown.
Response from FS service with a result for a previous FS search.
Definition fs.h:356
Doubly-linked list of requests we are performing on behalf of the same client.
struct ClientRequest * prev
This is a doubly-linked list.
struct GNUNET_SCHEDULER_Task * kill_task
Task scheduled to destroy the request.
struct ClientRequest * next
This is a doubly-linked list.
struct GSF_LocalClient * lc
Client list this request belongs to.
struct GSF_PendingRequest * pr
Request this entry represents.
Replies to be transmitted to the client.
size_t msize
Number of bytes in the response.
struct ClientResponse * prev
This is a doubly-linked list.
struct GSF_LocalClient * lc
Client list entry this response belongs to.
struct ClientResponse * next
This is a doubly-linked list.
struct ContentHashKey chk
Query and key of the top GNUNET_EC_IBlock.
Definition fs_api.h:104
uint64_t file_length
Total size of the file in bytes.
Definition fs_api.h:99
Handle to an initialized block library.
Definition block.c:55
Context for the core service connection.
Definition core_api.c:78
Gnunet service info - identifying compatibility with a range of version of a service communicating ov...
enum GNUNET_CORE_Service service
Identifier of the service on top of CORE.
Private ECC key encoded for transmission.
Context used when hashing a file.
Handle to the datastore service.
Connection to the DHT service.
Definition dht_api.c:235
A Universal Resource Identifier (URI), opaque.
Definition fs_api.h:167
enum GNUNET_FS_UriType type
Type of the URI.
Definition fs_api.h:171
struct Location loc
Information needed to retrieve a file including signed location (identity of a peer) of the content.
Definition fs_api.h:218
struct FileIdentifier chk
Information needed to retrieve a file (content-hash-key plus file size).
Definition fs_api.h:212
union GNUNET_FS_Uri::@57 data
A 512-bit hashcode.
Values we track for load calculations.
Definition load.c:36
Handle to a message queue.
Definition mq.c:87
Message handler for a specific message type.
Header for all communications.
A handle for the PILS service.
Definition pils_api.c:82
The identity of the host (wraps the signing key of the peer).
Entry in list of pending tasks.
Definition scheduler.c:141
Handle to a client that is connected to a service.
Definition service.c:249
Handle to a service.
Definition service.c:116
Handle for the service.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.
A local client.
struct IndexStartContext * isc_head
This is a doubly linked list.
struct ClientRequest * cr_head
Head of list of requests performed on behalf of this client right now.
struct ClientResponse * res_tail
Tail of linked list of responses.
struct ClientRequest * cr_tail
Tail of list of requests performed on behalf of this client right now.
struct GNUNET_MQ_Handle * mq
Queue for sending replies.
struct IndexStartContext * isc_tail
This is a doubly linked list.
struct ClientResponse * res_head
Head of linked list of responses.
struct GNUNET_SERVICE_Client * client
ID of the client.
Performance data kept for a peer.
Public data (in the sense of not encapsulated within 'gnunet-service-fs_pr', not in the sense of netw...
int has_started
Has this request been started yet (local/p2p operations)? Or are we still constructing it?
uint32_t respect_offered
How much respect did we (in total) offer for this request so far (estimate, because we might have the...
enum GNUNET_BLOCK_Type type
Type of the requested block.
uint32_t num_transmissions
Counter for how often this request has been transmitted (estimate, because we might have the same req...
uint32_t anonymity_level
Desired anonymity level.
struct GNUNET_HashCode query
Primary query hash for this request.
An active request.
Message to the datastore service asking about specific content.
Definition datastore.h:141
struct GNUNET_MessageHeader header
Type is GNUNET_MESSAGE_TYPE_DATASTORE_GET.
Definition datastore.h:145
uint32_t hash_bitmap
Which of the optional hash codes are present at the end of the message? See GET_MESSAGE_BIT_xx consta...
Information we track while handling an index start request from a client.
struct GNUNET_CRYPTO_FileHashContext * fhc
Context for hashing of the file.
struct GNUNET_HashCode file_id
Hash of the contents of the file.
struct IndexStartContext * next
This is a doubly linked list.
struct IndexStartContext * prev
This is a doubly linked list.
struct GSF_LocalClient * lc
Context for transmitting confirmation to client.
char * filename
Name of the indexed file.
Message sent from a GNUnet (fs) publishing activity to the gnunet-fs-service to initiate indexing of ...
Definition fs.h:153
uint64_t inode
Inode of the file on the given device, as seen by the client ("st_ino" field from "struct stat").
Definition fs.h:179
struct GNUNET_HashCode file_id
Hash of the file that we would like to index.
Definition fs.h:184
uint32_t reserved
For alignment.
Definition fs.h:162
uint64_t device
ID of device containing the file, as seen by the client.
Definition fs.h:171
struct GNUNET_TIME_Absolute expirationTime
Time when this location URI expires.
Definition fs_api.h:127
struct GNUNET_CRYPTO_EddsaSignature contentSignature
Signature over the GNUNET_EC_FileIdentifier, peer identity and expiration time.
Definition fs_api.h:133
struct GNUNET_PeerIdentity peer
Identity of the peer sharing the file.
Definition fs_api.h:122
Message send by a peer that wants to be excluded from migration for a while.
Response from FS service with a result for a previous FS search.
Definition fs.h:330
uint32_t type
Type of the block (in big endian).
Definition fs.h:339
Message sent from a GNUnet (fs) publishing activity to sign a LOC URI.
Definition fs.h:76
Message sent from the service with the signed LOC URI.
Definition fs.h:109
struct GNUNET_CRYPTO_EddsaSignature signature
The requested signature.
Definition fs.h:130
struct GNUNET_PeerIdentity peer
Identity of the peer sharing the file.
Definition fs.h:135
uint32_t purpose
Purpose of the generated signature.
Definition fs.h:120
struct GNUNET_TIME_AbsoluteNBO expiration_time
Expiration time that was actually used (rounded!).
Definition fs.h:125
Message sent from a GNUnet (fs) search activity to the gnunet-service-fs to start a search.
Definition fs.h:270
struct GNUNET_PeerIdentity target
If the request is for a DBLOCK or IBLOCK, this is the identity of the peer that is known to have a re...
Definition fs.h:307
uint32_t type
Type of the content that we're looking for.
Definition fs.h:290
struct GNUNET_HashCode query
Hash of the public key for UBLOCKs; Hash of the CHK-encoded block for DBLOCKS and IBLOCKS.
Definition fs.h:313
uint32_t anonymity_level
Desired anonymity level, big-endian.
Definition fs.h:295
struct GNUNET_MessageHeader header
Message type will be GNUNET_MESSAGE_TYPE_FS_START_SEARCH.
Definition fs.h:274
uint32_t options
Bitmask with options.
Definition fs.h:285
Message sent from a GNUnet (fs) unindexing activity to the gnunet-service-fs to indicate that a file ...
Definition fs.h:228
struct GNUNET_HashCode file_id
Hash of the file that we will unindex.
Definition fs.h:242
uint32_t reserved
Always zero.
Definition fs.h:237