GNUnet  0.11.x
Functions | Variables
gnunet-gns.c File Reference

binary version of gnunet-gns-import.sh (for OSes that have no POSIX shell). More...

#include "platform.h"
#include <gnunet_util_lib.h>
#include <gnunet_dnsparser_lib.h>
#include <gnunet_gnsrecord_lib.h>
#include <gnunet_namestore_service.h>
#include <gnunet_gns_service.h>
Include dependency graph for gnunet-gns.c:

Go to the source code of this file.

Functions

static void do_shutdown (void *cls)
 Task run on shutdown. More...
 
static void do_timeout (void *cls)
 Task to run on timeout. More...
 
static void process_lookup_result (void *cls, int was_gns, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Function called with the result of a GNS lookup. More...
 
static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c)
 Main function that will be run. More...
 
int main (int argc, char *const *argv)
 The main function for gnunet-gns. More...
 

Variables

static const struct GNUNET_CONFIGURATION_Handlecfg
 Configuration we are using. More...
 
static struct GNUNET_GNS_Handlegns
 Handle to GNS service. More...
 
static char * lookup_name
 GNS name to lookup. More...
 
char * idna_name
 DNS IDNA name to lookup. More...
 
static int dns_compat
 DNS compatibility (name is given as DNS name, possible IDNA). More...
 
static char * lookup_type
 record type to look up (-t option) More...
 
static int raw
 raw output More...
 
static uint32_t rtype
 Desired record type. More...
 
static struct GNUNET_TIME_Relative timeout
 Timeout for lookup. More...
 
static struct GNUNET_SCHEDULER_Taskto_task
 Timeout task. More...
 
static struct GNUNET_GNS_LookupWithTldRequestlr
 Handle to lookup request. More...
 
static int global_ret
 Global return value. More...
 

Detailed Description

binary version of gnunet-gns-import.sh (for OSes that have no POSIX shell).

command line tool to access distributed GNS

Author
LRN
Christian Grothoff

Definition in file gnunet-gns.c.

Function Documentation

◆ do_shutdown()

static void do_shutdown ( void *  cls)
static

Task run on shutdown.

Cleans up everything.

Parameters
clsunused

Definition at line 117 of file gnunet-gns.c.

References GNUNET_free, GNUNET_GNS_disconnect(), GNUNET_GNS_lookup_with_tld_cancel(), GNUNET_SCHEDULER_cancel(), and idna_name.

Referenced by run().

118 {
119  (void) cls;
120  if (NULL != to_task)
121  {
123  to_task = NULL;
124  }
125  if (NULL != lr)
126  {
128  lr = NULL;
129  }
130  if (NULL != gns)
131  {
133  gns = NULL;
134  }
135  if (NULL != idna_name)
136  {
138  idna_name = NULL;
139  }
140 }
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition: gnunet-gns.c:99
void * GNUNET_GNS_lookup_with_tld_cancel(struct GNUNET_GNS_LookupWithTldRequest *ltr)
Cancel pending lookup request.
Definition: gns_tld_api.c:329
static struct GNUNET_GNS_Handle * gns
Handle to GNS service.
Definition: gnunet-gns.c:54
void GNUNET_GNS_disconnect(struct GNUNET_GNS_Handle *handle)
Shutdown connection with the GNS service.
Definition: gns_api.c:290
static struct GNUNET_SCHEDULER_Task * to_task
Timeout task.
Definition: gnunet-gns.c:94
char * idna_name
DNS IDNA name to lookup.
Definition: gnunet-gns.c:64
#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:972
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_timeout()

static void do_timeout ( void *  cls)
static

Task to run on timeout.

Parameters
clsunused

Definition at line 149 of file gnunet-gns.c.

References global_ret, and GNUNET_SCHEDULER_shutdown().

Referenced by run().

150 {
151  to_task = NULL;
152  global_ret = 3; // Timeout
154 }
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:531
static struct GNUNET_SCHEDULER_Task * to_task
Timeout task.
Definition: gnunet-gns.c:94
static int global_ret
Global return value.
Definition: gnunet-gns.c:108
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_lookup_result()

static void process_lookup_result ( void *  cls,
int  was_gns,
uint32_t  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Function called with the result of a GNS lookup.

Parameters
clsthe 'const char *' name that was resolved
was_gnsGNUNET_NO if TLD did not indicate use of GNS
rd_countnumber of records returned
rdarray of rd_count records with the results

Definition at line 166 of file gnunet-gns.c.

References data, data_size, global_ret, GNUNET_free, GNUNET_GNSRECORD_number_to_typename(), GNUNET_GNSRECORD_RF_SUPPLEMENTAL, GNUNET_GNSRECORD_TYPE_ANY, GNUNET_GNSRECORD_value_to_string(), GNUNET_NO, GNUNET_SCHEDULER_shutdown(), name, raw, and rtype.

Referenced by run().

170 {
171  const char *name = cls;
172  const char *typename;
173  char *string_val;
174 
175  lr = NULL;
176  if (GNUNET_NO == was_gns)
177  {
178  global_ret = 4; /* not for GNS */
180  return;
181  }
182  if (! raw)
183  {
184  if (0 == rd_count)
185  printf ("No results.\n");
186  else
187  printf ("%s:\n", name);
188  }
189  for (uint32_t i = 0; i < rd_count; i++)
190  {
191  if ((rd[i].record_type != rtype) && (GNUNET_GNSRECORD_TYPE_ANY != rtype))
192  continue;
193  typename = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
194  string_val = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
195  rd[i].data,
196  rd[i].data_size);
197  if (NULL == string_val)
198  {
199  fprintf (stderr,
200  "Record %u of type %d malformed, skipping\n",
201  (unsigned int) i,
202  (int) rd[i].record_type);
203  continue;
204  }
205  if (raw)
206  printf ("%s\n", string_val);
207  else
208  printf ("Got `%s' record: %s%s\n",
209  typename,
210  string_val,
211  (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_SUPPLEMENTAL)) ?
212  " (supplemental)" : "");
213  GNUNET_free (string_val);
214  }
216 }
static int raw
raw output
Definition: gnunet-gns.c:79
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition: gnunet-gns.c:99
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/&#39;*&#39;.
This is a supplemental record.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:531
const char * name
uint32_t data
The data value.
char * GNUNET_GNSRECORD_value_to_string(uint32_t type, const void *data, size_t data_size)
Convert the &#39;value&#39; of a record to a string.
Definition: gnsrecord.c:159
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number (i.e.
Definition: gnsrecord.c:247
static uint32_t rtype
Desired record type.
Definition: gnunet-gns.c:84
#define GNUNET_free(ptr)
Wrapper around free.
static int global_ret
Global return value.
Definition: gnunet-gns.c:108
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
char *const *  args,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle c 
)
static

Main function that will be run.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cconfiguration

If DNS compatibility is requested, we first verify that the lookup_name is in a DNS format. If yes, we convert it to UTF-8.

Definition at line 228 of file gnunet-gns.c.

References _, dns_compat, do_shutdown(), do_timeout(), global_ret, GNUNET_CLIENT_test(), GNUNET_DNSPARSER_check_name(), GNUNET_DNSPARSER_TYPE_A, GNUNET_ERROR_TYPE_WARNING, GNUNET_GNS_connect(), GNUNET_GNS_LO_DEFAULT, GNUNET_GNS_lookup_with_tld(), GNUNET_GNSRECORD_TYPE_ANY, GNUNET_GNSRECORD_typename_to_number(), GNUNET_log, GNUNET_OK, GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_YES, idna_name, lookup_name, lookup_type, process_lookup_result(), rtype, and timeout.

Referenced by main().

232 {
233  (void) cls;
234  (void) args;
235  (void) cfgfile;
236 
237  cfg = c;
238  to_task = NULL;
239  {
240  char *colon;
241 
242  if (NULL != (colon = strchr (lookup_name, ':')))
243  *colon = '\0';
244  }
245 
250  if (GNUNET_YES == dns_compat)
251  {
252  Idna_rc rc;
253 
255  {
256  fprintf (stderr,
257  _ ("`%s' is not a valid DNS domain name\n"),
258  lookup_name);
259  global_ret = 3;
260  return;
261  }
262  if (IDNA_SUCCESS !=
263  (rc = idna_to_unicode_8z8z (lookup_name, &idna_name,
264  IDNA_ALLOW_UNASSIGNED)))
265  {
266  fprintf (stderr,
267  _ ("Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"),
268  lookup_name,
269  idna_strerror (rc));
270  global_ret = 4;
271  return;
272  }
274  }
275 
276  if (GNUNET_YES !=
278  "arm"))
279  {
281  _ ("Cannot resolve using GNS: GNUnet peer not running\n"));
282  global_ret = 5;
283  return;
284  }
286  &do_timeout,
287  NULL);
289  if (NULL == gns)
290  {
291  fprintf (stderr,
292  _ ("Failed to connect to GNS\n"));
293  global_ret = 2;
294  return;
295  }
297  NULL);
298  if (NULL != lookup_type)
300  else
302  if (UINT32_MAX == rtype)
303  {
304  fprintf (stderr,
305  _ ("Invalid typename specified, assuming `ANY'\n"));
307  }
309  lookup_name,
310  rtype,
313  lookup_name);
314  if (NULL == lr)
315  {
316  global_ret = 2;
318  return;
319  }
320 }
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition: gnunet-gns.c:99
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
Definition: scheduler.c:1331
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (i.e.
Definition: gnsrecord.c:220
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/&#39;*&#39;.
static int dns_compat
DNS compatibility (name is given as DNS name, possible IDNA).
Definition: gnunet-gns.c:69
struct GNUNET_GNS_LookupWithTldRequest * GNUNET_GNS_lookup_with_tld(struct GNUNET_GNS_Handle *handle, const char *name, uint32_t type, enum GNUNET_GNS_LocalOptions options, GNUNET_GNS_LookupResultProcessor2 proc, void *proc_cls)
Perform an asynchronous lookup operation on the GNS, determining the zone using the TLD of the given ...
Definition: gns_tld_api.c:241
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:531
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
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:1269
static struct GNUNET_TIME_Relative timeout
Timeout for lookup.
Definition: gnunet-gns.c:89
static struct GNUNET_GNS_Handle * gns
Handle to GNS service.
Definition: gnunet-gns.c:54
struct GNUNET_GNS_Handle * GNUNET_GNS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Initialize the connection with the GNS service.
Definition: gns_api.c:268
static struct GNUNET_SCHEDULER_Task * to_task
Timeout task.
Definition: gnunet-gns.c:94
int GNUNET_CLIENT_test(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name)
Test if the port or UNIXPATH of the given service_name is in use and thus (most likely) the respectiv...
Definition: client.c:898
static void do_shutdown(void *cls)
Task run on shutdown.
Definition: gnunet-gns.c:117
static void do_timeout(void *cls)
Task to run on timeout.
Definition: gnunet-gns.c:149
int GNUNET_DNSPARSER_check_name(const char *name)
Check if a hostname in UTF-8 format can be coded into valid IDNA.
Definition: dnsparser.c:79
static char * lookup_name
GNS name to lookup.
Definition: gnunet-gns.c:59
char * idna_name
DNS IDNA name to lookup.
Definition: gnunet-gns.c:64
static void process_lookup_result(void *cls, int was_gns, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Function called with the result of a GNS lookup.
Definition: gnunet-gns.c:166
#define GNUNET_log(kind,...)
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-gns.c:49
Defaults, look in cache, then in DHT.
static uint32_t rtype
Desired record type.
Definition: gnunet-gns.c:84
#define GNUNET_DNSPARSER_TYPE_A
static char * lookup_type
record type to look up (-t option)
Definition: gnunet-gns.c:74
static int global_ret
Global return value.
Definition: gnunet-gns.c:108
Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *const *  argv 
)

The main function for gnunet-gns.

Parameters
argcnumber of arguments from the command line
argvcommand line arguments
Returns
0 ok, 1 on error

Definition at line 331 of file gnunet-gns.c.

References _, dns_compat, gettext_noop, global_ret, GNUNET_free_nz, GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_mandatory(), GNUNET_GETOPT_option_relative_time(), GNUNET_GETOPT_option_string(), GNUNET_log_setup(), GNUNET_OK, GNUNET_PROGRAM_run(), GNUNET_STRINGS_get_utf8_args(), GNUNET_TIME_UNIT_FOREVER_REL, lookup_name, lookup_type, raw, ret, run(), and timeout.

332 {
337  "lookup",
338  "NAME",
339  gettext_noop (
340  "Lookup a record for the given name"),
341  &lookup_name)),
343  "type",
344  "TYPE",
345  gettext_noop (
346  "Specify the type of the record to lookup"),
347  &lookup_type),
349  "timeout",
350  "TIMEOUT",
351  gettext_noop (
352  "Specify a timeout for the lookup"),
353  &timeout),
355  "raw",
356  gettext_noop ("No unneeded output"),
357  &raw),
359  "dns",
360  gettext_noop (
361  "DNS Compatibility: Name is passed in IDNA instead of UTF-8"),
362  &dns_compat),
364  int ret;
365 
366  if (GNUNET_OK !=
367  GNUNET_STRINGS_get_utf8_args (argc, argv,
368  &argc, &argv))
369  return 2;
370 
371  GNUNET_log_setup ("gnunet-gns", "WARNING", NULL);
372  ret = GNUNET_PROGRAM_run (argc,
373  argv,
374  "gnunet-gns",
375  _ ("GNUnet GNS resolver tool"),
376  options,
377  &run,
378  NULL);
379  GNUNET_free_nz ((void *) argv);
380  if (GNUNET_OK != ret)
381  return 1;
382  return global_ret;
383 }
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_relative_time(char shortName, const char *name, const char *argumentHelp, const char *description, struct GNUNET_TIME_Relative *val)
Allow user to specify a struct GNUNET_TIME_Relative (using human-readable "fancy" time)...
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c)
Main function that will be run.
Definition: gnunet-gns.c:228
static int raw
raw output
Definition: gnunet-gns.c:79
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
int GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1458
static int dns_compat
DNS compatibility (name is given as DNS name, possible IDNA).
Definition: gnunet-gns.c:69
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
Definition of a command line option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
static struct GNUNET_TIME_Relative timeout
Timeout for lookup.
Definition: gnunet-gns.c:89
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_mandatory(struct GNUNET_GETOPT_CommandLineOption opt)
Make the given option mandatory.
#define GNUNET_free_nz(ptr)
Wrapper around free.
static char * lookup_name
GNS name to lookup.
Definition: gnunet-gns.c:59
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
int GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options).
Definition: program.c:367
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
static char * lookup_type
record type to look up (-t option)
Definition: gnunet-gns.c:74
#define gettext_noop(String)
Definition: gettext.h:69
static int global_ret
Global return value.
Definition: gnunet-gns.c:108
Here is the call graph for this function:

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Configuration we are using.

Definition at line 49 of file gnunet-gns.c.

◆ gns

struct GNUNET_GNS_Handle* gns
static

Handle to GNS service.

Definition at line 54 of file gnunet-gns.c.

◆ lookup_name

char* lookup_name
static

GNS name to lookup.

(-u option)

Definition at line 59 of file gnunet-gns.c.

Referenced by main(), and run().

◆ idna_name

char* idna_name

DNS IDNA name to lookup.

(set if -d option is set)

Definition at line 64 of file gnunet-gns.c.

Referenced by do_shutdown(), GNUNET_DNSPARSER_builder_add_name(), and run().

◆ dns_compat

int dns_compat
static

DNS compatibility (name is given as DNS name, possible IDNA).

Definition at line 69 of file gnunet-gns.c.

Referenced by main(), and run().

◆ lookup_type

char* lookup_type
static

record type to look up (-t option)

Definition at line 74 of file gnunet-gns.c.

Referenced by main(), and run().

◆ raw

int raw
static

◆ rtype

uint32_t rtype
static

Desired record type.

Definition at line 84 of file gnunet-gns.c.

Referenced by process_lookup_result(), and run().

◆ timeout

struct GNUNET_TIME_Relative timeout
static

Timeout for lookup.

Definition at line 89 of file gnunet-gns.c.

Referenced by main(), and run().

◆ to_task

struct GNUNET_SCHEDULER_Task* to_task
static

Timeout task.

Definition at line 94 of file gnunet-gns.c.

◆ lr

Handle to lookup request.

Definition at line 99 of file gnunet-gns.c.

Referenced by db_read_whitelist(), GNUNET_GNS_lookup_limited(), and handle_result().

◆ global_ret

int global_ret
static

Global return value.

0 on success (default), 1 on internal failures 2 on launch failure, 4 if the name is not a GNS-supported TLD,

Definition at line 108 of file gnunet-gns.c.

Referenced by do_timeout(), main(), process_lookup_result(), and run().