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 255 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().

256 {
257  struct RequestHandle *handle = cls;
258 
260  "Cleaning up\n");
261  if (NULL != handle->timeout_task)
262  {
264  handle->timeout_task = NULL;
265  }
266  if (NULL != handle->url)
267  GNUNET_free(handle->url);
268  if (NULL != handle->emsg)
269  GNUNET_free(handle->emsg);
270  if (NULL != handle->address)
271  GNUNET_free((char*)handle->address);
272  if (NULL != handle->expiration_str)
273  GNUNET_free(handle->expiration_str);
274  if (NULL != handle->pubkey)
275  GNUNET_free(handle->pubkey);
276 
277  if (NULL != handle->temp_array)
278  {
279  json_decref(handle->temp_array);
280  handle->temp_array = NULL;
281  }
282  if (NULL != handle->response)
283  {
284  json_decref(handle->response);
285  handle->response = NULL;
286  }
287 
288  if (NULL != handle->list_it)
289  {
291  handle->list_it = NULL;
292  }
293  if (NULL != handle->peerinfo_handle)
294  {
296  handle->peerinfo_handle = NULL;
297  }
298 
299  GNUNET_free(handle);
300 }
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:519
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:154
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:956
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 309 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().

310 {
311  struct RequestHandle *handle = cls;
312  struct MHD_Response *resp;
313  json_t *json_error = json_object();
314  char *response;
315 
316  if (NULL == handle->emsg)
318 
319  json_object_set_new(json_error, "error", json_string(handle->emsg));
320 
321  if (0 == handle->response_code)
322  handle->response_code = MHD_HTTP_OK;
323  response = json_dumps(json_error, 0);
324  resp = GNUNET_REST_create_response(response);
325  handle->proc(handle->proc_cls, resp, handle->response_code);
326  json_decref(json_error);
327  GNUNET_free(response);
329 }
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:1264
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 338 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().

339 {
340  struct RequestHandle *handle = cls;
341  char *result_str;
342  struct MHD_Response *resp;
343 
344  if (NULL == handle->response)
345  {
346  handle->response_code = MHD_HTTP_NOT_FOUND;
347  handle->emsg = GNUNET_strdup("No peers found");
349  return;
350  }
351 
352  result_str = json_dumps(handle->response, 0);
353  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
354  resp = GNUNET_REST_create_response(result_str);
355  handle->proc(handle->proc_cls, resp, MHD_HTTP_OK);
356  GNUNET_free_non_null(result_str);
358 }
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:1264
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 370 of file plugin_rest_peerinfo.c.

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

Referenced by peerinfo_list_iteration().

373 {
374  struct PrintContext *pc = cls;
375 
376  if (0 == GNUNET_TIME_absolute_get_remaining(expiration).rel_value_us)
377  {
378  return GNUNET_OK; /* ignore expired address */
379  }
380 
381  pc->off++;
382  return GNUNET_OK;
383 }
Structure we use to collect printable address information.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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 392 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().

393 {
394  struct RequestHandle *handle;
395  unsigned int i;
396  json_t *response_entry;
397  json_t *temp_array;
398  json_t *object;
399  json_t *address;
400  json_t *expires;
401  json_t *friend_and_peer_json;
402  char *friend_and_peer;
403 
404  temp_array = json_array();
405  response_entry = json_object();
406 
407  for (i = 0; i < pc->num_addresses; i++)
408  {
409  if (NULL != pc->address_list[i].result)
410  {
411  object = json_object();
412  address = json_string(pc->address_list[i].result);
413  expires = json_string(
415  json_object_set(object, "address", address);
416  json_object_set(object, "expires", expires);
417 
418  json_decref(address);
419  json_decref(expires);
420 
421  json_array_append(temp_array, object);
422  json_decref(object);
424  }
425  }
426 
427  if (0 < json_array_size(temp_array))
428  {
429  GNUNET_asprintf(&friend_and_peer,
430  "%s%s",
431  (GNUNET_YES == pc->friend_only) ? "F2F:" : "",
432  GNUNET_i2s_full(&pc->peer));
433  friend_and_peer_json = json_string(friend_and_peer);
434  json_object_set(response_entry,
436  friend_and_peer_json);
437  json_object_set(response_entry,
439  temp_array);
440  json_array_append(pc->handle->response, response_entry);
441  json_decref(friend_and_peer_json);
442  GNUNET_free(friend_and_peer);
443  }
444 
445  json_decref(temp_array);
446  json_decref(response_entry);
447 
450  pc_tail,
451  pc);
452  handle = pc->handle;
453  GNUNET_free(pc);
454 
455  if ((NULL == pc_head) &&
456  (NULL == handle->list_it))
457  {
459  }
460 }
#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:1264
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:77
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:741
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 474 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().

477 {
478  struct AddressRecord *ar = cls;
479  struct PrintContext *pc = ar->pc;
480 
481  if (NULL != address)
482  {
483  if (0 != strlen(address))
484  {
485  if (NULL != ar->result)
486  GNUNET_free(ar->result);
488  }
489  return;
490  }
491  ar->atsc = NULL;
492  if (GNUNET_SYSERR == res)
494  _("Failure: Cannot convert address to string for peer `%s'\n"),
495  GNUNET_i2s(&ar->pc->peer));
496  pc->num_addresses++;
497  if (pc->num_addresses == pc->address_list_size)
498  dump_pc(ar->pc);
499 }
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:181
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:76
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 511 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().

514 {
515  struct PrintContext *pc = cls;
516  struct AddressRecord *ar;
517 
518  if (0 == GNUNET_TIME_absolute_get_remaining(expiration).rel_value_us)
519  {
520  return GNUNET_OK; /* ignore expired address */
521  }
522 
523  GNUNET_assert(0 < pc->off);
524  ar = &pc->address_list[--pc->off];
525  ar->pc = pc;
526  ar->expiration = expiration;
527  GNUNET_asprintf(&ar->result,
528  "%s:%u:%u",
529  address->transport_name,
530  address->address_length,
531  address->local_info);
533  address,
534  GNUNET_NO,
535  TIMEOUT,
537  ar);
538  return GNUNET_OK;
539 }
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:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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 552 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().

556 {
557  struct RequestHandle *handle = cls;
558  struct PrintContext *pc;
559  int friend_only;
560 
561  if (NULL == handle->response)
562  {
563  handle->response = json_array();
564  }
565 
566  if (NULL == peer)
567  {
568  handle->list_it = NULL;
569  handle->emsg = GNUNET_strdup("Error in communication with peerinfo");
570  if (NULL != err_msg)
571  {
572  GNUNET_free(handle->emsg);
573  handle->emsg = GNUNET_strdup(err_msg);
574  handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
575  }
576  if (NULL == pc_head)
578  return;
579  }
580  if (NULL == hello)
581  return;
582 
583  friend_only = GNUNET_NO;
584  if (NULL != hello)
585  friend_only = GNUNET_HELLO_is_friend_only(hello);
586 
587  pc = GNUNET_new(struct PrintContext);
589  pc_tail,
590  pc);
591  pc->peer = *peer;
592  pc->friend_only = friend_only;
593  pc->handle = handle;
595  GNUNET_NO,
596  &count_address,
597  pc);
598  if (0 == pc->off)
599  {
600  dump_pc(pc);
601  return;
602  }
603  pc->address_list_size = pc->off;
605  sizeof(struct AddressRecord) * pc->off);
607  GNUNET_NO,
608  &print_address,
609  pc);
610 }
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:78
#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:252
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:1264
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:87
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 620 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().

623 {
624  struct RequestHandle *handle = cls;
625  struct GNUNET_HashCode key;
626  const struct GNUNET_PeerIdentity *specific_peer;
627  //GNUNET_PEER_Id peer_id;
629  char* include_friend_only_str;
630 
631  include_friend_only = GNUNET_NO;
634  &key);
635  if (GNUNET_YES
637  &key))
638  {
639  include_friend_only_str = GNUNET_CONTAINER_multihashmap_get(
640  con_handle->url_param_map, &key);
641  if (0 == strcmp(include_friend_only_str, "yes"))
642  {
643  include_friend_only = GNUNET_YES;
644  }
645  }
646 
647  specific_peer = NULL;
650  &key);
651  if (GNUNET_YES
653  &key))
654  {
655  //peer_id = *(unsigned int*)GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, &key);
656  //specific_peer = GNUNET_PEER_resolve2(peer_id);
657  }
658 
660  include_friend_only,
661  specific_peer,
663  handle);
664 }
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:78
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:486
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:77
#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 676 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().

679 {
680  struct MHD_Response *resp;
681  struct RequestHandle *handle = cls;
682 
683  //independent of path return all options
684  resp = GNUNET_REST_create_response(NULL);
685  MHD_add_response_header(resp,
686  "Access-Control-Allow-Methods",
687  allow_methods);
688  handle->proc(handle->proc_cls, resp, MHD_HTTP_OK);
690  return;
691 }
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:1264
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 700 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().

701 {
703  static const struct GNUNET_REST_RequestHandler handlers[] = {
704  { MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_PEERINFO, &peerinfo_get },
705  { MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_PEERINFO, &options_cont },
707  };
708 
710  handlers,
711  &err,
712  handle))
713  {
714  handle->response_code = err.error_code;
716  }
717 }
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:78
#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:1264
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:75
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 732 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().

735 {
736  struct RequestHandle *handle = GNUNET_new(struct RequestHandle);
737 
738  handle->response_code = 0;
740  handle->proc_cls = proc_cls;
741  handle->proc = proc;
742  handle->rest_handle = rest_handle;
743 
744  handle->url = GNUNET_strdup(rest_handle->url);
745  if (handle->url[strlen(handle->url) - 1] == '/')
746  handle->url[strlen(handle->url) - 1] = '\0';
747  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n");
749  init_cont(handle);
750  handle->timeout_task =
752  &do_error,
753  handle);
754 
755  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Connected\n");
756 }
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:128
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:1237
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:440
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 766 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().

767 {
768  static struct Plugin plugin;
769  struct GNUNET_REST_Plugin *api;
770 
771  cfg = cls;
772  if (NULL != plugin.cfg)
773  return NULL; /* can only initialize once! */
774  memset(&plugin, 0, sizeof(struct Plugin));
775  plugin.cfg = cfg;
776  api = GNUNET_new(struct GNUNET_REST_Plugin);
777  api->cls = &plugin;
781  "%s, %s, %s, %s, %s",
782  MHD_HTTP_METHOD_GET,
783  MHD_HTTP_METHOD_POST,
784  MHD_HTTP_METHOD_PUT,
785  MHD_HTTP_METHOD_DELETE,
786  MHD_HTTP_METHOD_OPTIONS);
787 
789  _("Peerinfo REST API initialized\n"));
790  return api;
791 }
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:181
#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 801 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.

802 {
803  struct GNUNET_REST_Plugin *api = cls;
804  struct Plugin *plugin = api->cls;
805 
806  plugin->cfg = NULL;
807 
809  GNUNET_free(api);
811  "Peerinfo REST plugin is finished\n");
812  return NULL;
813 }
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 162 of file plugin_rest_peerinfo.c.

◆ pc_tail

struct PrintContext* pc_tail
static

Tail of list of print contexts.

Definition at line 167 of file plugin_rest_peerinfo.c.