2 This file is part of GNUnet.
3 Copyright (C) 2012-2013, 2017-2018 GNUnet e.V.
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
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 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
22 * @brief command line tool to access distributed GNS
23 * @author Christian Grothoff
26 #include <gnunet_util_lib.h>
27 #include <gnunet_dnsparser_lib.h>
28 #include <gnunet_gnsrecord_lib.h>
29 #include <gnunet_namestore_service.h>
30 #include <gnunet_gns_service.h>
33 * Configuration we are using.
35 static const struct GNUNET_CONFIGURATION_Handle *cfg;
38 * Handle to GNS service.
40 static struct GNUNET_GNS_Handle *gns;
43 * GNS name to lookup. (-u option)
45 static char *lookup_name;
48 * record type to look up (-t option)
50 static char *lookup_type;
53 * Set to GNUNET_GNS_LO_LOCAL_MASTER if we are looking up in the master zone.
55 static enum GNUNET_GNS_LocalOptions local_options;
63 * Desired record type.
65 static uint32_t rtype;
68 * Handle to lookup request
70 static struct GNUNET_GNS_LookupWithTldRequest *lr;
73 * Global return value.
74 * 0 on success (default),
75 * 1 on internal failures, 2 on launch failure,
76 * 3 if the name is not a GNS-supported TLD,
78 static int global_ret;
82 * Task run on shutdown. Cleans up everything.
87 do_shutdown (void *cls)
92 GNUNET_GNS_lookup_with_tld_cancel (lr);
97 GNUNET_GNS_disconnect (gns);
104 * Function called with the result of a GNS lookup.
106 * @param cls the 'const char *' name that was resolved
107 * @param was_gns #GNUNET_NO if TLD did not indicate use of GNS
108 * @param rd_count number of records returned
109 * @param rd array of @a rd_count records with the results
112 process_lookup_result (void *cls,
115 const struct GNUNET_GNSRECORD_Data *rd)
117 const char *name = cls;
118 const char *typename;
122 if (GNUNET_NO == was_gns)
125 GNUNET_SCHEDULER_shutdown ();
131 printf ("No results.\n");
136 for (uint32_t i=0; i<rd_count; i++)
138 if ( (rd[i].record_type != rtype) &&
139 (GNUNET_GNSRECORD_TYPE_ANY != rtype) )
141 typename = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
142 string_val = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
145 if (NULL == string_val)
148 "Record %u of type %d malformed, skipping\n",
150 (int) rd[i].record_type);
157 printf ("Got `%s' record: %s\n",
160 GNUNET_free (string_val);
162 GNUNET_SCHEDULER_shutdown ();
167 * Main function that will be run.
170 * @param args remaining command-line arguments
171 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
172 * @param c configuration
178 const struct GNUNET_CONFIGURATION_Handle *c)
185 gns = GNUNET_GNS_connect (cfg);
189 _("Failed to connect to GNS\n"));
194 GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
197 if (NULL != lookup_type)
198 rtype = GNUNET_GNSRECORD_typename_to_number (lookup_type);
200 rtype = GNUNET_DNSPARSER_TYPE_A;
201 if (UINT32_MAX == rtype)
204 _("Invalid typename specified, assuming `ANY'\n"));
205 rtype = GNUNET_GNSRECORD_TYPE_ANY;
207 lr = GNUNET_GNS_lookup_with_tld (gns,
211 &process_lookup_result,
216 GNUNET_SCHEDULER_shutdown ();
223 * The main function for gnunet-gns.
225 * @param argc number of arguments from the command line
226 * @param argv command line arguments
227 * @return 0 ok, 1 on error
233 struct GNUNET_GETOPT_CommandLineOption options[] = {
234 GNUNET_GETOPT_option_mandatory
235 (GNUNET_GETOPT_option_string ('u',
238 gettext_noop ("Lookup a record for the given name"),
240 GNUNET_GETOPT_option_string ('t',
243 gettext_noop ("Specify the type of the record to lookup"),
245 GNUNET_GETOPT_option_flag ('r',
247 gettext_noop ("No unneeded output"),
249 GNUNET_GETOPT_OPTION_END
254 GNUNET_STRINGS_get_utf8_args (argc, argv,
258 GNUNET_log_setup ("gnunet-gns",
261 ret = GNUNET_PROGRAM_run (argc, argv,
263 _("GNUnet GNS resolver tool"),
266 GNUNET_free ((void*) argv);
267 if (GNUNET_OK != ret)
272 /* end of gnunet-gns.c */