/* This file is part of GNUnet. Copyright (C) 2012-2013, 2017-2018 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /** * @file gnunet-gns.c * @brief command line tool to access distributed GNS * @author Christian Grothoff */ #include "platform.h" #include #include #include #include #include #include /** * Configuration we are using. */ static const struct GNUNET_CONFIGURATION_Handle *cfg; /** * Handle to GNS service. */ static struct GNUNET_GNS_Handle *gns; /** * Desired timeout for the lookup (default is no timeout). */ static struct GNUNET_TIME_Relative timeout; /** * GNS name to lookup. (-u option) */ static char *lookup_name; /** * record type to look up (-t option) */ static char *lookup_type; /** * Set to GNUNET_GNS_LO_LOCAL_MASTER if we are looking up in the master zone. */ static enum GNUNET_GNS_LocalOptions local_options; /** * raw output */ static int raw; /** * Requested record type. */ static int rtype; /** * Handle to lookup request */ static struct GNUNET_GNS_LookupRequest *lookup_request; /** * Lookup an ego with the identity service. */ static struct GNUNET_IDENTITY_EgoLookup *el; /** * Handle for identity service. */ static struct GNUNET_IDENTITY_Handle *identity; /** * Active operation on identity service. */ static struct GNUNET_IDENTITY_Operation *id_op; /** * Task scheduled to handle timeout. */ static struct GNUNET_SCHEDULER_Task *tt; /** * Global return value. * 0 on success (default), * 1 on internal failures, 2 on launch failure, * 3 if the name is not a GNS-supported TLD, * 4 on timeout */ static int global_ret; /** * Task run on shutdown. Cleans up everything. * * @param cls unused */ static void do_shutdown (void *cls) { if (NULL != el) { GNUNET_IDENTITY_ego_lookup_cancel (el); el = NULL; } if (NULL != id_op) { GNUNET_IDENTITY_cancel (id_op); id_op = NULL; } if (NULL != lookup_request) { GNUNET_GNS_lookup_cancel (lookup_request); lookup_request = NULL; } if (NULL != identity) { GNUNET_IDENTITY_disconnect (identity); identity = NULL; } if (NULL != gns) { GNUNET_GNS_disconnect (gns); gns = NULL; } if (NULL != tt) { GNUNET_SCHEDULER_cancel (tt); tt = NULL; } } /** * Task run on timeout. Triggers shutdown. * * @param cls unused */ static void do_timeout (void *cls) { tt = NULL; GNUNET_SCHEDULER_shutdown (); global_ret = 4; } /** * Function called with the result of a GNS lookup. * * @param cls the 'const char *' name that was resolved * @param rd_count number of records returned * @param rd array of @a rd_count records with the results */ static void process_lookup_result (void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd) { const char *name = cls; const char *typename; char* string_val; lookup_request = NULL; if (!raw) { if (0 == rd_count) printf ("No results.\n"); else printf ("%s:\n", name); } for (uint32_t i=0; i