2 This file is part of GNUnet
3 Copyright (C) 2012, 2013, 2018 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU 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.
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.
17 * @author Christian Grothoff
20 * API that can be used to store naming information on a GNUnet node;
22 * @defgroup namestore Name Store service
23 * Store naming information on a GNUnet node.
25 * Naming information can either be records for which this peer/user is
26 * authoritative, or blocks which are cached, encrypted naming data from other
29 * @see [Documentation](https://gnunet.org/namestore-subsystem)
33 #ifndef GNUNET_NAMESTORE_SERVICE_H
34 #define GNUNET_NAMESTORE_SERVICE_H
36 #include "gnunet_util_lib.h"
37 #include "gnunet_block_lib.h"
38 #include "gnunet_gnsrecord_lib.h"
43 #if 0 /* keep Emacsens' auto-indent happy */
52 struct GNUNET_NAMESTORE_QueueEntry;
55 * Handle to the namestore service.
57 struct GNUNET_NAMESTORE_Handle;
60 * Handle to the namestore zone iterator.
62 struct GNUNET_NAMESTORE_ZoneIterator;
66 * Connect to the namestore service.
68 * @param cfg configuration to use
69 * @return handle to use to access the service
71 struct GNUNET_NAMESTORE_Handle *
72 GNUNET_NAMESTORE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
76 * Disconnect from the namestore service (and free associated
77 * resources). Must not be called from within operation callbacks of
80 * @param h handle to the namestore
83 GNUNET_NAMESTORE_disconnect (struct GNUNET_NAMESTORE_Handle *h);
87 * Continuation called to notify client about result of the
91 * @param success #GNUNET_SYSERR on failure (including timeout/queue drop/failure to validate)
92 * #GNUNET_NO if content was already there or not found
93 * #GNUNET_YES (or other positive value) on success
94 * @param emsg NULL on success, otherwise an error message
97 (*GNUNET_NAMESTORE_ContinuationWithStatus) (void *cls,
103 * Store an item in the namestore. If the item is already present,
104 * it is replaced with the new record. Use an empty array to
105 * remove all records under the given name.
107 * The continuation is called after the value has been stored in the
108 * database. Monitors may be notified asynchronously (basically with
109 * a buffer). However, if any monitor is consistently too slow to
110 * keep up with the changes, calling @a cont will be delayed until the
111 * monitors do keep up.
113 * @param h handle to the namestore
114 * @param pkey private key of the zone
115 * @param label name that is being mapped
116 * @param rd_count number of records in the 'rd' array
117 * @param rd array of records with data to store
118 * @param cont continuation to call when done
119 * @param cont_cls closure for @a cont
120 * @return handle to abort the request
122 struct GNUNET_NAMESTORE_QueueEntry *
123 GNUNET_NAMESTORE_records_store (struct GNUNET_NAMESTORE_Handle *h,
124 const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
126 unsigned int rd_count,
127 const struct GNUNET_GNSRECORD_Data *rd,
128 GNUNET_NAMESTORE_ContinuationWithStatus cont,
133 * Process a record that was stored in the namestore.
136 * @param zone private key of the zone
137 * @param label label of the records
138 * @param rd_count number of entries in @a rd array, 0 if label was deleted
139 * @param rd array of records with data to store
142 (*GNUNET_NAMESTORE_RecordMonitor) (void *cls,
143 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
145 unsigned int rd_count,
146 const struct GNUNET_GNSRECORD_Data *rd);
150 * Set the desired nick name for a zone
152 * @param h handle to the namestore
153 * @param pkey private key of the zone
154 * @param nick the nick name to set
155 * @param cont continuation to call when done
156 * @param cont_cls closure for @a cont
157 * @return handle to abort the request
159 struct GNUNET_NAMESTORE_QueueEntry *
160 GNUNET_NAMESTORE_set_nick (struct GNUNET_NAMESTORE_Handle *h,
161 const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
163 GNUNET_NAMESTORE_ContinuationWithStatus cont,
168 * Lookup an item in the namestore.
170 * @param h handle to the namestore
171 * @param pkey private key of the zone
172 * @param label name that is being mapped
173 * @param error_cb function to call on error (i.e. disconnect)
174 * the handle is afterwards invalid
175 * @param error_cb_cls closure for @a error_cb
176 * @param rm function to call with the result (with 0 records if we don't have that label);
177 * the handle is afterwards invalid
178 * @param rm_cls closure for @a rm
179 * @return handle to abort the request
181 struct GNUNET_NAMESTORE_QueueEntry *
182 GNUNET_NAMESTORE_records_lookup (struct GNUNET_NAMESTORE_Handle *h,
183 const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
185 GNUNET_SCHEDULER_TaskCallback error_cb,
187 GNUNET_NAMESTORE_RecordMonitor rm,
192 * Look for an existing PKEY delegation record for a given public key.
193 * Returns at most one result to the processor.
195 * @param h handle to the namestore
196 * @param zone private key of the zone to look up in, never NULL
197 * @param value_zone public key of the target zone (value), never NULL
198 * @param error_cb function to call on error (i.e. disconnect)
199 * the handle is afterwards invalid
200 * @param error_cb_cls closure for @a error_cb
201 * @param proc function to call on the matching records, or with
202 * NULL (rd_count == 0) if there are no matching records;
203 * the handle is afterwards invalid
204 * @param proc_cls closure for @a proc
205 * @return a handle that can be used to
208 struct GNUNET_NAMESTORE_QueueEntry *
209 GNUNET_NAMESTORE_zone_to_name (struct GNUNET_NAMESTORE_Handle *h,
210 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
211 const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone,
212 GNUNET_SCHEDULER_TaskCallback error_cb,
214 GNUNET_NAMESTORE_RecordMonitor proc,
219 * Cancel a namestore operation. The final callback from the
220 * operation must not have been done yet. Must be called on any
221 * namestore operation that has not yet completed prior to calling
222 * #GNUNET_NAMESTORE_disconnect.
224 * @param qe operation to cancel
227 GNUNET_NAMESTORE_cancel (struct GNUNET_NAMESTORE_QueueEntry *qe);
231 * Starts a new zone iteration (used to periodically PUT all of our
232 * records into our DHT). This MUST lock the `struct GNUNET_NAMESTORE_Handle`
233 * for any other calls than #GNUNET_NAMESTORE_zone_iterator_next() and
234 * #GNUNET_NAMESTORE_zone_iteration_stop. @a proc will be called once
235 * immediately, and then again after
236 * #GNUNET_NAMESTORE_zone_iterator_next() is invoked.
238 * On error (disconnect), @a error_cb will be invoked.
239 * On normal completion, @a finish_cb proc will be
242 * @param h handle to the namestore
243 * @param zone zone to access, NULL for all zones
244 * @param error_cb function to call on error (i.e. disconnect),
245 * the handle is afterwards invalid
246 * @param error_cb_cls closure for @a error_cb
247 * @param proc function to call on each name from the zone; it
248 * will be called repeatedly with a value (if available)
249 * @param proc_cls closure for @a proc
250 * @param finish_cb function to call on completion
251 * the handle is afterwards invalid
252 * @param finish_cb_cls closure for @a finish_cb
253 * @return an iterator handle to use for iteration
255 struct GNUNET_NAMESTORE_ZoneIterator *
256 GNUNET_NAMESTORE_zone_iteration_start (struct GNUNET_NAMESTORE_Handle *h,
257 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
258 GNUNET_SCHEDULER_TaskCallback error_cb,
260 GNUNET_NAMESTORE_RecordMonitor proc,
262 GNUNET_SCHEDULER_TaskCallback finish_cb,
263 void *finish_cb_cls);
267 * Calls the record processor specified in #GNUNET_NAMESTORE_zone_iteration_start
268 * for the next record.
270 * @param it the iterator
271 * @param limit number of records to return to the iterator in one shot
272 * (before #GNUNET_NAMESTORE_zone_iterator_next is to be called again)
275 GNUNET_NAMESTORE_zone_iterator_next (struct GNUNET_NAMESTORE_ZoneIterator *it,
280 * Stops iteration and releases the namestore handle for further calls. Must
281 * be called on any iteration that has not yet completed prior to calling
282 * #GNUNET_NAMESTORE_disconnect.
284 * @param it the iterator
287 GNUNET_NAMESTORE_zone_iteration_stop (struct GNUNET_NAMESTORE_ZoneIterator *it);
291 * Handle for a monitoring activity.
293 struct GNUNET_NAMESTORE_ZoneMonitor;
297 * Begin monitoring a zone for changes. Will first call the @a
298 * monitor function on all existing records in the selected zone(s) if
299 * @a iterate_first is #GNUNET_YES. In any case, we will then call @a
300 * sync_cb, and then afterwards call the @a monitor whenever a record
301 * changes. If the namestore disconnects, the @a error_cb function is
302 * called with a disconnect event. Once the connection is
303 * re-established, the process begins from the start (depending on @a
304 * iterate_first, we will again first do all existing records, then @a
305 * sync, then updates).
307 * @param cfg configuration to use to connect to namestore
308 * @param zone zone to monitor, NULL for all zones
309 * @param iterate_first #GNUNET_YES to first iterate over all existing records,
310 * #GNUNET_NO to only return changes that happen from now on
311 * @param error_cb function to call on error (i.e. disconnect); note that
312 * unlike the other error callbacks in this API, a call to this
313 * function does NOT destroy the monitor handle, it merely signals
314 * that monitoring is down. You need to still explicitly call
315 * #GNUNET_NAMESTORE_zone_monitor_stop().
316 * @param error_cb_cls closure for @a error_cb
317 * @param monitor function to call on zone changes, with an initial limit of 1
318 * @param monitor_cls closure for @a monitor
319 * @param sync_cb function called when we're in sync with the namestore
320 * @param sync_cb_cls closure for @a sync_cb
321 * @return handle to stop monitoring
323 struct GNUNET_NAMESTORE_ZoneMonitor *
324 GNUNET_NAMESTORE_zone_monitor_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
325 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
327 GNUNET_SCHEDULER_TaskCallback error_cb,
329 GNUNET_NAMESTORE_RecordMonitor monitor,
331 GNUNET_SCHEDULER_TaskCallback sync_cb,
336 * Calls the monitor processor specified in #GNUNET_NAMESTORE_zone_monitor_start
337 * for the next record(s). This function is used to allow clients that merely
338 * monitor the NAMESTORE to still throttle namestore operations, so we can be
339 * sure that the monitors can keep up.
341 * Note that #GNUNET_NAMESTORE_records_store() only waits for this
342 * call if the previous limit set by the client was already reached.
343 * Thus, by using a @a limit greater than 1, monitors basically enable
344 * a queue of notifications to be processed asynchronously with some
345 * delay. Note that even with a limit of 1 the
346 * #GNUNET_NAMESTORE_records_store() function will run asynchronously
347 * and the continuation may be invoked before the monitors completed
348 * (or even started) processing the notification. Thus, monitors will
349 * only closely track the current state of the namestore, but not
350 * be involved in the transactions.
352 * @param zm the monitor
353 * @param limit number of records to return to the iterator in one shot
354 * (before #GNUNET_NAMESTORE_zone_monitor_next is to be called again)
357 GNUNET_NAMESTORE_zone_monitor_next (struct GNUNET_NAMESTORE_ZoneMonitor *zm,
362 * Stop monitoring a zone for changes.
364 * @param zm handle to the monitor activity to stop
367 GNUNET_NAMESTORE_zone_monitor_stop (struct GNUNET_NAMESTORE_ZoneMonitor *zm);
370 #if 0 /* keep Emacsens' auto-indent happy */
379 /** @} */ /* end of group */