[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [gnunet] branch master updated: add convenience API to gnun
From: |
gnunet |
Subject: |
[GNUnet-SVN] [gnunet] branch master updated: add convenience API to gnunetgns lib |
Date: |
Mon, 05 Mar 2018 20:00:37 +0100 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository gnunet.
The following commit(s) were added to refs/heads/master by this push:
new 0f4032609 add convenience API to gnunetgns lib
0f4032609 is described below
commit 0f4032609d5372978e0c038ee05f51ce9c131876
Author: Christian Grothoff <address@hidden>
AuthorDate: Mon Mar 5 20:00:21 2018 +0100
add convenience API to gnunetgns lib
---
doc/man/gnunet-gns.1 | 5 +-
po/POTFILES.in | 1 +
src/gns/Makefile.am | 5 +-
src/gns/gns_api.c | 52 +------
src/gns/gnunet-gns.c | 290 ++++++---------------------------------
src/include/gnunet_gns_service.h | 54 ++++++++
6 files changed, 106 insertions(+), 301 deletions(-)
diff --git a/doc/man/gnunet-gns.1 b/doc/man/gnunet-gns.1
index a6f27479a..4d52cfa97 100644
--- a/doc/man/gnunet-gns.1
+++ b/doc/man/gnunet-gns.1
@@ -32,9 +32,6 @@ Use LOGLEVEL for logging. Valid values are DEBUG, INFO,
WARNING and ERROR.
Name to lookup.
Resolve the specified name using the GNU Name System.
.B
-.IP "\-T DELAY, \-\-timeout=DELAY"
-Set the timeout to DELAY. By default, gnunet\-gns will continue to try to
resolve the name until there is a definitive answer or until the user aborts
with CTRL\-C.
-.B
.IP "\-t TYPE, \-\-type=TYPE"
Resource Record Type (TYPE) to look for.
Supported TYPE's are: A, AAAA, CNAME, NS, PKEY, PSEU, TLSA, SRV, SOA, MX,
LEHO, VPN, REV, PTR, TXT
@@ -48,7 +45,7 @@ Print GNUnet version number.
.SH RETURN VALUE
gnunet\-gns will return 0 on success, 1 on internal failures, 2 on launch
failures,
-3 if the given name is not configured to use GNS, and 4 on timeout.
+3 if the given name is not configured to use GNS.
.SH BUGS
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 6ceb95cbd..5804b980c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -168,6 +168,7 @@ src/fs/gnunet-service-fs_put.c
src/fs/gnunet-unindex.c
src/fs/plugin_block_fs.c
src/gns/gns_api.c
+src/gns/gns_tld_api.c
src/gns/gnunet-bcd.c
src/gns/gnunet-dns2gns.c
src/gns/gnunet-gns.c
diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am
index e89192414..57b096b96 100644
--- a/src/gns/Makefile.am
+++ b/src/gns/Makefile.am
@@ -111,7 +111,6 @@ gnunet_gns_SOURCES = \
gnunet_gns_LDADD = \
libgnunetgns.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
- $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBINTL)
@@ -214,9 +213,11 @@ libw32nsp_la_LDFLAGS = \
-no-undefined -static-libgcc
libgnunetgns_la_SOURCES = \
- gns_api.c gns.h
+ gns_api.c gns_api.h \
+ gns_tld_api.c gns.h
libgnunetgns_la_LIBADD = \
$(top_builddir)/src/util/libgnunetutil.la $(XLIB) \
+ $(top_builddir)/src/identity/libgnunetidentity.la \
$(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la
libgnunetgns_la_LDFLAGS = \
$(GN_LIB_LDFLAGS)
diff --git a/src/gns/gns_api.c b/src/gns/gns_api.c
index 84c4ae189..ff67f0205 100644
--- a/src/gns/gns_api.c
+++ b/src/gns/gns_api.c
@@ -1,6 +1,6 @@
/*
This file is part of GNUnet.
- Copyright (C) 2009-2013, 2016 GNUnet e.V.
+ Copyright (C) 2009-2013, 2016, 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
@@ -31,7 +31,7 @@
#include "gnunet_protocols.h"
#include "gnunet_dht_service.h"
#include "gns.h"
-#include "gnunet_gns_service.h"
+#include "gns_api.h"
#define LOG(kind,...) GNUNET_log_from (kind, "gns-api",__VA_ARGS__)
@@ -81,50 +81,6 @@ struct GNUNET_GNS_LookupRequest
/**
- * Connection to the GNS service.
- */
-struct GNUNET_GNS_Handle
-{
-
- /**
- * Configuration to use.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Connection to service (if available).
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Head of linked list of active lookup requests.
- */
- struct GNUNET_GNS_LookupRequest *lookup_head;
-
- /**
- * Tail of linked list of active lookup requests.
- */
- struct GNUNET_GNS_LookupRequest *lookup_tail;
-
- /**
- * Reconnect task
- */
- struct GNUNET_SCHEDULER_Task *reconnect_task;
-
- /**
- * How long do we wait until we try to reconnect?
- */
- struct GNUNET_TIME_Relative reconnect_backoff;
-
- /**
- * Request Id generator. Incremented by one for each request.
- */
- uint32_t r_id_gen;
-
-};
-
-
-/**
* Reconnect to GNS service.
*
* @param handle the handle to the GNS service
@@ -201,7 +157,8 @@ check_result (void *cls,
size_t mlen = ntohs (lookup_msg->header.size) - sizeof (*lookup_msg);
uint32_t rd_count = ntohl (lookup_msg->rd_count);
struct GNUNET_GNSRECORD_Data rd[rd_count];
-
+
+ (void) cls;
if (GNUNET_SYSERR ==
GNUNET_GNSRECORD_records_deserialize (mlen,
(const char*) &lookup_msg[1],
@@ -423,4 +380,5 @@ GNUNET_GNS_lookup (struct GNUNET_GNS_Handle *handle,
return lr;
}
+
/* end of gns_api.c */
diff --git a/src/gns/gnunet-gns.c b/src/gns/gnunet-gns.c
index 202e02a50..32cfba5bb 100644
--- a/src/gns/gnunet-gns.c
+++ b/src/gns/gnunet-gns.c
@@ -25,7 +25,6 @@
#include "platform.h"
#include <gnunet_util_lib.h>
#include <gnunet_dnsparser_lib.h>
-#include <gnunet_identity_service.h>
#include <gnunet_gnsrecord_lib.h>
#include <gnunet_namestore_service.h>
#include <gnunet_gns_service.h>
@@ -41,11 +40,6 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
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;
@@ -66,41 +60,20 @@ static enum GNUNET_GNS_LocalOptions local_options;
static int raw;
/**
- * Requested record type.
+ * Desired record type.
*/
-static int rtype;
+static uint32_t 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;
+static struct GNUNET_GNS_LookupWithTldRequest *lr;
/**
* 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;
@@ -113,50 +86,17 @@ static int global_ret;
static void
do_shutdown (void *cls)
{
- if (NULL != el)
+ (void) cls;
+ if (NULL != lr)
{
- 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;
+ GNUNET_GNS_lookup_with_tld_cancel (lr);
+ lr = 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;
}
@@ -164,11 +104,13 @@ do_timeout (void *cls)
* Function called with the result of a GNS lookup.
*
* @param cls the 'const char *' name that was resolved
+ * @param was_gns #GNUNET_NO if TLD did not indicate use of GNS
* @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,
+ int was_gns,
uint32_t rd_count,
const struct GNUNET_GNSRECORD_Data *rd)
{
@@ -176,8 +118,14 @@ process_lookup_result (void *cls,
const char *typename;
char* string_val;
- lookup_request = NULL;
- if (!raw)
+ lr = NULL;
+ if (GNUNET_NO == was_gns)
+ {
+ global_ret = 3;
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+ if (! raw)
{
if (0 == rd_count)
printf ("No results.\n");
@@ -216,117 +164,6 @@ process_lookup_result (void *cls,
/**
- * Perform the actual resolution, starting with the zone
- * identified by the given public key and the shorten zone.
- *
- * @param pkey public key to use for the zone, can be NULL
- */
-static void
-lookup_with_public_key (const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey)
-{
- if (NULL != lookup_type)
- rtype = GNUNET_GNSRECORD_typename_to_number (lookup_type);
- else
- rtype = GNUNET_DNSPARSER_TYPE_A;
- if (UINT32_MAX == rtype)
- {
- fprintf (stderr,
- _("Invalid typename specified, assuming `ANY'\n"));
- rtype = GNUNET_GNSRECORD_TYPE_ANY;
- }
-
- if (NULL != lookup_name)
- {
- lookup_request = GNUNET_GNS_lookup (gns,
- lookup_name,
- pkey,
- rtype,
- local_options,
- &process_lookup_result,
- lookup_name);
- }
- else
- {
- fprintf (stderr,
- _("Please specify name to lookup!\n"));
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-}
-
-
-/**
- * Method called to with the ego we are to use for the lookup,
- * when the ego is determined by a name.
- *
- * @param cls closure (NULL, unused)
- * @param ego ego handle, NULL if not found
- */
-static void
-identity_zone_cb (void *cls,
- const struct GNUNET_IDENTITY_Ego *ego)
-{
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
-
- el = NULL;
- if (NULL == ego)
- {
- global_ret = 3; /* Not a GNS TLD */
- GNUNET_SCHEDULER_shutdown ();
- }
- else
- {
- GNUNET_IDENTITY_ego_get_public_key (ego,
- &pkey);
- lookup_with_public_key (&pkey);
- }
-}
-
-
-/**
- * Obtain the TLD of the given @a name.
- *
- * @param name a name
- * @return the part of @a name after the last ".",
- * or @a name if @a name does not contain a "."
- */
-static const char *
-get_tld (const char *name)
-{
- const char *tld;
-
- tld = strrchr (name,
- (unsigned char) '.');
- if (NULL == tld)
- tld = name;
- else
- tld++; /* skip the '.' */
- return tld;
-}
-
-
-/**
- * Eat the TLD of the given @a name.
- *
- * @param name a name
- */
-static void
-eat_tld (char *name)
-{
- char *tld;
-
- GNUNET_assert (0 < strlen (name));
- tld = strrchr (name,
- (unsigned char) '.');
- if (NULL == tld)
- strcpy (name,
- GNUNET_GNS_MASTERZONE_STR);
- else
- *tld = '\0';
-}
-
-
-/**
* Main function that will be run.
*
* @param cls closure
@@ -340,82 +177,45 @@ run (void *cls,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *c)
{
- struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
- const char *tld;
- char *dot_tld;
- char *zonestr;
-
+ (void) cls;
+ (void) args;
+ (void) cfgfile;
+
cfg = c;
gns = GNUNET_GNS_connect (cfg);
if (NULL == gns)
{
fprintf (stderr,
_("Failed to connect to GNS\n"));
+ global_ret = 2;
return;
}
- tt = GNUNET_SCHEDULER_add_delayed (timeout,
- &do_timeout,
- NULL);
+
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
NULL);
- /* start with trivial case: TLD is zkey */
- tld = get_tld (lookup_name);
- if (GNUNET_OK ==
- GNUNET_CRYPTO_ecdsa_public_key_from_string (tld,
- strlen (tld),
- &pkey))
+
+ if (NULL != lookup_type)
+ rtype = GNUNET_GNSRECORD_typename_to_number (lookup_type);
+ else
+ rtype = GNUNET_DNSPARSER_TYPE_A;
+ if (UINT32_MAX == rtype)
{
- eat_tld (lookup_name);
- lookup_with_public_key (&pkey);
- return;
+ fprintf (stderr,
+ _("Invalid typename specified, assuming `ANY'\n"));
+ rtype = GNUNET_GNSRECORD_TYPE_ANY;
}
-
- /* second case: TLD is mapped in our configuration file */
- GNUNET_asprintf (&dot_tld,
- ".%s",
- tld);
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (cfg,
- "gns",
- dot_tld,
- &zonestr))
+ lr = GNUNET_GNS_lookup_with_tld (gns,
+ lookup_name,
+ rtype,
+ local_options,
+ &process_lookup_result,
+ NULL);
+ if (NULL == lr)
{
- if (GNUNET_OK !=
- GNUNET_CRYPTO_ecdsa_public_key_from_string (zonestr,
- strlen (zonestr),
- &pkey))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- "gns",
- dot_tld,
- _("Expected a base32-encoded public zone
key\n"));
- GNUNET_free (zonestr);
- GNUNET_free (dot_tld);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- GNUNET_free (dot_tld);
- GNUNET_free (zonestr);
- eat_tld (lookup_name);
- lookup_with_public_key (&pkey);
+ global_ret = 2;
+ GNUNET_SCHEDULER_shutdown ();
return;
- }
- GNUNET_free (dot_tld);
-
- /* Final case: TLD matches one of our egos */
- eat_tld (lookup_name);
-
- /* if the name is of the form 'label.gnu', never go to the DHT */
- if (NULL == strchr (lookup_name,
- (unsigned char) '.'))
- local_options = GNUNET_GNS_LO_NO_DHT;
- identity = GNUNET_IDENTITY_connect (cfg,
- NULL,
- NULL);
- el = GNUNET_IDENTITY_ego_lookup (cfg,
- tld,
- &identity_zone_cb,
- NULL);
+ }
}
@@ -442,11 +242,6 @@ main (int argc,
"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"),
@@ -455,7 +250,6 @@ main (int argc,
};
int ret;
- timeout = GNUNET_TIME_UNIT_FOREVER_REL;
if (GNUNET_OK !=
GNUNET_STRINGS_get_utf8_args (argc, argv,
&argc, &argv))
diff --git a/src/include/gnunet_gns_service.h b/src/include/gnunet_gns_service.h
index 2ef946a82..1eb67ed50 100644
--- a/src/include/gnunet_gns_service.h
+++ b/src/include/gnunet_gns_service.h
@@ -66,6 +66,12 @@ struct GNUNET_GNS_Handle;
*/
struct GNUNET_GNS_LookupRequest;
+/**
+ * Handle to control a lookup operation where the
+ * TLD is resolved to a zone as part of the lookup operation.
+ */
+struct GNUNET_GNS_LookupWithTldRequest;
+
/**
* Initialize the connection with the GNS service.
@@ -154,6 +160,54 @@ void
GNUNET_GNS_lookup_cancel (struct GNUNET_GNS_LookupRequest *lr);
+/**
+ * Iterator called on obtained result for a GNS lookup
+ * where "not GNS" is a valid answer.
+ *
+ * @param cls closure
+ * @param gns_tld #GNUNET_YES if a GNS lookup was attempted,
+ * #GNUNET_NO if the TLD is not configured for GNS
+ * @param rd_count number of records in @a rd
+ * @param rd the records in the reply
+ */
+typedef void
+(*GNUNET_GNS_LookupResultProcessor2) (void *cls,
+ int gns_tld,
+ uint32_t rd_count,
+ const struct GNUNET_GNSRECORD_Data *rd);
+
+
+/**
+ * Perform an asynchronous lookup operation on the GNS,
+ * determining the zone using the TLD of the given name
+ * and the current configuration to resolve TLDs to zones.
+ *
+ * @param handle handle to the GNS service
+ * @param name the name to look up, including TLD
+ * @param type the record type to look up
+ * @param options local options for the lookup
+ * @param proc processor to call on result
+ * @param proc_cls closure for @a proc
+ * @return handle to the get request
+ */
+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);
+
+
+/**
+ * Cancel pending lookup request
+ *
+ * @param ltr the lookup request to cancel
+ */
+void
+GNUNET_GNS_lookup_with_tld_cancel (struct GNUNET_GNS_LookupWithTldRequest
*ltr);
+
+
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [gnunet] branch master updated: add convenience API to gnunetgns lib,
gnunet <=