GNUnet  0.10.x
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 #include <gnunet_util_lib.h>
27 #include <gnunet_dnsparser_lib.h>
28 #include <gnunet_gnsrecord_lib.h>
30 #include <gnunet_gns_service.h>
31 
35 static const struct GNUNET_CONFIGURATION_Handle *cfg;
36 
40 static struct GNUNET_GNS_Handle *gns;
41 
45 static char *lookup_name;
46 
50 static char *lookup_type;
51 
55 static int raw;
56 
60 static uint32_t rtype;
61 
66 
71 
76 
84 static int global_ret;
85 
86 
92 static void
93 do_shutdown(void *cls)
94 {
95  (void)cls;
96  if (NULL != to_task)
97  {
98  GNUNET_SCHEDULER_cancel(to_task);
99  to_task = NULL;
100  }
101  if (NULL != lr)
102  {
104  lr = NULL;
105  }
106  if (NULL != gns)
107  {
109  gns = NULL;
110  }
111 }
112 
118 static void
119 do_timeout(void* cls)
120 {
121  to_task = NULL;
122  global_ret = 3; //Timeout
124 }
125 
134 static void
136  int was_gns,
137  uint32_t rd_count,
138  const struct GNUNET_GNSRECORD_Data *rd)
139 {
140  const char *name = cls;
141  const char *typename;
142  char *string_val;
143 
144  lr = NULL;
145  if (GNUNET_NO == was_gns)
146  {
147  global_ret = 4; /* not for GNS */
149  return;
150  }
151  if (!raw)
152  {
153  if (0 == rd_count)
154  printf("No results.\n");
155  else
156  printf("%s:\n", name);
157  }
158  for (uint32_t i = 0; i < rd_count; i++)
159  {
160  if ((rd[i].record_type != rtype) && (GNUNET_GNSRECORD_TYPE_ANY != rtype))
161  continue;
162  typename = GNUNET_GNSRECORD_number_to_typename(rd[i].record_type);
163  string_val = GNUNET_GNSRECORD_value_to_string(rd[i].record_type,
164  rd[i].data,
165  rd[i].data_size);
166  if (NULL == string_val)
167  {
168  fprintf(stderr,
169  "Record %u of type %d malformed, skipping\n",
170  (unsigned int)i,
171  (int)rd[i].record_type);
172  continue;
173  }
174  if (raw)
175  printf("%s\n", string_val);
176  else
177  printf("Got `%s' record: %s\n", typename, string_val);
178  GNUNET_free(string_val);
179  }
181 }
182 
183 
192 static void
193 run(void *cls,
194  char *const *args,
195  const char *cfgfile,
196  const struct GNUNET_CONFIGURATION_Handle *c)
197 {
198  (void)cls;
199  (void)args;
200  (void)cfgfile;
201 
202  cfg = c;
203  to_task = NULL;
205  {
206  fprintf(stderr, _("`%s' is not a valid domain name\n"), lookup_name);
207  global_ret = 3;
208  return;
209  }
211  gns = GNUNET_GNS_connect(cfg);
212  if (NULL == gns)
213  {
214  fprintf(stderr, _("Failed to connect to GNS\n"));
215  global_ret = 2;
216  return;
217  }
219  if (NULL != lookup_type)
221  else
223  if (UINT32_MAX == rtype)
224  {
225  fprintf(stderr, _("Invalid typename specified, assuming `ANY'\n"));
227  }
229  lookup_name,
230  rtype,
233  lookup_name);
234  if (NULL == lr)
235  {
236  global_ret = 2;
238  return;
239  }
240 }
241 
242 
250 int
251 main(int argc, char *const *argv)
252 {
254  struct GNUNET_GETOPT_CommandLineOption options[] =
257  "lookup",
258  "NAME",
259  gettext_noop(
260  "Lookup a record for the given name"),
261  &lookup_name)),
263  "type",
264  "TYPE",
265  gettext_noop(
266  "Specify the type of the record to lookup"),
267  &lookup_type),
269  "timeout",
270  "TIMEOUT",
271  gettext_noop(
272  "Specify a timeout for the lookup"),
273  &timeout),
275  "raw",
276  gettext_noop("No unneeded output"),
277  &raw),
279  int ret;
280 
281  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args(argc, argv, &argc, &argv))
282  return 2;
283 
284  GNUNET_log_setup("gnunet-gns", "WARNING", NULL);
285  ret = GNUNET_PROGRAM_run(argc,
286  argv,
287  "gnunet-gns",
288  _("GNUnet GNS resolver tool"),
289  options,
290  &run,
291  NULL);
292  GNUNET_free((void *)argv);
293  if (GNUNET_OK != ret)
294  return 1;
295  return global_ret;
296 }
297 
298 /* end of gnunet-gns.c */
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)...
Connection to the GNS service.
Definition: gns_api.h:35
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:193
static int raw
raw output
Definition: gnunet-gns.c:55
static struct GNUNET_GNS_LookupWithTldRequest * lr
Handle to lookup request.
Definition: gnunet-gns.c:75
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:1284
void * GNUNET_GNS_lookup_with_tld_cancel(struct GNUNET_GNS_LookupWithTldRequest *ltr)
Cancel pending lookup request.
Definition: gns_tld_api.c:328
int GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1439
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (i.e.
Definition: gnsrecord.c:203
int main(int argc, char *const *argv)
The main function for gnunet-gns.
Definition: gnunet-gns.c:251
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/&#39;*&#39;.
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:240
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Definition of a command line option.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:517
static int ret
Final status code.
Definition: gnunet-arm.c:89
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:181
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
static struct GNUNET_TIME_Relative timeout
Timeout for lookup.
Definition: gnunet-gns.c:65
static struct GNUNET_GNS_Handle * gns
Handle to GNS service.
Definition: gnunet-gns.c:40
void GNUNET_GNS_disconnect(struct GNUNET_GNS_Handle *handle)
Shutdown connection with the GNS service.
Definition: gns_api.c:282
#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.
struct GNUNET_GNS_Handle * GNUNET_GNS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Initialize the connection with the GNS service.
Definition: gns_api.c:260
static struct GNUNET_SCHEDULER_Task * to_task
Timeout task.
Definition: gnunet-gns.c:70
static void do_shutdown(void *cls)
Task run on shutdown.
Definition: gnunet-gns.c:93
static void do_timeout(void *cls)
Task to run on timeout.
Definition: gnunet-gns.c:119
const char * name
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:45
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:135
configuration data
Definition: configuration.c:83
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.
Entry in list of pending tasks.
Definition: scheduler.c:131
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
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-gns.c:35
Defaults, look in cache, then in DHT.
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
Handle to a lookup request.
Definition: gns_tld_api.c:44
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:142
static size_t data_size
Number of bytes in data.
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number (i.e.
Definition: gnsrecord.c:230
static uint32_t rtype
Desired record type.
Definition: gnunet-gns.c:60
#define GNUNET_DNSPARSER_TYPE_A
#define GNUNET_free(ptr)
Wrapper around free.
static char * lookup_type
record type to look up (-t option)
Definition: gnunet-gns.c:50
Time for relative time used by GNUnet, in microseconds.
#define gettext_noop(String)
Definition: gettext.h:69
static int global_ret
Global return value.
Definition: gnunet-gns.c:84
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956