GNUnet 0.28.1-dev.4-46-g92a0edb0d
 
Loading...
Searching...
No Matches
gnunet-gns.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2012-2013, 2017-2018 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
25#include "platform.h"
26#if HAVE_LIBIDN2
27#if HAVE_IDN2_H
28#include <idn2.h>
29#elif HAVE_IDN2_IDN2_H
30#include <idn2/idn2.h>
31#endif
32#elif HAVE_LIBIDN
33#if HAVE_IDNA_H
34#include <idna.h>
35#elif HAVE_IDN_IDNA_H
36#include <idn/idna.h>
37#endif
38#endif
39#include <gnunet_util_lib.h>
42#include <gnunet_gns_service.h>
43
44
48static const struct GNUNET_CONFIGURATION_Handle *cfg;
49
53static struct GNUNET_GNS_Handle *gns;
54
58static char *lookup_name;
59
64
68static int dns_compat;
69
73static char *lookup_type;
74
78static int raw;
79
83static uint32_t rtype;
84
89
94
99
107static int global_ret;
108
112static const char spinner[] = {'|', '/', '-', '\\'};
113
118
123
124static void
125spin (void *cls)
126{
127 static int i = 0;
128 printf ("%c\rResolving... ", spinner[i++ % sizeof spinner]);
129 fflush (stdout);
132 ),
133 &spin,
134 NULL);
135}
136
137
143static void
144do_shutdown (void *cls)
145{
146 (void) cls;
147 if (NULL != t_spinner)
148 {
149 printf ("\nResolution cancelled after %s\n",
152 GNUNET_YES));
154 t_spinner = NULL;
155 }
156 if (NULL != to_task)
157 {
159 to_task = NULL;
160 }
161 if (NULL != lr)
162 {
164 lr = NULL;
165 }
166 if (NULL != gns)
167 {
169 gns = NULL;
170 }
171 if (NULL != idna_name)
172 {
174 idna_name = NULL;
175 }
176}
177
178
184static void
185do_timeout (void*cls)
186{
187 to_task = NULL;
188 global_ret = 3; // Timeout
190}
191
192
201static void
203 int was_gns,
204 uint32_t rd_count,
205 const struct GNUNET_GNSRECORD_Data *rd)
206{
207 struct GNUNET_TIME_Relative block_exp;
208 const char *typename;
209 char *string_val;
210
211 lr = NULL;
213 t_spinner = NULL;
214 if (GNUNET_NO == was_gns)
215 {
216 global_ret = 4; /* not for GNS */
218 return;
219 }
222 rd_count,
223 rd,
225 if (! raw)
226 {
227 printf ("\r<<< %u record(s) found:\n\n", rd_count);
228 }
229 for (uint32_t i = 0; i < rd_count; i++)
230 {
232 record_type);
233 string_val = GNUNET_GNSRECORD_value_to_string (rd[i].record_type
234 ,
235 rd[i].data,
236 rd[i].data_size);
237 if (NULL == string_val)
238 {
239 fprintf (stderr,
240 "Record %u of type %d malformed, skipping\n",
241 (unsigned int) i,
242 (int) rd[i].record_type);
243 continue;
244 }
245 if (raw)
246 printf ("%s\n", string_val);
247 else
248 printf ("%s: `%s' %s\n",
249 typename,
250 string_val,
251 (0 != (rd[i].flags
252 &
254 ) ?
255 "(supplemental)" : "");
256 GNUNET_free (string_val);
257 }
258 if (! raw)
259 {
260 printf ("\nResolution finished after %s\n",
263 GNUNET_YES));
264 if (0 != rd_count)
265 printf ("Record set expires in %s.\n",
267 block_exp, GNUNET_YES));
268 }
270}
271
272
281static void
282run (void *cls,
283 char *const *args,
284 const char *cfgfile,
285 const struct GNUNET_CONFIGURATION_Handle *c)
286{
287 const char *effective_lookup_type;
288 (void) cls;
289 (void) args;
290 (void) cfgfile;
291
292 cfg = c;
293 to_task = NULL;
294 {
295 char *colon;
296
297 if (NULL != (colon = strchr (lookup_name, ':')))
298 *colon = '\0';
299 }
300
305 if (GNUNET_YES == dns_compat)
306 {
307 Idna_rc rc;
308
310 {
311 fprintf (stderr,
312 _ ("`%s' is not a valid DNS domain name\n"),
314 global_ret = 3;
315 return;
316 }
317 if (IDNA_SUCCESS !=
318 (rc = idna_to_unicode_8z8z (lookup_name, &idna_name,
319 IDNA_ALLOW_UNASSIGNED)))
320 {
321 fprintf (stderr,
322 _ (
323 "Failed to convert DNS IDNA name `%s' to UTF-8: %s\n"),
325 idna_strerror (rc));
326 global_ret = 4;
327 return;
328 }
330 }
331
332 if (GNUNET_YES !=
334 "arm"))
335 {
337 _ (
338 "Cannot resolve using GNS: GNUnet peer not running\n"));
339 global_ret = 5;
340 return;
341 }
343 &do_timeout,
344 NULL);
346 if (NULL == gns)
347 {
348 fprintf (stderr,
349 _ ("Failed to connect to GNS\n"));
350 global_ret = 2;
351 return;
352 }
354 NULL);
355 if (NULL != lookup_type)
356 {
357 effective_lookup_type = lookup_type;
359 }
360 else
361 {
362 effective_lookup_type = "A";
364 }
365 if (UINT32_MAX == rtype)
366 {
367 fprintf (stderr,
368 _ ("Invalid typename specified, assuming `ANY'\n"));
370 }
371 if (! raw)
372 {
373 printf (">>> Looking for `%s' records under `%s'\n",
374 effective_lookup_type, lookup_name);
375 }
380 rtype,
384 if (NULL == lr)
385 {
386 global_ret = 2;
389 return;
390 }
391}
392
393
401int
402main (int argc, char *const *argv)
403{
407 "lookup",
408 "NAME",
410 "Lookup a record for the given name"),
411 &lookup_name)),
413 "type",
414 "TYPE",
416 "Specify the type of the record to lookup"),
417 &lookup_type),
419 "timeout",
420 "TIMEOUT",
422 "Specify a timeout for the lookup"),
423 &timeout),
425 "raw",
426 gettext_noop ("No unneeded output"),
427 &raw),
429 "dns",
431 "DNS Compatibility: Name is passed in IDNA instead of UTF-8"),
432 &dns_compat),
434 int ret;
436
437 GNUNET_log_setup ("gnunet-gns", "WARNING", NULL);
439 argc,
440 argv,
441 "gnunet-gns",
442 _ ("GNUnet GNS resolver tool"),
443 options,
444 &run,
445 NULL);
446 if (GNUNET_OK != ret)
447 return 1;
448 return global_ret;
449}
450
451
452/* end of gnunet-gns.c */
struct GNUNET_GETOPT_CommandLineOption options[]
Definition 002.c:5
int main()
Program to simulate results from GCP_get_desirability_of_path() for various plausible inputs.
#define gettext_noop(String)
Definition gettext.h:74
static int ret
Final status code.
Definition gnunet-arm.c:93
static int do_shutdown
Set to GNUNET_YES if we are shutting down.
static char * data
The data to insert into the dht.
static struct GNUNET_GNS_Handle * gns
Handle to GNS service.
Definition gnunet-gns.c:53
static int raw
raw output
Definition gnunet-gns.c:78
static const char spinner[]
Spinner.
Definition gnunet-gns.c:112
static void do_timeout(void *cls)
Task to run on timeout.
Definition gnunet-gns.c:185
static char * lookup_name
GNS name to lookup.
Definition gnunet-gns.c:58
static int global_ret
Global return value.
Definition gnunet-gns.c:107
struct GNUNET_TIME_Absolute res_start
Resolution start.
Definition gnunet-gns.c:122
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition gnunet-gns.c:48
static void spin(void *cls)
Definition gnunet-gns.c:125
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:282
static struct GNUNET_SCHEDULER_Task * t_spinner
Spinner task.
Definition gnunet-gns.c:117
static int dns_compat
DNS compatibility (name is given as DNS name, possible IDNA).
Definition gnunet-gns.c:68
static struct GNUNET_TIME_Relative timeout
Timeout for lookup.
Definition gnunet-gns.c:88
static struct GNUNET_SCHEDULER_Task * to_task
Timeout task.
Definition gnunet-gns.c:93
char * idna_name
DNS IDNA name to lookup.
Definition gnunet-gns.c:63
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:202
static char * lookup_type
record type to look up (-t option)
Definition gnunet-gns.c:73
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition gnunet-gns.c:98
static uint32_t rtype
Desired record type.
Definition gnunet-gns.c:83
static unsigned int rd_count
Number of records for currently parsed set.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
static size_t data_size
Number of bytes in data.
API to the GNS service.
API that can be used to manipulate GNS record data.
API that can be used to store naming information on a GNUnet node;.
enum GNUNET_GenericReturnValue 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:1006
#define GNUNET_DNSPARSER_TYPE_A
enum GNUNET_GenericReturnValue 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
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_mandatory(struct GNUNET_GETOPT_CommandLineOption opt)
Make the given option mandatory.
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).
#define GNUNET_GETOPT_OPTION_END
Marker for the end of the list of options.
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.
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.
void GNUNET_GNS_disconnect(struct GNUNET_GNS_Handle *handle)
Shutdown connection with the GNS service.
Definition gns_api.c:289
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 ...
void * GNUNET_GNS_lookup_with_tld_cancel(struct GNUNET_GNS_LookupWithTldRequest *ltr)
Cancel pending lookup request.
struct GNUNET_GNS_Handle * GNUNET_GNS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Initialize the connection with the GNS service.
Definition gns_api.c:267
@ GNUNET_GNS_LO_DEFAULT
Defaults, look in cache, then in DHT.
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number to the corresponding type string (e.g.
Definition gnsrecord.c:219
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (e.g.
Definition gnsrecord.c:192
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_record_get_expiration_time(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, struct GNUNET_TIME_Absolute min)
Returns the expiration time of the given block of records.
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/'*'.
char * GNUNET_GNSRECORD_value_to_string(uint32_t type, const void *data, size_t data_size)
Convert the binary value data of a record of type type to a human-readable string.
Definition gnsrecord.c:147
@ GNUNET_GNSRECORD_RF_SUPPLEMENTAL
This is a supplemental record.
#define GNUNET_log(kind,...)
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
enum GNUNET_GenericReturnValue GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
@ GNUNET_ERROR_TYPE_WARNING
#define GNUNET_free(ptr)
Wrapper around free.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(const struct GNUNET_OS_ProjectData *pd, 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,...
Definition program.c:406
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition scheduler.c:572
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,...
Definition scheduler.c:1345
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
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:1310
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:1283
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
Definition time.c:438
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:406
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition strings.c:610
#define GNUNET_TIME_UNIT_MILLISECONDS
One millisecond.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
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:486
#define GNUNET_TIME_UNIT_ZERO_ABS
Absolute time zero.
#define _(String)
GNU gettext support macro.
Definition platform.h:179
Definition of a command line option.
Connection to the GNS service.
Definition gns_api.h:36
Handle to a lookup request.
Definition gns_tld_api.c:45
Entry in list of pending tasks.
Definition scheduler.c:141
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.