GNUnet 0.22.2
plugin_namestore_flat.c
Go to the documentation of this file.
1/*
2 * This file is part of GNUnet
3 * Copyright (C) 2009-2015, 2018, 2019 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 */
27#include "platform.h"
30
34struct Plugin
35{
36 const struct GNUNET_CONFIGURATION_Handle *cfg;
37
41 char *fn;
42
47};
48
49
50struct FlatFileEntry
51{
56
60 uint32_t record_count;
61
65 uint64_t rvalue;
66
71
75 char *label;
76};
77
78
86static void
88 const char *label,
89 struct GNUNET_HashCode *h)
90{
91 char *key;
92 size_t label_len;
93 size_t key_len;
94
95 label_len = strlen (label);
96 key_len = label_len + sizeof(struct GNUNET_CRYPTO_PrivateKey);
97 key = GNUNET_malloc (key_len);
99 label,
100 label_len);
101 GNUNET_memcpy (key + label_len,
102 pkey,
103 sizeof(struct GNUNET_CRYPTO_PrivateKey));
105 key_len,
106 h);
108}
109
110
119static int
121{
122 char *flatdbfile;
123 char *record_data;
124 char *zone_private_key;
125 char *record_data_b64;
126 char *buffer;
127 char *line;
128 char *label;
129 char *rvalue;
130 char *record_count;
131 size_t record_data_size;
132 uint64_t size;
133 struct GNUNET_HashCode hkey;
134 struct GNUNET_DISK_FileHandle *fh;
135 struct FlatFileEntry *entry;
137
138 if (GNUNET_OK !=
140 "namestore-flat",
141 "FILENAME",
142 &flatdbfile))
143 {
145 "namestore-flat",
146 "FILENAME");
147 return GNUNET_SYSERR;
148 }
149 if (GNUNET_OK !=
150 GNUNET_DISK_file_test (flatdbfile))
151 {
152 if (GNUNET_OK !=
154 {
155 GNUNET_break (0);
156 GNUNET_free (flatdbfile);
157 return GNUNET_SYSERR;
158 }
159 }
160 /* flatdbfile should be UTF-8-encoded. If it isn't, it's a bug */
161 plugin->fn = flatdbfile;
162
163 /* Load data from file into hashmap */
165 GNUNET_NO);
166 fh = GNUNET_DISK_file_open (flatdbfile,
171 if (NULL == fh)
172 {
174 _ ("Unable to initialize file: %s.\n"),
175 flatdbfile);
176 return GNUNET_SYSERR;
177 }
178 if (GNUNET_SYSERR ==
179 GNUNET_DISK_file_size (flatdbfile,
180 &size,
182 GNUNET_YES))
183 {
185 _ ("Unable to get filesize: %s.\n"),
186 flatdbfile);
188 return GNUNET_SYSERR;
189 }
190 if (size > SIZE_MAX)
191 {
193 _ ("File too big to map: %llu bytes.\n"),
194 (unsigned long long) size);
196 return GNUNET_SYSERR;
197 }
198 if (0 == size)
199 {
201 return GNUNET_OK;
202 }
203 buffer = GNUNET_DISK_file_map (fh,
204 &mh,
206 size);
207 if (NULL == buffer)
208 {
210 "mmap");
212 return GNUNET_SYSERR;
213 }
214 if ('\0' != buffer[size - 1])
215 {
217 _ ("Namestore database file `%s' malformed\n"),
218 flatdbfile);
221 return GNUNET_SYSERR;
222 }
223
224 line = strtok (buffer, "\n");
225 while (NULL != line)
226 {
227 zone_private_key = strtok (line, ",");
228 if (NULL == zone_private_key)
229 break;
230 rvalue = strtok (NULL, ",");
231 if (NULL == rvalue)
232 break;
233 record_count = strtok (NULL, ",");
234 if (NULL == record_count)
235 break;
236 record_data_b64 = strtok (NULL, ",");
237 if (NULL == record_data_b64)
238 break;
239 label = strtok (NULL, ",");
240 if (NULL == label)
241 break;
242 line = strtok (NULL, "\n");
243 entry = GNUNET_new (struct FlatFileEntry);
244 {
245 unsigned long long ll;
246
247 if (1 != sscanf (rvalue,
248 "%llu",
249 &ll))
250 {
252 "Error parsing entry\n");
253 GNUNET_free (entry);
254 break;
255 }
256 entry->rvalue = (uint64_t) ll;
257 }
258 {
259 unsigned int ui;
260
261 if (1 != sscanf (record_count,
262 "%u",
263 &ui))
264 {
266 "Error parsing entry\n");
267 GNUNET_free (entry);
268 break;
269 }
270 entry->record_count = (uint32_t) ui;
271 }
272 entry->label = GNUNET_strdup (label);
273 record_data_size
274 = GNUNET_STRINGS_base64_decode (record_data_b64,
275 strlen (record_data_b64),
276 (void **) &record_data);
277 entry->record_data =
279 struct GNUNET_GNSRECORD_Data);
280 if (GNUNET_OK !=
281 GNUNET_GNSRECORD_records_deserialize (record_data_size,
282 record_data,
283 entry->record_count,
284 entry->record_data))
285 {
287 "Unable to deserialize record %s\n",
288 label);
289 GNUNET_free (entry->label);
290 GNUNET_free (entry);
291 GNUNET_free (record_data);
292 break;
293 }
294 GNUNET_free (record_data);
295
296 {
297 struct GNUNET_CRYPTO_PrivateKey *private_key;
298
299 GNUNET_STRINGS_base64_decode (zone_private_key,
300 strlen (zone_private_key),
301 (void **) &private_key);
302 entry->private_key = *private_key;
303 GNUNET_free (private_key);
304 }
305
307 label,
308 &hkey);
309 if (GNUNET_OK !=
311 &hkey,
312 entry,
314 {
315 GNUNET_free (entry);
316 GNUNET_break (0);
317 }
318 }
321 return GNUNET_OK;
322}
323
324
332static int
334 const struct GNUNET_HashCode *key,
335 void *value)
336{
337 struct GNUNET_DISK_FileHandle *fh = cls;
338 struct FlatFileEntry *entry = value;
339 char *line;
340 char *zone_private_key;
341 char *record_data_b64;
342 ssize_t data_size;
343
344 (void) key;
346 sizeof(struct GNUNET_CRYPTO_PrivateKey),
347 &zone_private_key);
349 entry->record_data);
350 if (data_size < 0)
351 {
352 GNUNET_break (0);
353 GNUNET_free (zone_private_key);
354 return GNUNET_SYSERR;
355 }
356 if (data_size >= UINT16_MAX)
357 {
358 GNUNET_break (0);
359 GNUNET_free (zone_private_key);
360 return GNUNET_SYSERR;
361 }
362 {
363 char data[data_size];
364 ssize_t ret;
365
367 entry->record_data,
368 data_size,
369 data);
370 if ((ret < 0) ||
371 (data_size != ret))
372 {
373 GNUNET_break (0);
374 GNUNET_free (zone_private_key);
375 return GNUNET_SYSERR;
376 }
378 data_size,
379 &record_data_b64);
380 }
382 "%s,%llu,%u,%s,%s\n",
383 zone_private_key,
384 (unsigned long long) entry->rvalue,
385 (unsigned int) entry->record_count,
386 record_data_b64,
387 entry->label);
388 GNUNET_free (record_data_b64);
389 GNUNET_free (zone_private_key);
390
392 line,
393 strlen (line));
394
396 GNUNET_free (entry->label);
397 GNUNET_free (entry->record_data);
398 GNUNET_free (entry);
399 return GNUNET_YES;
400}
401
402
408static void
410{
411 struct GNUNET_DISK_FileHandle *fh;
412
419 if (NULL == fh)
420 {
422 _ ("Unable to initialize file: %s.\n"),
423 plugin->fn);
424 return;
425 }
426
429 fh);
431 /* append 0-terminator */
433 "",
434 1);
436}
437
438
450static int
452 const struct
453 GNUNET_CRYPTO_PrivateKey *zone_key,
454 const char *label,
455 unsigned int rd_count,
456 const struct GNUNET_GNSRECORD_Data *rd)
457{
458 struct Plugin *plugin = cls;
459 uint64_t rvalue;
460 struct GNUNET_HashCode hkey;
461 struct FlatFileEntry *entry;
462
464 UINT64_MAX);
465 hash_pkey_and_label (zone_key,
466 label,
467 &hkey);
469 &hkey);
470 if (0 == rd_count)
471 {
473 "sqlite",
474 "Record deleted\n");
475 return GNUNET_OK;
476 }
477 entry = GNUNET_new (struct FlatFileEntry);
478 GNUNET_asprintf (&entry->label,
479 label,
480 strlen (label));
481 GNUNET_memcpy (&entry->private_key,
482 zone_key,
483 sizeof(struct GNUNET_CRYPTO_PrivateKey));
484 entry->rvalue = rvalue;
485 entry->record_count = rd_count;
487 struct GNUNET_GNSRECORD_Data);
488 for (unsigned int i = 0; i < rd_count; i++)
489 {
491 entry->record_data[i].record_type = rd[i].record_type;
492 entry->record_data[i].flags = rd[i].flags;
493 entry->record_data[i].data_size = rd[i].data_size;
494 entry->record_data[i].data = GNUNET_malloc (rd[i].data_size);
495 GNUNET_memcpy ((char *) entry->record_data[i].data,
496 rd[i].data,
497 rd[i].data_size);
498 }
500 &hkey,
501 entry,
503}
504
505
516static int
518 const struct GNUNET_CRYPTO_PrivateKey *zone,
519 const char *label,
521 void *iter_cls)
522{
523 struct Plugin *plugin = cls;
524 struct FlatFileEntry *entry;
525 struct GNUNET_HashCode hkey;
526
527 if (NULL == zone)
528 {
529 GNUNET_break (0);
530 return GNUNET_SYSERR;
531 }
533 label,
534 &hkey);
536 &hkey);
537
538 if (NULL == entry)
539 return GNUNET_NO;
540 if (NULL != iter)
541 iter (iter_cls,
542 1, /* zero is illegal */
543 &entry->private_key,
544 entry->label,
545 entry->record_count,
546 entry->record_data);
547 return GNUNET_YES;
548}
549
550
555{
559 uint64_t offset;
560
564 uint64_t limit;
565
570 uint64_t pos;
571
576
581
585 void *iter_cls;
586};
587
588
597static int
598iterate_zones (void *cls,
599 const struct GNUNET_HashCode *key,
600 void *value)
601{
602 struct IterateContext *ic = cls;
603 struct FlatFileEntry *entry = value;
604
605 (void) key;
606 if (0 == ic->limit)
607 return GNUNET_NO;
608 if ((NULL != ic->zone) &&
609 (0 != GNUNET_memcmp (&entry->private_key,
610 ic->zone)))
611 return GNUNET_YES;
612 ic->pos++;
613 if (ic->offset > 0)
614 {
615 ic->offset--;
616 return GNUNET_YES;
617 }
618 ic->iter (ic->iter_cls,
619 ic->pos,
620 (NULL == ic->zone)
621 ? &entry->private_key
622 : ic->zone,
623 entry->label,
624 entry->record_count,
625 entry->record_data);
626 ic->limit--;
627 if (0 == ic->limit)
628 return GNUNET_NO;
629 return GNUNET_YES;
630}
631
632
645static int
647 const struct
649 uint64_t serial,
650 uint64_t limit,
652 void *iter_cls)
653{
654 struct Plugin *plugin = cls;
655 struct IterateContext ic;
656
657 ic.offset = serial;
658 ic.pos = 0;
659 ic.limit = limit;
660 ic.iter = iter;
661 ic.iter_cls = iter_cls;
662 ic.zone = zone;
665 &ic);
666 return (0 == ic.limit) ? GNUNET_OK : GNUNET_NO;
667}
668
669
674{
678 void *iter_cls;
679
681};
682
683
684static int
685zone_to_name (void *cls,
686 const struct GNUNET_HashCode *key,
687 void *value)
688{
689 struct ZoneToNameContext *ztn = cls;
690 struct FlatFileEntry *entry = value;
691
692 (void) key;
693 if (0 != GNUNET_memcmp (&entry->private_key,
694 ztn->zone))
695 return GNUNET_YES;
696
697 for (unsigned int i = 0; i < entry->record_count; i++)
698 {
699 if (GNUNET_NO ==
701 continue;
702 if (ztn->value_zone->type != entry->record_data[i].record_type)
703 continue;
704 if (0 == memcmp (ztn->value_zone,
705 entry->record_data[i].data,
706 entry->record_data[i].data_size))
707 {
708 ztn->iter (ztn->iter_cls,
709 i + 1, /* zero is illegal! */
710 &entry->private_key,
711 entry->label,
712 entry->record_count,
713 entry->record_data);
715 }
716 }
717 return GNUNET_YES;
718}
719
720
732static int
734 const struct GNUNET_CRYPTO_PrivateKey *zone,
735 const struct
736 GNUNET_CRYPTO_PublicKey *value_zone,
738 void *iter_cls)
739{
740 struct Plugin *plugin = cls;
741 struct ZoneToNameContext ztn = {
742 .iter = iter,
743 .iter_cls = iter_cls,
744 .zone = zone,
745 .value_zone = value_zone,
746 .result_found = GNUNET_NO
747 };
748
750 "Performing reverse lookup for `%s'\n",
754 &ztn);
755 return ztn.result_found;
756}
757
758
765void *
767{
768 static struct Plugin plugin;
769 const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
771
772 if (NULL != plugin.cfg)
773 return NULL; /* can only initialize once! */
774 memset (&plugin,
775 0,
776 sizeof(struct Plugin));
777 plugin.cfg = cfg;
779 {
781 return NULL;
782 }
784 api->cls = &plugin;
790 _ ("Flat file database running\n"));
791 return api;
792}
793
794
801void *
803{
805 struct Plugin *plugin = api->cls;
806
808 plugin->cfg = NULL;
811 "Flat file plugin is finished\n");
812 return NULL;
813}
814
815
816/* end of plugin_namestore_flat.c */
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:98
static int ret
Final status code.
Definition: gnunet-arm.c:93
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:108
static struct GNUNET_CADET_Handle * mh
Cadet handle.
Definition: gnunet-cadet.c:92
static struct GNUNET_TESTING_PluginFunctions * plugin
Plugin to dynamically load a test case.
static char * line
Desired phone line (string to be converted to a hash).
static uint64_t record_count
Record count.
static char * data
The data to insert into the dht.
struct GNUNET_HashCode key
The key used in the DHT.
static char * pkey
Public key of the zone to look in, in ASCII.
static unsigned int rd_count
Number of records for currently parsed set.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
static char * value
Value of the record to add/remove.
static size_t data_size
Number of bytes in data.
API that can be used to manipulate GNS record data.
Plugin API for the namestore database backend.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
uint64_t GNUNET_CRYPTO_random_u64(enum GNUNET_CRYPTO_Quality mode, uint64_t max)
Generate a random unsigned 64-bit value.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition: disk.c:1215
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition: disk.c:506
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
enum GNUNET_GenericReturnValue GNUNET_DISK_file_size(const char *filename, uint64_t *size, int include_symbolic_links, int single_file_mode)
Get the size of the file (or directory) of the given file (in bytes).
Definition: disk.c:222
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1289
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:606
void * GNUNET_DISK_file_map(const struct GNUNET_DISK_FileHandle *h, struct GNUNET_DISK_MapHandle **m, enum GNUNET_DISK_MapType access, size_t len)
Map a file into memory.
Definition: disk.c:1361
enum GNUNET_GenericReturnValue GNUNET_DISK_file_unmap(struct GNUNET_DISK_MapHandle *h)
Unmap a file.
Definition: disk.c:1392
@ GNUNET_DISK_OPEN_TRUNCATE
Truncate file if it exists.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.
@ GNUNET_DISK_OPEN_READWRITE
Open the file for both reading and writing.
@ GNUNET_DISK_PERM_USER_READ
Owner can read.
@ GNUNET_DISK_PERM_USER_WRITE
Owner can write.
@ GNUNET_DISK_MAP_TYPE_READ
Read-only memory map.
const char * GNUNET_GNSRECORD_z2s(const struct GNUNET_CRYPTO_PublicKey *z)
Convert a zone to a string (for printing debug messages).
int GNUNET_GNSRECORD_records_deserialize(size_t len, const char *src, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *dest)
Deserialize the given records to the given destination.
ssize_t GNUNET_GNSRECORD_records_serialize(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, size_t dest_size, char *dest)
Serialize the given records to the given destination buffer.
ssize_t GNUNET_GNSRECORD_records_get_size(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Calculate how many bytes we will need to serialize the given records.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type(uint32_t type)
Check if this type is one of the supported GNS zone types.
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
int GNUNET_CONTAINER_multihashmap_remove_all(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Remove all entries for the given key from the map.
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_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.
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,...)
#define GNUNET_log_from(kind, comp,...)
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ 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_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
void(* GNUNET_NAMESTORE_RecordIterator)(void *cls, uint64_t serial, const char *editor_hint, const struct GNUNET_CRYPTO_PrivateKey *private_key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Function called for each matching record.
size_t GNUNET_STRINGS_base64_decode(const char *data, size_t len, void **output)
Decode from Base64.
Definition: strings.c:1701
size_t GNUNET_STRINGS_base64_encode(const void *in, size_t len, char **output)
Encode into Base64.
Definition: strings.c:1599
static unsigned int size
Size of the "table".
Definition: peer.c:68
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
#define SIZE_MAX
Definition: platform.h:208
static int namestore_flat_store_records(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone_key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Store a record in the datastore.
static void hash_pkey_and_label(const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, struct GNUNET_HashCode *h)
Hash contactenation of pkey and label into h.
static int store_and_free_entries(void *cls, const struct GNUNET_HashCode *key, void *value)
Store values in hashmap in file and free data.
void * libgnunet_plugin_namestore_flat_init(void *cls)
Entry point for the plugin.
static void database_shutdown(struct Plugin *plugin)
Shutdown database connection and associate data structures.
static int zone_to_name(void *cls, const struct GNUNET_HashCode *key, void *value)
static int iterate_zones(void *cls, const struct GNUNET_HashCode *key, void *value)
Helper function for namestore_flat_iterate_records().
static int database_setup(struct Plugin *plugin)
Initialize the database connections and associated data structures (create tables and indices as need...
static int namestore_flat_iterate_records(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, uint64_t serial, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Iterate over the results for a particular key and zone in the datastore.
static int namestore_flat_lookup_records(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Lookup records in the datastore for which we are the authority.
static int namestore_flat_zone_to_name(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const struct GNUNET_CRYPTO_PublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Look for an existing PKEY delegation record for a given public key.
void * libgnunet_plugin_namestore_flat_done(void *cls)
Exit point from the plugin.
uint64_t rvalue
Rvalue.
uint32_t record_count
Record count.
struct GNUNET_GNSRECORD_Data * record_data
Record data.
struct GNUNET_CRYPTO_PrivateKey private_key
Entry zone.
void * cls
Closure for all of the callbacks.
Internal representation of the hash map.
A private key for an identity as per LSD0001.
An identity key as per LSD0001.
uint32_t type
Type of public key.
Handle used to access files (and pipes).
Handle for a memory-mapping operation.
Definition: disk.c:1342
uint32_t record_type
Type of the GNS/DNS record.
const void * data
Binary value stored in the DNS record.
size_t data_size
Number of bytes in data.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.
uint64_t expiration_time
Expiration time for the DNS record.
A 512-bit hashcode.
struct returned by the initialization function of the plugin
enum GNUNET_GenericReturnValue(* zone_to_name)(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const struct GNUNET_CRYPTO_PublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Look for an existing PKEY delegation record for a given public key.
enum GNUNET_GenericReturnValue(* iterate_records)(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, uint64_t serial, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Iterate over the results for a particular zone in the datastore.
enum GNUNET_GenericReturnValue(* lookup_records)(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Lookup records in the datastore for which we are the authority.
void * cls
Closure to pass to all plugin functions.
enum GNUNET_GenericReturnValue(* store_records)(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Store a record in the datastore for which we are the authority.
Closure for iterate_zones.
void * iter_cls
Closure for iter.
uint64_t pos
What is the position of the current entry, counting starts from 1.
uint64_t offset
How many more records should we skip before returning results?
GNUNET_NAMESTORE_RecordIterator iter
Function to call on each record.
const struct GNUNET_CRYPTO_PrivateKey * zone
Target zone.
uint64_t limit
How many more records should we return?
Handle for a plugin.
Definition: block.c:38
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:47
struct GNUNET_CONTAINER_MultiHashMap * hm
HashMap.
char * fn
Filename used for the DB.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Closure for zone_to_name.
const struct GNUNET_CRYPTO_PublicKey * value_zone
const struct GNUNET_CRYPTO_PrivateKey * zone
GNUNET_NAMESTORE_RecordIterator iter