/* This file is part of GNUnet. Copyright (C) 2012-2013, 2017 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; /** * Identity of the zone to use for the lookup (-z option) */ static char *zone_ego_name; /** * Public key of the zone to use for the lookup (-p option) */ static char *public_key; /** * 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; /** * 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 (); } /** * 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; uint32_t i; 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 (i=0; i 4) && (0 == strcmp (".zkey", &lookup_name[strlen (lookup_name) - 4])) ) { /* no zone required, use 'anonymous' zone */ GNUNET_CRYPTO_ecdsa_key_get_public (GNUNET_CRYPTO_ecdsa_key_get_anonymous (), &pkey); lookup_with_public_key (&pkey); } else { GNUNET_break (NULL == id_op); id_op = GNUNET_IDENTITY_get (identity, "gns-master", &identity_master_cb, NULL); GNUNET_assert (NULL != id_op); } } /** * The main function for gnunet-gns. * * @param argc number of arguments from the command line * @param argv command line arguments * @return 0 ok, 1 on error */ int main (int argc, char *const *argv) { struct GNUNET_GETOPT_CommandLineOption options[] = { GNUNET_GETOPT_option_string ('u', "lookup", "NAME", gettext_noop ("Lookup a record for the given name"), &lookup_name), GNUNET_GETOPT_option_string ('t', "type", "TYPE", gettext_noop ("Specify the type of the record to lookup"), &lookup_type), GNUNET_GETOPT_option_relative_time ('T', "timeout", "DELAY", gettext_noop ("Specify timeout for the lookup"), &timeout), GNUNET_GETOPT_option_flag ('r', "raw", gettext_noop ("No unneeded output"), &raw), GNUNET_GETOPT_option_string ('p', "public-key", "PKEY", gettext_noop ("Specify the public key of the zone to lookup the record in"), &public_key), GNUNET_GETOPT_option_string ('z', "zone", "NAME", gettext_noop ("Specify the name of the ego of the zone to lookup the record in"), &zone_ego_name), GNUNET_GETOPT_OPTION_END }; int ret; timeout = GNUNET_TIME_UNIT_FOREVER_REL; if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) return 2; GNUNET_log_setup ("gnunet-gns", "WARNING", NULL); ret = (GNUNET_OK == GNUNET_PROGRAM_run (argc, argv, "gnunet-gns", _("GNUnet GNS resolver tool"), options, &run, NULL)) ? 0 : 1; GNUNET_free ((void*) argv); return ret; } /* end of gnunet-gns.c */