GNUnet  0.20.0
gns_api.c File Reference

library to access the GNS service More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_constants.h"
#include "gnunet_arm_service.h"
#include "gnunet_hello_lib.h"
#include "gnunet_protocols.h"
#include "gnunet_dht_service.h"
#include "gns.h"
#include "gns_api.h"
Include dependency graph for gns_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_GNS_LookupRequest
 Handle to a lookup request. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "gns-api", __VA_ARGS__)
 
#define DEFAULT_LIMIT   128
 Default recursion depth limit to apply if the application does not specify any. More...
 

Functions

static void reconnect (struct GNUNET_GNS_Handle *handle)
 Reconnect to GNS service. More...
 
static void reconnect_task (void *cls)
 Reconnect to GNS. More...
 
static void force_reconnect (struct GNUNET_GNS_Handle *handle)
 Disconnect from service and then reconnect. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue. More...
 
static int check_result (void *cls, const struct LookupResultMessage *lookup_msg)
 Check validity of message received from the GNS service. More...
 
static void handle_result (void *cls, const struct LookupResultMessage *lookup_msg)
 Handler for messages received from the GNS service. More...
 
struct GNUNET_GNS_HandleGNUNET_GNS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Initialize the connection with the GNS service. More...
 
void GNUNET_GNS_disconnect (struct GNUNET_GNS_Handle *handle)
 Shutdown connection with the GNS service. More...
 
void * GNUNET_GNS_lookup_cancel (struct GNUNET_GNS_LookupRequest *lr)
 Cancel pending lookup request. More...
 
struct GNUNET_GNS_LookupRequestGNUNET_GNS_lookup_limited (struct GNUNET_GNS_Handle *handle, const char *name, const struct GNUNET_IDENTITY_PublicKey *zone, uint32_t type, enum GNUNET_GNS_LocalOptions options, uint16_t recursion_depth_limit, GNUNET_GNS_LookupResultProcessor proc, void *proc_cls)
 Perform an asynchronous lookup operation on the GNS. More...
 
struct GNUNET_GNS_LookupRequestGNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle, const char *name, const struct GNUNET_IDENTITY_PublicKey *zone, uint32_t type, enum GNUNET_GNS_LocalOptions options, GNUNET_GNS_LookupResultProcessor proc, void *proc_cls)
 Perform an asynchronous lookup operation on the GNS. More...
 

Detailed Description

library to access the GNS service

Author
Martin Schanzenbach
Christian Grothoff

Definition in file gns_api.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "gns-api", __VA_ARGS__)

Definition at line 37 of file gns_api.c.

◆ DEFAULT_LIMIT

#define DEFAULT_LIMIT   128

Default recursion depth limit to apply if the application does not specify any.

Definition at line 43 of file gns_api.c.

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_GNS_Handle handle)
static

Reconnect to GNS service.

Parameters
handlethe handle to the GNS service

Definition at line 233 of file gns_api.c.

234 {
238  struct LookupResultMessage,
239  handle),
241  };
242 
243  GNUNET_assert (NULL == handle->mq);
245  "Trying to connect to GNS\n");
247  "gns",
248  handlers,
250  handle);
251  if (NULL == handle->mq)
252  return;
253  for (struct GNUNET_GNS_LookupRequest *lh = handle->lookup_head;
254  NULL != lh;
255  lh = lh->next)
257  lh->env);
258 }
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
Definition: gns_api.c:139
#define LOG(kind,...)
Definition: gns_api.c:37
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static int result
Global testing status.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:1057
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_DEBUG
void GNUNET_MQ_send_copy(struct GNUNET_MQ_Handle *mq, const struct GNUNET_MQ_Envelope *ev)
Send a copy of a message with the given message queue.
Definition: mq.c:370
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT
Service response to name resolution request from client.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: dns_api.c:66
struct GNUNET_MQ_Handle * mq
Connection to DNS service, or NULL.
Definition: dns_api.c:61
Handle to a lookup request.
Definition: gns_api.c:49
Message handler for a specific message type.
Message from GNS service to client: new results.
Definition: gns.h:80

References GNUNET_DNS_Handle::cfg, GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT, GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_MQ_send_copy(), handle, handlers, LOG, GNUNET_DNS_Handle::mq, mq_error_handler(), and result.

Referenced by GNUNET_GNS_connect(), and reconnect_task().

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

◆ reconnect_task()

static void reconnect_task ( void *  cls)
static

Reconnect to GNS.

Parameters
clsthe handle

Definition at line 102 of file gns_api.c.

103 {
104  struct GNUNET_GNS_Handle *handle = cls;
105 
106  handle->reconnect_task = NULL;
107  reconnect (handle);
108 }
static void reconnect(struct GNUNET_GNS_Handle *handle)
Reconnect to GNS service.
Definition: gns_api.c:233
struct GNUNET_SCHEDULER_Task * reconnect_task
Task to reconnect to the service.
Definition: dns_api.c:81
Connection to the GNS service.
Definition: gns_api.h:36

References handle, reconnect(), and GNUNET_DNS_Handle::reconnect_task.

Referenced by force_reconnect().

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

◆ force_reconnect()

static void force_reconnect ( struct GNUNET_GNS_Handle handle)
static

Disconnect from service and then reconnect.

Parameters
handleour handle

Definition at line 117 of file gns_api.c.

118 {
120  handle->mq = NULL;
121  handle->reconnect_backoff
122  = GNUNET_TIME_STD_BACKOFF (handle->reconnect_backoff);
124  = GNUNET_SCHEDULER_add_delayed (handle->reconnect_backoff,
126  handle);
127 }
static void reconnect_task(void *cls)
Reconnect to GNS.
Definition: gns_api.c:102
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:683
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:1272
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...

References GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, handle, GNUNET_DNS_Handle::mq, GNUNET_DNS_Handle::reconnect_task, and reconnect_task().

Referenced by mq_error_handler().

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

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue.

Not every message queue implementation supports an error handler.

Parameters
clsclosure with the struct GNUNET_GNS_Handle *
errorerror code

Definition at line 139 of file gns_api.c.

141 {
142  struct GNUNET_GNS_Handle *handle = cls;
143 
145  "Problem with message queue. error: %i\n",
146  error);
148 }
static void force_reconnect(struct GNUNET_GNS_Handle *handle)
Disconnect from service and then reconnect.
Definition: gns_api.c:117
@ GNUNET_ERROR_TYPE_WARNING

References force_reconnect(), GNUNET_ERROR_TYPE_WARNING, handle, and LOG.

Referenced by reconnect().

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

◆ check_result()

static int check_result ( void *  cls,
const struct LookupResultMessage lookup_msg 
)
static

Check validity of message received from the GNS service.

Parameters
clsthe struct GNUNET_GNS_Handle *
loookup_msgthe incoming message

Definition at line 158 of file gns_api.c.

160 {
161  size_t mlen = ntohs (lookup_msg->header.size) - sizeof(*lookup_msg);
162  uint32_t rd_count = ntohl (lookup_msg->rd_count);
164 
165  (void) cls;
166  if (GNUNET_SYSERR ==
168  (const char *) &lookup_msg[1],
169  rd_count,
170  rd))
171  {
172  GNUNET_break (0);
173  return GNUNET_SYSERR;
174  }
175  return GNUNET_OK;
176 }
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.
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.
@ GNUNET_OK
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
struct GNUNET_MessageHeader header
Header of type GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT.
Definition: gns.h:84
uint32_t rd_count
The number of records contained in response.
Definition: gns.h:96

References GNUNET_break, GNUNET_GNSRECORD_records_deserialize(), GNUNET_OK, GNUNET_SYSERR, LookupResultMessage::header, rd, LookupResultMessage::rd_count, rd_count, and GNUNET_MessageHeader::size.

Here is the call graph for this function:

◆ handle_result()

static void handle_result ( void *  cls,
const struct LookupResultMessage lookup_msg 
)
static

Handler for messages received from the GNS service.

Parameters
clsthe struct GNUNET_GNS_Handle *
loookup_msgthe incoming message

Definition at line 186 of file gns_api.c.

188 {
189  struct GNUNET_GNS_Handle *handle = cls;
190  size_t mlen = ntohs (lookup_msg->header.size) - sizeof(*lookup_msg);
191  uint32_t rd_count = ntohl (lookup_msg->rd_count);
193  uint32_t r_id = ntohl (lookup_msg->id);
196  void *proc_cls;
197 
199  "Received lookup reply from GNS service (%u records)\n",
200  (unsigned int) rd_count);
201  for (lr = handle->lookup_head; NULL != lr; lr = lr->next)
202  if (lr->r_id == r_id)
203  break;
204  if (NULL == lr)
205  return;
206  proc = lr->lookup_proc;
207  proc_cls = lr->proc_cls;
208 
211  (const
212  char *) &lookup_msg[1],
213  rd_count,
214  rd));
215  proc (proc_cls,
216  rd_count,
217  rd);
218  GNUNET_CONTAINER_DLL_remove (handle->lookup_head,
219  handle->lookup_tail,
220  lr);
221  if (NULL != lr->env)
222  GNUNET_MQ_discard (lr->env);
223  GNUNET_free (lr);
224 }
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition: gnunet-gns.c:98
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
void(* GNUNET_GNS_LookupResultProcessor)(void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Iterator called on obtained result for a GNS lookup.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MQ_discard(struct GNUNET_MQ_Envelope *mqm)
Discard the message queue message, free all allocated resources.
Definition: mq.c:285
void * proc_cls
lookup_proc closure
Definition: gns_api.c:73
uint32_t r_id
request id
Definition: gns_api.c:83
GNUNET_GNS_LookupResultProcessor2 lookup_proc
processor to call on lookup result
Definition: gns_tld_api.c:54
uint32_t id
Unique identifier for this request (for key collisions).
Definition: gns.h:89

References GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_records_deserialize(), GNUNET_MQ_discard(), GNUNET_OK, handle, LookupResultMessage::header, LookupResultMessage::id, LOG, GNUNET_GNS_LookupWithTldRequest::lookup_proc, lr, GNUNET_GNS_LookupRequest::proc_cls, GNUNET_GNS_LookupRequest::r_id, rd, LookupResultMessage::rd_count, rd_count, and GNUNET_MessageHeader::size.

Here is the call graph for this function: