GNUnet  0.10.x
Data Structures | Macros | Functions
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__)
 

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 (struct GNUNET_GNS_Handle *handle, const char *name, const struct GNUNET_CRYPTO_EcdsaPublicKey *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.

Referenced by GNUNET_GNS_lookup(), handle_result(), mq_error_handler(), and reconnect().

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 225 of file gns_api.c.

References GNUNET_GNS_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(), LOG, GNUNET_GNS_Handle::lookup_head, GNUNET_GNS_Handle::mq, mq_error_handler(), GNUNET_GNS_LookupRequest::next, and result.

Referenced by GNUNET_GNS_connect(), and reconnect_task().

226 {
230  struct LookupResultMessage,
231  handle),
233  };
234 
235  GNUNET_assert(NULL == handle->mq);
237  "Trying to connect to GNS\n");
238  handle->mq = GNUNET_CLIENT_connect(handle->cfg,
239  "gns",
240  handlers,
242  handle);
243  if (NULL == handle->mq)
244  return;
245  for (struct GNUNET_GNS_LookupRequest *lh = handle->lookup_head;
246  NULL != lh;
247  lh = lh->next)
248  GNUNET_MQ_send_copy(handle->mq,
249  lh->env);
250 }
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: gns_api.h:39
Message from GNS service to client: new results.
Definition: gns.h:75
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:900
struct GNUNET_GNS_LookupRequest * next
DLL.
Definition: gns_api.c:46
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
Handle to a lookup request.
Definition: gns_api.c:42
#define GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT
Service response to name resolution request from client.
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
struct GNUNET_MQ_Handle * mq
Connection to service (if available).
Definition: gns_api.h:44
static int result
Global testing status.
Message handler for a specific message type.
struct GNUNET_GNS_LookupRequest * lookup_head
Head of linked list of active lookup requests.
Definition: gns_api.h:49
#define LOG(kind,...)
Definition: gns_api.c:37
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:430
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:132
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
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 95 of file gns_api.c.

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

Referenced by force_reconnect().

96 {
97  struct GNUNET_GNS_Handle *handle = cls;
98 
99  handle->reconnect_task = NULL;
100  reconnect(handle);
101 }
Connection to the GNS service.
Definition: gns_api.h:35
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void reconnect(struct GNUNET_GNS_Handle *handle)
Reconnect to GNS service.
Definition: gns_api.c:225
struct GNUNET_SCHEDULER_Task * reconnect_task
Reconnect task.
Definition: gns_api.h:59
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 110 of file gns_api.c.

References GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, GNUNET_GNS_Handle::mq, GNUNET_GNS_Handle::reconnect_backoff, GNUNET_GNS_Handle::reconnect_task, and reconnect_task().

Referenced by mq_error_handler().

111 {
112  GNUNET_MQ_destroy(handle->mq);
113  handle->mq = NULL;
114  handle->reconnect_backoff
116  handle->reconnect_task
119  handle);
120 }
struct GNUNET_TIME_Relative reconnect_backoff
How long do we wait until we try to reconnect?
Definition: gns_api.h:64
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:1237
struct GNUNET_MQ_Handle * mq
Connection to service (if available).
Definition: gns_api.h:44
static void reconnect_task(void *cls)
Reconnect to GNS.
Definition: gns_api.c:95
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
struct GNUNET_SCHEDULER_Task * reconnect_task
Reconnect task.
Definition: gns_api.h:59
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 132 of file gns_api.c.

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

Referenced by reconnect().

134 {
135  struct GNUNET_GNS_Handle *handle = cls;
136 
138  "Problem with message queue. error: %i\n",
139  error);
140  force_reconnect(handle);
141 }
Connection to the GNS service.
Definition: gns_api.h:35
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void force_reconnect(struct GNUNET_GNS_Handle *handle)
Disconnect from service and then reconnect.
Definition: gns_api.c:110
#define LOG(kind,...)
Definition: gns_api.c:37
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 151 of file gns_api.c.

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

153 {
154  size_t mlen = ntohs(lookup_msg->header.size) - sizeof(*lookup_msg);
155  uint32_t rd_count = ntohl(lookup_msg->rd_count);
156  struct GNUNET_GNSRECORD_Data rd[rd_count];
157 
158  (void)cls;
159  if (GNUNET_SYSERR ==
161  (const char*)&lookup_msg[1],
162  rd_count,
163  rd))
164  {
165  GNUNET_break(0);
166  return GNUNET_SYSERR;
167  }
168  return GNUNET_OK;
169 }
uint32_t rd_count
The number of records contained in response.
Definition: gns.h:89
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_MessageHeader header
Header of type GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT.
Definition: gns.h:79
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 179 of file gns_api.c.

References GNUNET_GNS_LookupRequest::env, 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_Handle::lookup_head, GNUNET_GNS_LookupRequest::lookup_proc, GNUNET_GNS_Handle::lookup_tail, lr, GNUNET_GNS_LookupRequest::next, GNUNET_GNS_LookupRequest::proc_cls, GNUNET_GNS_LookupRequest::r_id, LookupResultMessage::rd_count, and GNUNET_MessageHeader::size.

181 {
182  struct GNUNET_GNS_Handle *handle = cls;
183  size_t mlen = ntohs(lookup_msg->header.size) - sizeof(*lookup_msg);
184  uint32_t rd_count = ntohl(lookup_msg->rd_count);
185  struct GNUNET_GNSRECORD_Data rd[rd_count];
186  uint32_t r_id = ntohl(lookup_msg->id);
189  void *proc_cls;
190 
192  "Received lookup reply from GNS service (%u records)\n",
193  (unsigned int)rd_count);
194  for (lr = handle->lookup_head; NULL != lr; lr = lr->next)
195  if (lr->r_id == r_id)
196  break;
197  if (NULL == lr)
198  return;
199  proc = lr->lookup_proc;
200  proc_cls = lr->proc_cls;
201 
204  (const char*)&lookup_msg[1],
205  rd_count,
206  rd));
207  proc(proc_cls,
208  rd_count,
209  rd);
211  handle->lookup_tail,
212  lr);
213  if (NULL != lr->env)
214  GNUNET_MQ_discard(lr->env);
215  GNUNET_free(lr);
216 }
uint32_t r_id
request id
Definition: gns_api.c:76
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Connection to the GNS service.
Definition: gns_api.h:35
uint32_t rd_count
The number of records contained in response.
Definition: gns.h:89
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.
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition: gnunet-gns.c:75
struct GNUNET_GNS_LookupRequest * next
DLL.
Definition: gns_api.c:46
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
Handle to a lookup request.
Definition: gns_api.c:42
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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_GNS_LookupResultProcessor lookup_proc
processor to call on lookup result
Definition: gns_api.c:61
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
uint32_t id
Unique identifier for this request (for key collisions).
Definition: gns.h:84
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_GNS_LookupRequest * lookup_tail
Tail of linked list of active lookup requests.
Definition: gns_api.h:54
void GNUNET_MQ_discard(struct GNUNET_MQ_Envelope *mqm)
Discard the message queue message, free all allocated resources.
Definition: mq.c:319
struct GNUNET_MQ_Envelope * env
Envelope with the message for this queue entry.
Definition: gns_api.c:71
struct GNUNET_MessageHeader header
Header of type GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT.
Definition: gns.h:79
struct GNUNET_GNS_LookupRequest * lookup_head
Head of linked list of active lookup requests.
Definition: gns_api.h:49
#define LOG(kind,...)
Definition: gns_api.c:37
void * proc_cls
lookup_proc closure
Definition: gns_api.c:66
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function: