GNUnet  0.10.x
Data Structures | Macros | Functions | Variables
plugin_rest_peerinfo.c File Reference
#include "platform.h"
#include "gnunet_rest_plugin.h"
#include "gnunet_peerinfo_service.h"
#include "gnunet_transport_service.h"
#include "gnunet_rest_lib.h"
#include "gnunet_json_lib.h"
#include "microhttpd.h"
#include <jansson.h>
Include dependency graph for plugin_rest_peerinfo.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  AddressRecord
 Record we keep for each printable address. More...
 
struct  PrintContext
 Structure we use to collect printable address information. More...
 
struct  RequestHandle
 The request handle. More...
 

Macros

#define GNUNET_REST_API_NS_PEERINFO   "/peerinfo"
 Peerinfo Namespace. More...
 
#define GNUNET_REST_PEERINFO_PEER   "peer"
 Peerinfo parameter peer. More...
 
#define GNUNET_REST_PEERINFO_FRIEND   "friend"
 Peerinfo parameter friend. More...
 
#define GNUNET_REST_PEERINFO_ARRAY   "array"
 Peerinfo parameter array. More...
 
#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN   "Unknown Error"
 Error message Unknown Error. More...
 
#define TIMEOUT   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
 How long until we time out during address lookup? More...
 

Functions

static void cleanup_handle (void *cls)
 Cleanup lookup handle. More...
 
static void do_error (void *cls)
 Task run on errors. More...
 
static void peerinfo_list_finished (void *cls)
 Function that assembles the response. More...
 
static int count_address (void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
 Iterator callback to go over all addresses and count them. More...
 
static void dump_pc (struct PrintContext *pc)
 Print the collected address information to the console and free pc. More...
 
static void process_resolved_address (void *cls, const char *address, int res)
 Function to call with a human-readable format of an address. More...
 
static int print_address (void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
 Iterator callback to go over all addresses. More...
 
void peerinfo_list_iteration (void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Message *hello, const char *err_msg)
 Callback that processes each of the known HELLOs for the iteration response construction. More...
 
void peerinfo_get (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Handle peerinfo GET request. More...
 
static void options_cont (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Respond to OPTIONS request. More...
 
static void init_cont (struct RequestHandle *handle)
 Handle rest request. More...
 
static void rest_process_request (struct GNUNET_REST_RequestHandle *rest_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
 Function processing the REST call. More...
 
void * libgnunet_plugin_rest_peerinfo_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_rest_peerinfo_done (void *cls)
 Exit point from the plugin. More...
 

Variables

const struct GNUNET_CONFIGURATION_Handlecfg
 The configuration handle. More...
 
static char * allow_methods
 HTTP methods allows for this plugin. More...
 
static struct PrintContextpc_head
 Head of list of print contexts. More...
 
static struct PrintContextpc_tail
 Tail of list of print contexts. More...
 

Macro Definition Documentation

◆ GNUNET_REST_API_NS_PEERINFO

#define GNUNET_REST_API_NS_PEERINFO   "/peerinfo"

Peerinfo Namespace.

Definition at line 39 of file plugin_rest_peerinfo.c.

Referenced by init_cont(), and libgnunet_plugin_rest_peerinfo_init().

◆ GNUNET_REST_PEERINFO_PEER

#define GNUNET_REST_PEERINFO_PEER   "peer"

Peerinfo parameter peer.

Definition at line 44 of file plugin_rest_peerinfo.c.

Referenced by dump_pc(), and peerinfo_get().

◆ GNUNET_REST_PEERINFO_FRIEND

#define GNUNET_REST_PEERINFO_FRIEND   "friend"

Peerinfo parameter friend.

Definition at line 49 of file plugin_rest_peerinfo.c.

Referenced by peerinfo_get().

◆ GNUNET_REST_PEERINFO_ARRAY

#define GNUNET_REST_PEERINFO_ARRAY   "array"

Peerinfo parameter array.

Definition at line 54 of file plugin_rest_peerinfo.c.

Referenced by dump_pc().

◆ GNUNET_REST_PEERINFO_ERROR_UNKNOWN

#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN   "Unknown Error"

Error message Unknown Error.

Definition at line 59 of file plugin_rest_peerinfo.c.

Referenced by do_error().

◆ TIMEOUT

How long until we time out during address lookup?

Definition at line 64 of file plugin_rest_peerinfo.c.

Referenced by print_address().

Function Documentation

◆ cleanup_handle()

static void cleanup_handle ( void *  cls)
static

Cleanup lookup handle.

Parameters
handleHandle to clean up

Definition at line 261 of file plugin_rest_peerinfo.c.

References RequestHandle::address, RequestHandle::emsg, RequestHandle::expiration_str, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_PEERINFO_disconnect(), GNUNET_PEERINFO_iterate_cancel(), GNUNET_SCHEDULER_cancel(), handle, RequestHandle::list_it, RequestHandle::peerinfo_handle, RequestHandle::pubkey, RequestHandle::response, RequestHandle::temp_array, RequestHandle::timeout_task, and RequestHandle::url.

Referenced by do_error(), options_cont(), and peerinfo_list_finished().

262 {
263  struct RequestHandle *handle = cls;
264 
266  "Cleaning up\n");
267  if (NULL != handle->timeout_task)
268  {
270  handle->timeout_task = NULL;
271  }
272  if (NULL != handle->url)
273  GNUNET_free (handle->url);
274  if (NULL != handle->emsg)
275  GNUNET_free (handle->emsg);
276  if (NULL != handle->address)
277  GNUNET_free ((char*)handle->address);
278  if (NULL != handle->expiration_str)
279  GNUNET_free (handle->expiration_str);
280  if (NULL != handle->pubkey)
281  GNUNET_free (handle->pubkey);
282 
283  if (NULL != handle->temp_array)
284  {
285  json_decref(handle->temp_array);
286  handle->temp_array = NULL;
287  }
288  if (NULL != handle->response)
289  {
290  json_decref(handle->response);
291  handle->response = NULL;
292  }
293 
294  if (NULL != handle->list_it)
295  {
297  handle->list_it = NULL;
298  }
299  if (NULL != handle->peerinfo_handle)
300  {
302  handle->peerinfo_handle = NULL;
303  }
304 
305  GNUNET_free (handle);
306 }
struct GNUNET_PEERINFO_Handle * peerinfo_handle
Handle to PEERINFO.
The request handle.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
void GNUNET_PEERINFO_iterate_cancel(struct GNUNET_PEERINFO_IteratorContext *ic)
Cancel an iteration over peer information.
Definition: peerinfo_api.c:524
char * emsg
Error response message.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
json_t * response
JSON response.
struct GNUNET_SCHEDULER_Task * timeout_task
ID of a task associated with the resolution process.
char * expiration_str
Expiration time string.
json_t * temp_array
JSON temporary array.
#define GNUNET_log(kind,...)
void GNUNET_PEERINFO_disconnect(struct GNUNET_PEERINFO_Handle *h)
Disconnect from the peerinfo service.
Definition: peerinfo_api.c:159
const char * address
Address string.
char * pubkey
Iteration peer public key.
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:965
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_error()

static void do_error ( void *  cls)
static

Task run on errors.

Reports an error and cleans up everything.

Parameters
clsthe struct RequestHandle

Definition at line 315 of file plugin_rest_peerinfo.c.

References cleanup_handle(), RequestHandle::emsg, GNUNET_free, GNUNET_REST_create_response(), GNUNET_REST_PEERINFO_ERROR_UNKNOWN, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::proc, RequestHandle::proc_cls, response, and RequestHandle::response_code.

Referenced by init_cont(), peerinfo_list_finished(), peerinfo_list_iteration(), and rest_process_request().

316 {
317  struct RequestHandle *handle = cls;
318  struct MHD_Response *resp;
319  json_t *json_error = json_object();
320  char *response;
321 
322  if (NULL == handle->emsg)
324 
325  json_object_set_new(json_error,"error", json_string(handle->emsg));
326 
327  if (0 == handle->response_code)
328  handle->response_code = MHD_HTTP_OK;
329  response = json_dumps (json_error, 0);
330  resp = GNUNET_REST_create_response (response);
331  handle->proc (handle->proc_cls, resp, handle->response_code);
332  json_decref(json_error);
333  GNUNET_free(response);
335 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN
Error message Unknown Error.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
HTTP response code.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:56
static struct MHD_Response * response
Our canonical response.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ peerinfo_list_finished()

static void peerinfo_list_finished ( void *  cls)
static

Function that assembles the response.

Parameters
clsthe struct RequestHandle

Definition at line 344 of file plugin_rest_peerinfo.c.

References cleanup_handle(), do_error(), RequestHandle::emsg, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free_non_null, GNUNET_log, GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::proc, RequestHandle::proc_cls, RequestHandle::response, and RequestHandle::response_code.

Referenced by dump_pc().

345 {
346  struct RequestHandle *handle = cls;
347  char *result_str;
348  struct MHD_Response *resp;
349 
350  if (NULL == handle->response)
351  {
352  handle->response_code = MHD_HTTP_NOT_FOUND;
353  handle->emsg = GNUNET_strdup ("No peers found");
355  return;
356  }
357 
358  result_str = json_dumps (handle->response, 0);
359  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
360  resp = GNUNET_REST_create_response (result_str);
361  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
362  GNUNET_free_non_null (result_str);
364 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
HTTP response code.
json_t * response
JSON response.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:56
#define GNUNET_log(kind,...)
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ count_address()

static int count_address ( void *  cls,
const struct GNUNET_HELLO_Address address,
struct GNUNET_TIME_Absolute  expiration 
)
static

Iterator callback to go over all addresses and count them.

Parameters
clsstruct PrintContext * with off to increment
addressthe address
expirationexpiration time
Returns
GNUNET_OK to keep the address and continue

Definition at line 376 of file plugin_rest_peerinfo.c.

References GNUNET_OK, GNUNET_TIME_absolute_get_remaining(), PrintContext::off, and pc.

Referenced by peerinfo_list_iteration().

379 {
380  struct PrintContext *pc = cls;
381 
382  if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
383  {
384  return GNUNET_OK; /* ignore expired address */
385  }
386 
387  pc->off++;
388  return GNUNET_OK;
389 }
Structure we use to collect printable address information.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
unsigned int off
Current offset in address_list (counted down).
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dump_pc()

static void dump_pc ( struct PrintContext pc)
static

Print the collected address information to the console and free pc.

Parameters
pcprinting context

Definition at line 398 of file plugin_rest_peerinfo.c.

References address, PrintContext::address_list, AddressRecord::expiration, PrintContext::friend_only, GNUNET_asprintf(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_free_non_null, GNUNET_i2s_full(), GNUNET_REST_PEERINFO_ARRAY, GNUNET_REST_PEERINFO_PEER, GNUNET_SCHEDULER_add_now(), GNUNET_STRINGS_absolute_time_to_string(), GNUNET_YES, handle, PrintContext::handle, RequestHandle::list_it, PrintContext::num_addresses, PrintContext::peer, peerinfo_list_finished(), RequestHandle::response, AddressRecord::result, and RequestHandle::temp_array.

Referenced by peerinfo_list_iteration(), and process_resolved_address().

399 {
400  struct RequestHandle *handle;
401  unsigned int i;
402  json_t *response_entry;
403  json_t *temp_array;
404  json_t *object;
405  json_t *address;
406  json_t *expires;
407  json_t *friend_and_peer_json;
408  char *friend_and_peer;
409 
410  temp_array = json_array();
411  response_entry = json_object();
412 
413  for (i = 0; i < pc->num_addresses; i++)
414  {
415  if (NULL != pc->address_list[i].result)
416  {
417  object = json_object ();
418  address = json_string(pc->address_list[i].result);
419  expires = json_string(
421  json_object_set (object, "address", address);
422  json_object_set (object, "expires", expires);
423 
424  json_decref(address);
425  json_decref(expires);
426 
427  json_array_append(temp_array, object);
428  json_decref(object);
430  }
431  }
432 
433  if (0 < json_array_size(temp_array))
434  {
435  GNUNET_asprintf(&friend_and_peer,
436  "%s%s",
437  (GNUNET_YES == pc->friend_only) ? "F2F:" : "",
438  GNUNET_i2s_full (&pc->peer));
439  friend_and_peer_json = json_string(friend_and_peer);
440  json_object_set(response_entry,
442  friend_and_peer_json);
443  json_object_set(response_entry,
445  temp_array);
446  json_array_append(pc->handle->response, response_entry);
447  json_decref(friend_and_peer_json);
448  GNUNET_free(friend_and_peer);
449  }
450 
451  json_decref (temp_array);
452  json_decref(response_entry);
453 
456  pc_tail,
457  pc);
458  handle = pc->handle;
459  GNUNET_free (pc);
460 
461  if ( (NULL == pc_head) &&
462  (NULL == handle->list_it) )
463  {
465  }
466 
467 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_PeerIdentity peer
Identity of the peer.
const char * GNUNET_i2s_full(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
The request handle.
unsigned int num_addresses
Number of completed addresses in address_list.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static void peerinfo_list_finished(void *cls)
Function that assembles the response.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_TIME_Absolute expiration
Address expiration time.
#define GNUNET_REST_PEERINFO_ARRAY
Peerinfo parameter array.
json_t * response
JSON response.
#define GNUNET_REST_PEERINFO_PEER
Peerinfo parameter peer.
char * result
Printable address.
static struct PrintContext * pc_head
Head of list of print contexts.
json_t * temp_array
JSON temporary array.
#define GNUNET_YES
Definition: gnunet_common.h:80
int friend_only
Hello was friend only, GNUNET_YES or GNUNET_NO.
struct AddressRecord * address_list
List of printable addresses.
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:792
static char * address
GNS address for this phone.
struct RequestHandle * handle
RequestHandle.
static struct PrintContext * pc_tail
Tail of list of print contexts.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_resolved_address()

static void process_resolved_address ( void *  cls,
const char *  address,
int  res 
)
static

Function to call with a human-readable format of an address.

Parameters
clsclosure
addressNULL on error, otherwise 0-terminated printable UTF-8 string
resresult of the address to string conversion: if GNUNET_OK: address was valid (conversion to string might still have failed) if GNUNET_SYSERR: address is invalid

Definition at line 481 of file plugin_rest_peerinfo.c.

References _, PrintContext::address_list_size, AddressRecord::atsc, dump_pc(), GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_i2s(), GNUNET_log, GNUNET_strdup, GNUNET_SYSERR, PrintContext::num_addresses, pc, AddressRecord::pc, PrintContext::peer, and AddressRecord::result.

Referenced by print_address().

484 {
485  struct AddressRecord *ar = cls;
486  struct PrintContext *pc = ar->pc;
487 
488  if (NULL != address)
489  {
490  if (0 != strlen (address))
491  {
492  if (NULL != ar->result)
493  GNUNET_free (ar->result);
494  ar->result = GNUNET_strdup (address);
495  }
496  return;
497  }
498  ar->atsc = NULL;
499  if (GNUNET_SYSERR == res)
501  _("Failure: Cannot convert address to string for peer `%s'\n"),
502  GNUNET_i2s (&ar->pc->peer));
503  pc->num_addresses++;
504  if (pc->num_addresses == pc->address_list_size)
505  dump_pc (ar->pc);
506 }
struct GNUNET_PeerIdentity peer
Identity of the peer.
struct PrintContext * pc
Print context this address record belongs to.
Structure we use to collect printable address information.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
unsigned int num_addresses
Number of completed addresses in address_list.
Record we keep for each printable address.
static int res
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
struct GNUNET_TRANSPORT_AddressToStringContext * atsc
Current address-to-string context (if active, otherwise NULL).
char * result
Printable address.
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
#define GNUNET_log(kind,...)
static void dump_pc(struct PrintContext *pc)
Print the collected address information to the console and free pc.
unsigned int address_list_size
Number of addresses allocated in address_list.
static char * address
GNS address for this phone.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_address()

static int print_address ( void *  cls,
const struct GNUNET_HELLO_Address address,
struct GNUNET_TIME_Absolute  expiration 
)
static

Iterator callback to go over all addresses.

Parameters
clsclosure
addressthe address
expirationexpiration time
Returns
GNUNET_OK to keep the address and continue

Definition at line 518 of file plugin_rest_peerinfo.c.

References GNUNET_HELLO_Address::address_length, PrintContext::address_list, AddressRecord::atsc, AddressRecord::expiration, expiration, GNUNET_asprintf(), GNUNET_assert, GNUNET_NO, GNUNET_OK, GNUNET_TIME_absolute_get_remaining(), GNUNET_TRANSPORT_address_to_string(), GNUNET_HELLO_Address::local_info, PrintContext::off, pc, AddressRecord::pc, process_resolved_address(), AddressRecord::result, TIMEOUT, and GNUNET_HELLO_Address::transport_name.

Referenced by peerinfo_list_iteration().

521 {
522  struct PrintContext *pc = cls;
523  struct AddressRecord *ar;
524 
525  if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
526  {
527  return GNUNET_OK; /* ignore expired address */
528  }
529 
530  GNUNET_assert (0 < pc->off);
531  ar = &pc->address_list[--pc->off];
532  ar->pc = pc;
533  ar->expiration = expiration;
534  GNUNET_asprintf (&ar->result,
535  "%s:%u:%u",
536  address->transport_name,
537  address->address_length,
538  address->local_info);
540  address,
541  GNUNET_NO,
542  TIMEOUT,
544  ar);
545  return GNUNET_OK;
546 }
size_t address_length
Number of bytes in address.
enum GNUNET_HELLO_AddressInfo local_info
Extended information about address.
static char * expiration
Credential TTL.
struct PrintContext * pc
Print context this address record belongs to.
Structure we use to collect printable address information.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
Record we keep for each printable address.
const char * transport_name
Name of the transport plugin enabling the communication using this address.
struct GNUNET_TIME_Absolute expiration
Address expiration time.
static void process_resolved_address(void *cls, const char *address, int res)
Function to call with a human-readable format of an address.
struct GNUNET_TRANSPORT_AddressToStringContext * GNUNET_TRANSPORT_address_to_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_HELLO_Address *address, int numeric, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressToStringCallback aluc, void *aluc_cls)
Convert a binary address into a human readable address.
struct GNUNET_TRANSPORT_AddressToStringContext * atsc
Current address-to-string context (if active, otherwise NULL).
char * result
Printable address.
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
unsigned int off
Current offset in address_list (counted down).
#define TIMEOUT
How long until we time out during address lookup?
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
struct AddressRecord * address_list
List of printable addresses.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ peerinfo_list_iteration()

void peerinfo_list_iteration ( void *  cls,
const struct GNUNET_PeerIdentity peer,
const struct GNUNET_HELLO_Message hello,
const char *  err_msg 
)

Callback that processes each of the known HELLOs for the iteration response construction.

Parameters
clsclosure, NULL
peerid of the peer, NULL for last call
hellohello message for the peer (can be NULL)
err_msgmessage

Definition at line 559 of file plugin_rest_peerinfo.c.

References PrintContext::address_list, PrintContext::address_list_size, count_address(), do_error(), dump_pc(), RequestHandle::emsg, PrintContext::friend_only, GNUNET_CONTAINER_DLL_insert, GNUNET_free, GNUNET_HELLO_is_friend_only(), GNUNET_HELLO_iterate_addresses(), GNUNET_malloc, GNUNET_new, GNUNET_NO, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, PrintContext::handle, RequestHandle::list_it, PrintContext::off, pc, PrintContext::peer, peer, print_address(), RequestHandle::response, and RequestHandle::response_code.

Referenced by peerinfo_get().

563 {
564  struct RequestHandle *handle = cls;
565  struct PrintContext *pc;
566  int friend_only;
567 
568  if (NULL == handle->response)
569  {
570  handle->response = json_array();
571  }
572 
573  if (NULL == peer)
574  {
575  handle->list_it = NULL;
576  handle->emsg = GNUNET_strdup ("Error in communication with peerinfo");
577  if (NULL != err_msg)
578  {
579  GNUNET_free(handle->emsg);
580  handle->emsg = GNUNET_strdup (err_msg);
581  handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
582  }
583  if (NULL == pc_head)
585  return;
586  }
587  if (NULL == hello)
588  return;
589 
590  friend_only = GNUNET_NO;
591  if (NULL != hello)
592  friend_only = GNUNET_HELLO_is_friend_only (hello);
593 
594  pc = GNUNET_new(struct PrintContext);
596  pc_tail,
597  pc);
598  pc->peer = *peer;
599  pc->friend_only = friend_only;
600  pc->handle = handle;
602  GNUNET_NO,
603  &count_address,
604  pc);
605  if (0 == pc->off)
606  {
607  dump_pc (pc);
608  return;
609  }
610  pc->address_list_size = pc->off;
612  sizeof(struct AddressRecord) * pc->off);
614  GNUNET_NO,
615  &print_address,
616  pc);
617 }
struct GNUNET_PeerIdentity peer
Identity of the peer.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
Structure we use to collect printable address information.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
Record we keep for each printable address.
static int print_address(void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
Iterator callback to go over all addresses.
char * emsg
Error response message.
struct GNUNET_HELLO_Message * GNUNET_HELLO_iterate_addresses(const struct GNUNET_HELLO_Message *msg, int return_modified, GNUNET_HELLO_AddressIterator it, void *it_cls)
Iterate over all of the addresses in the HELLO.
Definition: hello.c:254
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
HTTP response code.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
json_t * response
JSON response.
int GNUNET_HELLO_is_friend_only(const struct GNUNET_HELLO_Message *h)
Return HELLO type.
Definition: hello.c:89
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
static struct PrintContext * pc_head
Head of list of print contexts.
unsigned int off
Current offset in address_list (counted down).
int friend_only
Hello was friend only, GNUNET_YES or GNUNET_NO.
struct AddressRecord * address_list
List of printable addresses.
static int count_address(void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
Iterator callback to go over all addresses and count them.
static void dump_pc(struct PrintContext *pc)
Print the collected address information to the console and free pc.
unsigned int address_list_size
Number of addresses allocated in address_list.
struct RequestHandle * handle
RequestHandle.
#define GNUNET_malloc(size)
Wrapper around malloc.
static struct PrintContext * pc_tail
Tail of list of print contexts.
#define GNUNET_free(ptr)
Wrapper around free.
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ peerinfo_get()

void peerinfo_get ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)

Handle peerinfo GET request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 627 of file plugin_rest_peerinfo.c.

References GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_CRYPTO_hash(), GNUNET_NO, GNUNET_PEERINFO_iterate(), GNUNET_REST_PEERINFO_FRIEND, GNUNET_REST_PEERINFO_PEER, GNUNET_YES, handle, include_friend_only, RequestHandle::list_it, RequestHandle::peerinfo_handle, peerinfo_list_iteration(), and GNUNET_REST_RequestHandle::url_param_map.

Referenced by init_cont().

630 {
631  struct RequestHandle *handle = cls;
632  struct GNUNET_HashCode key;
633  const struct GNUNET_PeerIdentity *specific_peer;
634  //GNUNET_PEER_Id peer_id;
636  char* include_friend_only_str;
637 
638  include_friend_only = GNUNET_NO;
641  &key);
642  if ( GNUNET_YES
644  &key))
645  {
646  include_friend_only_str = GNUNET_CONTAINER_multihashmap_get (
647  con_handle->url_param_map, &key);
648  if (0 == strcmp(include_friend_only_str, "yes"))
649  {
650  include_friend_only = GNUNET_YES;
651  }
652  }
653 
654  specific_peer = NULL;
656  strlen (GNUNET_REST_PEERINFO_PEER),
657  &key);
658  if ( GNUNET_YES
660  &key))
661  {
662  //peer_id = *(unsigned int*)GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, &key);
663  //specific_peer = GNUNET_PEER_resolve2(peer_id);
664  }
665 
667  include_friend_only,
668  specific_peer,
670  handle);
671 }
void peerinfo_list_iteration(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Message *hello, const char *err_msg)
Callback that processes each of the known HELLOs for the iteration response construction.
struct GNUNET_PEERINFO_Handle * peerinfo_handle
Handle to PEERINFO.
static int include_friend_only
Option &#39;-f&#39;.
#define GNUNET_NO
Definition: gnunet_common.h:81
int GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL)...
The request handle.
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.
struct GNUNET_PEERINFO_IteratorContext * GNUNET_PEERINFO_iterate(struct GNUNET_PEERINFO_Handle *h, int include_friend_only, const struct GNUNET_PeerIdentity *peer, GNUNET_PEERINFO_Processor callback, void *callback_cls)
Call a method for each known matching host.
Definition: peerinfo_api.c:491
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
struct GNUNET_CONTAINER_MultiHashMap * url_param_map
Map of url parameters.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:44
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
A 512-bit hashcode.
struct GNUNET_HashCode key
The key used in the DHT.
#define GNUNET_REST_PEERINFO_PEER
Peerinfo parameter peer.
The identity of the host (wraps the signing key of the peer).
#define GNUNET_YES
Definition: gnunet_common.h:80
#define GNUNET_REST_PEERINFO_FRIEND
Peerinfo parameter friend.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ options_cont()

static void options_cont ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)
static

Respond to OPTIONS request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 683 of file plugin_rest_peerinfo.c.

References allow_methods, cleanup_handle(), GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), handle, RequestHandle::proc, and RequestHandle::proc_cls.

Referenced by init_cont().

686 {
687  struct MHD_Response *resp;
688  struct RequestHandle *handle = cls;
689 
690  //independent of path return all options
691  resp = GNUNET_REST_create_response (NULL);
692  MHD_add_response_header (resp,
693  "Access-Control-Allow-Methods",
694  allow_methods);
695  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
697  return;
698 }
static char * allow_methods
HTTP methods allows for this plugin.
GNUNET_REST_ResultProcessor proc
The plugin result processor.
void * proc_cls
The closure of the result processor.
The request handle.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:56
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_cont()

static void init_cont ( struct RequestHandle handle)
static

Handle rest request.

Parameters
handlethe request handle

Definition at line 707 of file plugin_rest_peerinfo.c.

References do_error(), GNUNET_REST_RequestHandlerError::error_code, GNUNET_NO, GNUNET_REST_API_NS_PEERINFO, GNUNET_REST_handle_request(), GNUNET_REST_HANDLER_END, GNUNET_SCHEDULER_add_now(), options_cont(), peerinfo_get(), RequestHandle::response_code, and RequestHandle::rest_handle.

Referenced by rest_process_request().

708 {
710  static const struct GNUNET_REST_RequestHandler handlers[] = {
711  {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_PEERINFO, &peerinfo_get},
712  {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_PEERINFO, &options_cont},
714  };
715 
717  handlers,
718  &err,
719  handle))
720  {
721  handle->response_code = err.error_code;
723  }
724 }
void peerinfo_get(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle peerinfo GET request.
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_REST_HANDLER_END
#define GNUNET_REST_API_NS_PEERINFO
Peerinfo Namespace.
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
int GNUNET_REST_handle_request(struct GNUNET_REST_RequestHandle *conn, const struct GNUNET_REST_RequestHandler *handlers, struct GNUNET_REST_RequestHandlerError *err, void *cls)
Definition: rest.c:76
struct GNUNET_REST_RequestHandle * rest_handle
Handle to rest request.
int response_code
HTTP response code.
static void options_cont(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Respond to OPTIONS request.
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rest_process_request()

static void rest_process_request ( struct GNUNET_REST_RequestHandle rest_handle,
GNUNET_REST_ResultProcessor  proc,
void *  proc_cls 
)
static

Function processing the REST call.

Parameters
methodHTTP method
urlURL of the HTTP request
databody of the HTTP request (optional)
data_sizelength of the body
proccallback function for the result
proc_clsclosure for callback function
Returns
GNUNET_OK if request accepted

Definition at line 739 of file plugin_rest_peerinfo.c.

References do_error(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_PEERINFO_connect(), GNUNET_SCHEDULER_add_delayed(), GNUNET_strdup, GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_SECONDS, handle, init_cont(), RequestHandle::peerinfo_handle, RequestHandle::proc, RequestHandle::proc_cls, RequestHandle::response_code, RequestHandle::rest_handle, RequestHandle::timeout, RequestHandle::timeout_task, GNUNET_REST_RequestHandle::url, and RequestHandle::url.

Referenced by libgnunet_plugin_rest_peerinfo_init().

742 {
743  struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
744 
745  handle->response_code = 0;
747  handle->proc_cls = proc_cls;
748  handle->proc = proc;
749  handle->rest_handle = rest_handle;
750 
751  handle->url = GNUNET_strdup (rest_handle->url);
752  if (handle->url[strlen (handle->url)-1] == '/')
753  handle->url[strlen (handle->url)-1] = '\0';
754  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n");
756  init_cont(handle);
757  handle->timeout_task =
759  &do_error,
760  handle);
761 
762  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected\n");
763 }
struct GNUNET_PEERINFO_Handle * peerinfo_handle
Handle to PEERINFO.
struct GNUNET_PEERINFO_Handle * GNUNET_PEERINFO_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the peerinfo service.
Definition: peerinfo_api.c:133
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_TIME_UNIT_SECONDS
One second.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
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:1246
const char * url
The url as string.
static void init_cont(struct RequestHandle *handle)
Handle rest request.
struct GNUNET_TIME_Relative timeout
Timeout.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:439
struct GNUNET_REST_RequestHandle * rest_handle
Handle to rest request.
int response_code
HTTP response code.
struct GNUNET_SCHEDULER_Task * timeout_task
ID of a task associated with the resolution process.
#define GNUNET_log(kind,...)
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
static void do_error(void *cls)
Task run on errors.
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_rest_peerinfo_init()

void* libgnunet_plugin_rest_peerinfo_init ( void *  cls)

Entry point for the plugin.

Parameters
clsConfig info
Returns
NULL on error, otherwise the plugin context

Definition at line 773 of file plugin_rest_peerinfo.c.

References _, allow_methods, Plugin::api, Plugin::cfg, GNUNET_REST_Plugin::cls, GNUNET_asprintf(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_REST_API_NS_PEERINFO, GNUNET_REST_Plugin::name, plugin, GNUNET_REST_Plugin::process_request, and rest_process_request().

774 {
775  static struct Plugin plugin;
776  struct GNUNET_REST_Plugin *api;
777 
778  cfg = cls;
779  if (NULL != plugin.cfg)
780  return NULL; /* can only initialize once! */
781  memset (&plugin, 0, sizeof (struct Plugin));
782  plugin.cfg = cfg;
783  api = GNUNET_new (struct GNUNET_REST_Plugin);
784  api->cls = &plugin;
788  "%s, %s, %s, %s, %s",
789  MHD_HTTP_METHOD_GET,
790  MHD_HTTP_METHOD_POST,
791  MHD_HTTP_METHOD_PUT,
792  MHD_HTTP_METHOD_DELETE,
793  MHD_HTTP_METHOD_OPTIONS);
794 
796  _("Peerinfo REST API initialized\n"));
797  return api;
798 }
static char * allow_methods
HTTP methods allows for this plugin.
void * cls
The closure of the plugin.
struct returned by the initialization function of the plugin
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void(* process_request)(struct GNUNET_REST_RequestHandle *handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function to process a REST call.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
#define GNUNET_REST_API_NS_PEERINFO
Peerinfo Namespace.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
char * name
Plugin name.
Handle for a plugin.
Definition: block.c:37
#define GNUNET_log(kind,...)
static void rest_process_request(struct GNUNET_REST_RequestHandle *rest_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function processing the REST call.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
Here is the call graph for this function:

◆ libgnunet_plugin_rest_peerinfo_done()

void* libgnunet_plugin_rest_peerinfo_done ( void *  cls)

Exit point from the plugin.

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

Definition at line 808 of file plugin_rest_peerinfo.c.

References allow_methods, Plugin::api, Plugin::cfg, GNUNET_REST_Plugin::cls, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_free_non_null, GNUNET_log, and plugin.

809 {
810  struct GNUNET_REST_Plugin *api = cls;
811  struct Plugin *plugin = api->cls;
812  plugin->cfg = NULL;
813 
815  GNUNET_free (api);
817  "Peerinfo REST plugin is finished\n");
818  return NULL;
819 }
static char * allow_methods
HTTP methods allows for this plugin.
void * cls
The closure of the plugin.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
struct returned by the initialization function of the plugin
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
Handle for a plugin.
Definition: block.c:37
#define GNUNET_log(kind,...)
#define GNUNET_free(ptr)
Wrapper around free.

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg

The configuration handle.

Handle to our configuration.

Definition at line 68 of file plugin_rest_peerinfo.c.

◆ allow_methods

char* allow_methods
static

HTTP methods allows for this plugin.

Definition at line 73 of file plugin_rest_peerinfo.c.

Referenced by libgnunet_plugin_rest_peerinfo_done(), libgnunet_plugin_rest_peerinfo_init(), and options_cont().

◆ pc_head

struct PrintContext* pc_head
static

Head of list of print contexts.

Definition at line 166 of file plugin_rest_peerinfo.c.

◆ pc_tail

struct PrintContext* pc_tail
static

Tail of list of print contexts.

Definition at line 171 of file plugin_rest_peerinfo.c.