GNUnet 0.22.2
plugin_namestore_flat.c File Reference

file-based namestore backend More...

Include dependency graph for plugin_namestore_flat.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  FlatFileEntry
 
struct  IterateContext
 Closure for iterate_zones. More...
 
struct  ZoneToNameContext
 Closure for zone_to_name. More...
 

Functions

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. More...
 
static int database_setup (struct Plugin *plugin)
 Initialize the database connections and associated data structures (create tables and indices as needed as well). More...
 
static int store_and_free_entries (void *cls, const struct GNUNET_HashCode *key, void *value)
 Store values in hashmap in file and free data. More...
 
static void database_shutdown (struct Plugin *plugin)
 Shutdown database connection and associate data structures. More...
 
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. More...
 
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. More...
 
static int iterate_zones (void *cls, const struct GNUNET_HashCode *key, void *value)
 Helper function for namestore_flat_iterate_records(). More...
 
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. More...
 
static int zone_to_name (void *cls, const struct GNUNET_HashCode *key, void *value)
 
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. More...
 
void * libgnunet_plugin_namestore_flat_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_namestore_flat_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

file-based namestore backend

Author
Martin Schanzenbach
Christian Grothoff

Definition in file plugin_namestore_flat.c.

Function Documentation

◆ hash_pkey_and_label()

static void hash_pkey_and_label ( const struct GNUNET_CRYPTO_PrivateKey pkey,
const char *  label,
struct GNUNET_HashCode h 
)
static

Hash contactenation of pkey and label into h.

Parameters
pkeya key
labela label
[out]hinitialized hash

Definition at line 87 of file plugin_namestore_flat.c.

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}
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:98
struct GNUNET_HashCode key
The key used in the DHT.
static char * pkey
Public key of the zone to look in, in ASCII.
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
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
A private key for an identity as per LSD0001.

References GNUNET_CRYPTO_hash(), GNUNET_free, GNUNET_malloc, GNUNET_memcpy, h, key, and pkey.

Referenced by database_setup(), namestore_flat_lookup_records(), and namestore_flat_store_records().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ database_setup()

static int database_setup ( struct Plugin plugin)
static

Initialize the database connections and associated data structures (create tables and indices as needed as well).

Parameters
pluginthe plugin context (state for this module)
Returns
GNUNET_OK on success

Definition at line 120 of file plugin_namestore_flat.c.

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}
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.
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.
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:1234
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:520
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:1308
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:620
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:1380
enum GNUNET_GenericReturnValue GNUNET_DISK_file_unmap(struct GNUNET_DISK_MapHandle *h)
Unmap a file.
Definition: disk.c:1411
@ 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.
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.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
@ 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,...)
@ 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
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
size_t GNUNET_STRINGS_base64_decode(const char *data, size_t len, void **output)
Decode from Base64.
Definition: strings.c:1701
static unsigned int size
Size of the "table".
Definition: peer.c:68
#define _(String)
GNU gettext support macro.
Definition: platform.h:179
#define SIZE_MAX
Definition: platform.h:209
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.
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.
Handle used to access files (and pipes).
Handle for a memory-mapping operation.
Definition: disk.c:1361
A 512-bit hashcode.

References _, GNUNET_break, GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_file_close(), GNUNET_DISK_file_map(), GNUNET_DISK_file_open(), GNUNET_DISK_file_size(), GNUNET_DISK_file_test(), GNUNET_DISK_file_unmap(), GNUNET_DISK_MAP_TYPE_READ, GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_OPEN_READWRITE, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_GNSRECORD_records_deserialize(), GNUNET_log, GNUNET_log_config_missing(), GNUNET_log_strerror, GNUNET_new, GNUNET_new_array, GNUNET_NO, GNUNET_OK, GNUNET_strdup, GNUNET_STRINGS_base64_decode(), GNUNET_SYSERR, GNUNET_YES, hash_pkey_and_label(), FlatFileEntry::label, line, mh, plugin, FlatFileEntry::private_key, record_count, FlatFileEntry::record_count, FlatFileEntry::record_data, FlatFileEntry::rvalue, size, and SIZE_MAX.

Referenced by libgnunet_plugin_namestore_flat_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ store_and_free_entries()

static int store_and_free_entries ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Store values in hashmap in file and free data.

Parameters
pluginthe plugin context
keykey in the map
valuea struct FlatFileEntry

Definition at line 333 of file plugin_namestore_flat.c.

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}
static int ret
Final status code.
Definition: gnunet-arm.c:93
static char * data
The data to insert into the dht.
static char * value
Value of the record to add/remove.
static size_t data_size
Number of bytes in data.
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:697
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.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
size_t GNUNET_STRINGS_base64_encode(const void *in, size_t len, char **output)
Encode into Base64.
Definition: strings.c:1599

References data, data_size, GNUNET_asprintf(), GNUNET_break, GNUNET_DISK_file_write(), GNUNET_free, GNUNET_GNSRECORD_records_get_size(), GNUNET_GNSRECORD_records_serialize(), GNUNET_STRINGS_base64_encode(), GNUNET_SYSERR, GNUNET_YES, key, FlatFileEntry::label, line, FlatFileEntry::private_key, FlatFileEntry::record_count, FlatFileEntry::record_data, ret, FlatFileEntry::rvalue, and value.

Referenced by database_shutdown().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ database_shutdown()

static void database_shutdown ( struct Plugin plugin)
static

Shutdown database connection and associate data structures.

Parameters
pluginthe plugin context (state for this module)

Definition at line 409 of file plugin_namestore_flat.c.

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}
@ GNUNET_DISK_OPEN_TRUNCATE
Truncate file if it exists.
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_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
static int store_and_free_entries(void *cls, const struct GNUNET_HashCode *key, void *value)
Store values in hashmap in file and free data.

References _, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_write(), GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_OPEN_READWRITE, GNUNET_DISK_OPEN_TRUNCATE, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, plugin, and store_and_free_entries().

Referenced by libgnunet_plugin_namestore_flat_done(), and libgnunet_plugin_namestore_flat_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_flat_store_records()

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 
)
static

Store a record in the datastore.

Removes any existing record in the same zone with the same name.

Parameters
clsclosure (internal context for the plugin)
zone_keyprivate key of the zone
labelname that is being mapped (at most 255 characters long)
rd_countnumber of entries in rd array
rdarray of records with data to store
Returns
GNUNET_OK on success, else GNUNET_SYSERR

Definition at line 451 of file plugin_namestore_flat.c.

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}
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.
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).
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.
#define GNUNET_log_from(kind, comp,...)
@ GNUNET_ERROR_TYPE_DEBUG
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.
Handle for a plugin.
Definition: block.c:38

References GNUNET_GNSRECORD_Data::data, data_size, GNUNET_GNSRECORD_Data::data_size, GNUNET_GNSRECORD_Data::expiration_time, GNUNET_GNSRECORD_Data::flags, GNUNET_asprintf(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_multihashmap_remove_all(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_CRYPTO_random_u64(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log_from, GNUNET_malloc, GNUNET_memcpy, GNUNET_new, GNUNET_new_array, GNUNET_OK, hash_pkey_and_label(), FlatFileEntry::label, plugin, FlatFileEntry::private_key, rd, rd_count, FlatFileEntry::record_count, FlatFileEntry::record_data, GNUNET_GNSRECORD_Data::record_type, and FlatFileEntry::rvalue.

Referenced by libgnunet_plugin_namestore_flat_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_flat_lookup_records()

static int namestore_flat_lookup_records ( void *  cls,
const struct GNUNET_CRYPTO_PrivateKey zone,
const char *  label,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls 
)
static

Lookup records in the datastore for which we are the authority.

Parameters
clsclosure (internal context for the plugin)
zoneprivate key of the zone
labelname of the record in the zone
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO for no results, else GNUNET_SYSERR

Definition at line 517 of file plugin_namestore_flat.c.

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}
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.

References GNUNET_break, GNUNET_CONTAINER_multihashmap_get(), GNUNET_NO, GNUNET_SYSERR, GNUNET_YES, hash_pkey_and_label(), FlatFileEntry::label, plugin, FlatFileEntry::private_key, FlatFileEntry::record_count, and FlatFileEntry::record_data.

Referenced by libgnunet_plugin_namestore_flat_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iterate_zones()

static int iterate_zones ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Helper function for namestore_flat_iterate_records().

Parameters
clsa struct IterateContext
keyunused
valuea struct FlatFileEntry
Returns
GNUNET_YES to continue the iteration

Definition at line 598 of file plugin_namestore_flat.c.

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}
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
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?

References GNUNET_memcmp, GNUNET_NO, GNUNET_YES, IterateContext::iter, IterateContext::iter_cls, key, FlatFileEntry::label, IterateContext::limit, IterateContext::offset, IterateContext::pos, FlatFileEntry::private_key, FlatFileEntry::record_count, FlatFileEntry::record_data, value, and IterateContext::zone.

Referenced by namestore_flat_iterate_records().

Here is the caller graph for this function:

◆ namestore_flat_iterate_records()

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 
)
static

Iterate over the results for a particular key and zone in the datastore.

Will return at most one result to the iterator.

Parameters
clsclosure (internal context for the plugin)
zonehash of public key of the zone, NULL to iterate over all zones
serialserial number to exclude in the list of all matching records
limitmaximum number of results to return to iter
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO if there were no more results, GNUNET_SYSERR on error

Definition at line 646 of file plugin_namestore_flat.c.

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}
static int iterate_zones(void *cls, const struct GNUNET_HashCode *key, void *value)
Helper function for namestore_flat_iterate_records().

References GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_NO, GNUNET_OK, IterateContext::iter, IterateContext::iter_cls, iterate_zones(), IterateContext::limit, IterateContext::offset, plugin, IterateContext::pos, and IterateContext::zone.

Referenced by libgnunet_plugin_namestore_flat_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ zone_to_name()

static int zone_to_name ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Definition at line 685 of file plugin_namestore_flat.c.

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}
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type(uint32_t type)
Check if this type is one of the supported GNS zone types.
uint32_t type
Type of public key.
Closure for zone_to_name.
const struct GNUNET_CRYPTO_PublicKey * value_zone
const struct GNUNET_CRYPTO_PrivateKey * zone
GNUNET_NAMESTORE_RecordIterator iter

References GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, GNUNET_GNSRECORD_is_zonekey_type(), GNUNET_memcmp, GNUNET_NO, GNUNET_YES, ZoneToNameContext::iter, ZoneToNameContext::iter_cls, key, FlatFileEntry::label, FlatFileEntry::private_key, FlatFileEntry::record_count, FlatFileEntry::record_data, GNUNET_GNSRECORD_Data::record_type, ZoneToNameContext::result_found, GNUNET_CRYPTO_PublicKey::type, value, ZoneToNameContext::value_zone, and ZoneToNameContext::zone.

Referenced by namestore_flat_zone_to_name().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_flat_zone_to_name()

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 
)
static

Look for an existing PKEY delegation record for a given public key.

Returns at most one result to the iterator.

Parameters
clsclosure (internal context for the plugin)
zoneprivate key of the zone to look up in, never NULL
value_zonepublic key of the target zone (value), never NULL
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO if there were no results, GNUNET_SYSERR on error

Definition at line 733 of file plugin_namestore_flat.c.

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}
const char * GNUNET_GNSRECORD_z2s(const struct GNUNET_CRYPTO_PublicKey *z)
Convert a zone to a string (for printing debug messages).
static int zone_to_name(void *cls, const struct GNUNET_HashCode *key, void *value)

References GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_z2s(), GNUNET_log, GNUNET_NO, ZoneToNameContext::iter, ZoneToNameContext::iter_cls, plugin, ZoneToNameContext::result_found, ZoneToNameContext::value_zone, ZoneToNameContext::zone, and zone_to_name().

Referenced by libgnunet_plugin_namestore_flat_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_namestore_flat_init()

void * libgnunet_plugin_namestore_flat_init ( void *  cls)

Entry point for the plugin.

Parameters
clsthe "struct GNUNET_NAMESTORE_PluginEnvironment*"
Returns
NULL on error, otherwise the plugin context

Definition at line 766 of file plugin_namestore_flat.c.

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}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:108
@ GNUNET_ERROR_TYPE_INFO
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 database_shutdown(struct Plugin *plugin)
Shutdown database connection and associate data structures.
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.
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.

References _, cfg, GNUNET_NAMESTORE_PluginFunctions::cls, database_setup(), database_shutdown(), GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_new, GNUNET_OK, GNUNET_NAMESTORE_PluginFunctions::iterate_records, GNUNET_NAMESTORE_PluginFunctions::lookup_records, namestore_flat_iterate_records(), namestore_flat_lookup_records(), namestore_flat_store_records(), namestore_flat_zone_to_name(), plugin, GNUNET_NAMESTORE_PluginFunctions::store_records, and GNUNET_NAMESTORE_PluginFunctions::zone_to_name.

Here is the call graph for this function:

◆ libgnunet_plugin_namestore_flat_done()

void * libgnunet_plugin_namestore_flat_done ( void *  cls)

Exit point from the plugin.

Parameters
clsthe plugin context (as returned by "init")
Returns
always NULL

Definition at line 802 of file plugin_namestore_flat.c.

803{
805 struct Plugin *plugin = api->cls;
806
808 plugin->cfg = NULL;
811 "Flat file plugin is finished\n");
812 return NULL;
813}
void * cls
Closure for all of the callbacks.
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:47

References Plugin::api, GNUNET_BLOCK_PluginFunctions::cls, GNUNET_NAMESTORE_PluginFunctions::cls, database_shutdown(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, and plugin.

Here is the call graph for this function: