aboutsummaryrefslogtreecommitdiff
path: root/src/gns
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-10-16 21:52:04 +0000
committerChristian Grothoff <christian@grothoff.org>2013-10-16 21:52:04 +0000
commitdbc823a07a03e1085172038125b0edf15b0dc6fe (patch)
tree4e7c3bf60ce83e801c69a6566ea36d514b571cba /src/gns
parenteec0e5088ec9437f5c0cf9d3ffef87603ad2777a (diff)
downloadgnunet-dbc823a07a03e1085172038125b0edf15b0dc6fe.tar.gz
gnunet-dbc823a07a03e1085172038125b0edf15b0dc6fe.zip
-finishing split of namestore into namestore and namecache (#3065) -- in theory; in practice, somehow something broke badly, so the tests are now failing
Diffstat (limited to 'src/gns')
-rw-r--r--src/gns/Makefile.am1
-rw-r--r--src/gns/gnunet-service-gns.c27
-rw-r--r--src/gns/gnunet-service-gns_resolver.c40
-rw-r--r--src/gns/gnunet-service-gns_resolver.h4
-rw-r--r--src/gns/gnunet-service-gns_shorten.c23
-rw-r--r--src/gns/gnunet-service-gns_shorten.h3
6 files changed, 78 insertions, 20 deletions
diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am
index 6ee6d02ad..9a2573b91 100644
--- a/src/gns/Makefile.am
+++ b/src/gns/Makefile.am
@@ -165,6 +165,7 @@ gnunet_service_gns_LDADD = \
165 $(top_builddir)/src/dns/libgnunetdnsparser.la \ 165 $(top_builddir)/src/dns/libgnunetdnsparser.la \
166 $(top_builddir)/src/dns/libgnunetdnsstub.la \ 166 $(top_builddir)/src/dns/libgnunetdnsstub.la \
167 $(top_builddir)/src/dht/libgnunetdht.la \ 167 $(top_builddir)/src/dht/libgnunetdht.la \
168 $(top_builddir)/src/namecache/libgnunetnamecache.la \
168 $(top_builddir)/src/namestore/libgnunetnamestore.la \ 169 $(top_builddir)/src/namestore/libgnunetnamestore.la \
169 $(USE_VPN) \ 170 $(USE_VPN) \
170 $(GN_LIBINTL) 171 $(GN_LIBINTL)
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index ff574c3a1..53d6c11a4 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -28,6 +28,7 @@
28#include "gnunet_dns_service.h" 28#include "gnunet_dns_service.h"
29#include "gnunet_dnsparser_lib.h" 29#include "gnunet_dnsparser_lib.h"
30#include "gnunet_dht_service.h" 30#include "gnunet_dht_service.h"
31#include "gnunet_namecache_service.h"
31#include "gnunet_namestore_service.h" 32#include "gnunet_namestore_service.h"
32#include "gnunet_gns_service.h" 33#include "gnunet_gns_service.h"
33#include "gnunet_statistics_service.h" 34#include "gnunet_statistics_service.h"
@@ -121,6 +122,11 @@ static struct GNUNET_DHT_PutHandle *active_put;
121static struct GNUNET_NAMESTORE_Handle *namestore_handle; 122static struct GNUNET_NAMESTORE_Handle *namestore_handle;
122 123
123/** 124/**
125 * Our handle to the namecache service
126 */
127static struct GNUNET_NAMECACHE_Handle *namecache_handle;
128
129/**
124 * Handle to iterate over our authoritative zone in namestore 130 * Handle to iterate over our authoritative zone in namestore
125 */ 131 */
126static struct GNUNET_NAMESTORE_ZoneIterator *namestore_iter; 132static struct GNUNET_NAMESTORE_ZoneIterator *namestore_iter;
@@ -231,6 +237,11 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
231 GNUNET_NAMESTORE_disconnect (namestore_handle); 237 GNUNET_NAMESTORE_disconnect (namestore_handle);
232 namestore_handle = NULL; 238 namestore_handle = NULL;
233 } 239 }
240 if (NULL != namecache_handle)
241 {
242 GNUNET_NAMECACHE_disconnect (namecache_handle);
243 namecache_handle = NULL;
244 }
234 if (NULL != active_put) 245 if (NULL != active_put)
235 { 246 {
236 GNUNET_DHT_put_cancel (active_put); 247 GNUNET_DHT_put_cancel (active_put);
@@ -645,6 +656,14 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
645 GNUNET_SCHEDULER_shutdown (); 656 GNUNET_SCHEDULER_shutdown ();
646 return; 657 return;
647 } 658 }
659 namecache_handle = GNUNET_NAMECACHE_connect (c);
660 if (NULL == namecache_handle)
661 {
662 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
663 _("Failed to connect to the namecache!\n"));
664 GNUNET_SCHEDULER_shutdown ();
665 return;
666 }
648 667
649 put_interval = INITIAL_PUT_INTERVAL; 668 put_interval = INITIAL_PUT_INTERVAL;
650 zone_publish_time_window = DEFAULT_ZONE_PUBLISH_TIME_WINDOW; 669 zone_publish_time_window = DEFAULT_ZONE_PUBLISH_TIME_WINDOW;
@@ -705,10 +724,14 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
705 return; 724 return;
706 } 725 }
707 } 726 }
708 GNS_resolver_init (namestore_handle, dht_handle, 727 GNS_resolver_init (namestore_handle,
728 namecache_handle,
729 dht_handle,
709 c, 730 c,
710 max_parallel_bg_queries); 731 max_parallel_bg_queries);
711 GNS_shorten_init (namestore_handle, dht_handle); 732 GNS_shorten_init (namestore_handle,
733 namecache_handle,
734 dht_handle);
712 GNUNET_SERVER_disconnect_notify (server, 735 GNUNET_SERVER_disconnect_notify (server,
713 &notify_client_disconnect, 736 &notify_client_disconnect,
714 NULL); 737 NULL);
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index e0d395a55..6ff2d8791 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -35,6 +35,7 @@
35#include "gnunet_dnsstub_lib.h" 35#include "gnunet_dnsstub_lib.h"
36#include "gnunet_dht_service.h" 36#include "gnunet_dht_service.h"
37#include "gnunet_gnsrecord_lib.h" 37#include "gnunet_gnsrecord_lib.h"
38#include "gnunet_namecache_service.h"
38#include "gnunet_namestore_service.h" 39#include "gnunet_namestore_service.h"
39#include "gnunet_dns_service.h" 40#include "gnunet_dns_service.h"
40#include "gnunet_resolver_service.h" 41#include "gnunet_resolver_service.h"
@@ -264,9 +265,9 @@ struct GNS_ResolverHandle
264 struct GNUNET_RESOLVER_RequestHandle *std_resolve; 265 struct GNUNET_RESOLVER_RequestHandle *std_resolve;
265 266
266 /** 267 /**
267 * Pending Namestore lookup task 268 * Pending Namecache lookup task
268 */ 269 */
269 struct GNUNET_NAMESTORE_QueueEntry *namestore_qe; 270 struct GNUNET_NAMECACHE_QueueEntry *namecache_qe;
270 271
271 /** 272 /**
272 * Heap node associated with this lookup. Used to limit number of 273 * Heap node associated with this lookup. Used to limit number of
@@ -353,7 +354,7 @@ struct CacheOps
353 /** 354 /**
354 * Pending Namestore caching task. 355 * Pending Namestore caching task.
355 */ 356 */
356 struct GNUNET_NAMESTORE_QueueEntry *namestore_qe_cache; 357 struct GNUNET_NAMECACHE_QueueEntry *namecache_qe_cache;
357 358
358}; 359};
359 360
@@ -364,6 +365,11 @@ struct CacheOps
364static struct GNUNET_NAMESTORE_Handle *namestore_handle; 365static struct GNUNET_NAMESTORE_Handle *namestore_handle;
365 366
366/** 367/**
368 * Our handle to the namecache service
369 */
370static struct GNUNET_NAMECACHE_Handle *namecache_handle;
371
372/**
367 * Our handle to the vpn service 373 * Our handle to the vpn service
368 */ 374 */
369static struct GNUNET_VPN_Handle *vpn_handle; 375static struct GNUNET_VPN_Handle *vpn_handle;
@@ -1672,13 +1678,13 @@ handle_gns_resolution_result (void *cls,
1672 * @param emsg error message 1678 * @param emsg error message
1673 */ 1679 */
1674static void 1680static void
1675namestore_cache_continuation (void *cls, 1681namecache_cache_continuation (void *cls,
1676 int32_t success, 1682 int32_t success,
1677 const char *emsg) 1683 const char *emsg)
1678{ 1684{
1679 struct CacheOps *co = cls; 1685 struct CacheOps *co = cls;
1680 1686
1681 co->namestore_qe_cache = NULL; 1687 co->namecache_qe_cache = NULL;
1682 if (NULL != emsg) 1688 if (NULL != emsg)
1683 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 1689 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1684 _("Failed to cache GNS resolution: %s\n"), 1690 _("Failed to cache GNS resolution: %s\n"),
@@ -1765,9 +1771,9 @@ handle_dht_response (void *cls,
1765 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1771 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1766 "Caching response from the DHT in namestore\n"); 1772 "Caching response from the DHT in namestore\n");
1767 co = GNUNET_new (struct CacheOps); 1773 co = GNUNET_new (struct CacheOps);
1768 co->namestore_qe_cache = GNUNET_NAMESTORE_block_cache (namestore_handle, 1774 co->namecache_qe_cache = GNUNET_NAMECACHE_block_cache (namecache_handle,
1769 block, 1775 block,
1770 &namestore_cache_continuation, 1776 &namecache_cache_continuation,
1771 co); 1777 co);
1772 GNUNET_CONTAINER_DLL_insert (co_head, 1778 GNUNET_CONTAINER_DLL_insert (co_head,
1773 co_tail, 1779 co_tail,
@@ -1795,8 +1801,8 @@ handle_namestore_block_response (void *cls,
1795 GNUNET_GNSRECORD_query_from_public_key (auth, 1801 GNUNET_GNSRECORD_query_from_public_key (auth,
1796 label, 1802 label,
1797 &query); 1803 &query);
1798 GNUNET_assert (NULL != rh->namestore_qe); 1804 GNUNET_assert (NULL != rh->namecache_qe);
1799 rh->namestore_qe = NULL; 1805 rh->namecache_qe = NULL;
1800 if ( (GNUNET_NO == rh->only_cached) && 1806 if ( (GNUNET_NO == rh->only_cached) &&
1801 ( (NULL == block) || 1807 ( (NULL == block) ||
1802 (0 == GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh (block->expiration_time)).rel_value_us) ) ) 1808 (0 == GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh (block->expiration_time)).rel_value_us) ) )
@@ -1874,11 +1880,11 @@ recursive_gns_resolution_namestore (struct GNS_ResolverHandle *rh)
1874 GNUNET_GNSRECORD_query_from_public_key (&ac->authority_info.gns_authority, 1880 GNUNET_GNSRECORD_query_from_public_key (&ac->authority_info.gns_authority,
1875 ac->label, 1881 ac->label,
1876 &query); 1882 &query);
1877 rh->namestore_qe = GNUNET_NAMESTORE_lookup_block (namestore_handle, 1883 rh->namecache_qe = GNUNET_NAMECACHE_lookup_block (namecache_handle,
1878 &query, 1884 &query,
1879 &handle_namestore_block_response, 1885 &handle_namestore_block_response,
1880 rh); 1886 rh);
1881 GNUNET_assert (NULL != rh->namestore_qe); 1887 GNUNET_assert (NULL != rh->namecache_qe);
1882} 1888}
1883 1889
1884 1890
@@ -2100,10 +2106,10 @@ GNS_resolver_lookup_cancel (struct GNS_ResolverHandle *rh)
2100 GNUNET_DNSSTUB_resolve_cancel (rh->dns_request); 2106 GNUNET_DNSSTUB_resolve_cancel (rh->dns_request);
2101 rh->dns_request = NULL; 2107 rh->dns_request = NULL;
2102 } 2108 }
2103 if (NULL != rh->namestore_qe) 2109 if (NULL != rh->namecache_qe)
2104 { 2110 {
2105 GNUNET_NAMESTORE_cancel (rh->namestore_qe); 2111 GNUNET_NAMECACHE_cancel (rh->namecache_qe);
2106 rh->namestore_qe = NULL; 2112 rh->namecache_qe = NULL;
2107 } 2113 }
2108 if (NULL != rh->std_resolve) 2114 if (NULL != rh->std_resolve)
2109 { 2115 {
@@ -2132,12 +2138,14 @@ GNS_resolver_lookup_cancel (struct GNS_ResolverHandle *rh)
2132 * Initialize the resolver 2138 * Initialize the resolver
2133 * 2139 *
2134 * @param nh the namestore handle 2140 * @param nh the namestore handle
2141 * @param nc the namecache handle
2135 * @param dht the dht handle 2142 * @param dht the dht handle
2136 * @param c configuration handle 2143 * @param c configuration handle
2137 * @param max_bg_queries maximum number of parallel background queries in dht 2144 * @param max_bg_queries maximum number of parallel background queries in dht
2138 */ 2145 */
2139void 2146void
2140GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh, 2147GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh,
2148 struct GNUNET_NAMECACHE_Handle *nc,
2141 struct GNUNET_DHT_Handle *dht, 2149 struct GNUNET_DHT_Handle *dht,
2142 const struct GNUNET_CONFIGURATION_Handle *c, 2150 const struct GNUNET_CONFIGURATION_Handle *c,
2143 unsigned long long max_bg_queries) 2151 unsigned long long max_bg_queries)
@@ -2145,6 +2153,7 @@ GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh,
2145 char *dns_ip; 2153 char *dns_ip;
2146 2154
2147 cfg = c; 2155 cfg = c;
2156 namecache_handle = nc;
2148 namestore_handle = nh; 2157 namestore_handle = nh;
2149 dht_handle = dht; 2158 dht_handle = dht;
2150 dht_lookup_heap = 2159 dht_lookup_heap =
@@ -2185,7 +2194,7 @@ GNS_resolver_done ()
2185 GNUNET_CONTAINER_DLL_remove (co_head, 2194 GNUNET_CONTAINER_DLL_remove (co_head,
2186 co_tail, 2195 co_tail,
2187 co); 2196 co);
2188 GNUNET_NAMESTORE_cancel (co->namestore_qe_cache); 2197 GNUNET_NAMECACHE_cancel (co->namecache_qe_cache);
2189 GNUNET_free (co); 2198 GNUNET_free (co);
2190 } 2199 }
2191 GNUNET_CONTAINER_heap_destroy (dht_lookup_heap); 2200 GNUNET_CONTAINER_heap_destroy (dht_lookup_heap);
@@ -2195,6 +2204,7 @@ GNS_resolver_done ()
2195 GNUNET_VPN_disconnect (vpn_handle); 2204 GNUNET_VPN_disconnect (vpn_handle);
2196 vpn_handle = NULL; 2205 vpn_handle = NULL;
2197 dht_handle = NULL; 2206 dht_handle = NULL;
2207 namecache_handle = NULL;
2198 namestore_handle = NULL; 2208 namestore_handle = NULL;
2199} 2209}
2200 2210
diff --git a/src/gns/gnunet-service-gns_resolver.h b/src/gns/gnunet-service-gns_resolver.h
index 12d2eec11..7728c397d 100644
--- a/src/gns/gnunet-service-gns_resolver.h
+++ b/src/gns/gnunet-service-gns_resolver.h
@@ -26,19 +26,21 @@
26#define GNS_RESOLVER_H 26#define GNS_RESOLVER_H
27#include "gns.h" 27#include "gns.h"
28#include "gnunet_dht_service.h" 28#include "gnunet_dht_service.h"
29 29#include "gnunet_namecache_service.h"
30 30
31/** 31/**
32 * Initialize the resolver subsystem. 32 * Initialize the resolver subsystem.
33 * MUST be called before #GNS_resolver_lookup. 33 * MUST be called before #GNS_resolver_lookup.
34 * 34 *
35 * @param nh handle to the namestore 35 * @param nh handle to the namestore
36 * @param nc the namecache handle
36 * @param dht handle to the dht 37 * @param dht handle to the dht
37 * @param c configuration handle 38 * @param c configuration handle
38 * @param max_bg_queries maximum amount of background queries 39 * @param max_bg_queries maximum amount of background queries
39 */ 40 */
40void 41void
41GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh, 42GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh,
43 struct GNUNET_NAMECACHE_Handle *nc,
42 struct GNUNET_DHT_Handle *dht, 44 struct GNUNET_DHT_Handle *dht,
43 const struct GNUNET_CONFIGURATION_Handle *c, 45 const struct GNUNET_CONFIGURATION_Handle *c,
44 unsigned long long max_bg_queries); 46 unsigned long long max_bg_queries);
diff --git a/src/gns/gnunet-service-gns_shorten.c b/src/gns/gnunet-service-gns_shorten.c
index 3e612e862..2f0bf9644 100644
--- a/src/gns/gnunet-service-gns_shorten.c
+++ b/src/gns/gnunet-service-gns_shorten.c
@@ -94,6 +94,11 @@ struct GetPseuAuthorityHandle
94 struct GNUNET_NAMESTORE_QueueEntry *namestore_task; 94 struct GNUNET_NAMESTORE_QueueEntry *namestore_task;
95 95
96 /** 96 /**
97 * Handle to namecache request
98 */
99 struct GNUNET_NAMECACHE_QueueEntry *namecache_task;
100
101 /**
97 * Task to abort DHT lookup operation. 102 * Task to abort DHT lookup operation.
98 */ 103 */
99 GNUNET_SCHEDULER_TaskIdentifier timeout_task; 104 GNUNET_SCHEDULER_TaskIdentifier timeout_task;
@@ -117,6 +122,11 @@ static struct GetPseuAuthorityHandle *gph_tail;
117static struct GNUNET_NAMESTORE_Handle *namestore_handle; 122static struct GNUNET_NAMESTORE_Handle *namestore_handle;
118 123
119/** 124/**
125 * Our handle to the namecache service
126 */
127static struct GNUNET_NAMECACHE_Handle *namecache_handle;
128
129/**
120 * Resolver handle to the dht 130 * Resolver handle to the dht
121 */ 131 */
122static struct GNUNET_DHT_Handle *dht_handle; 132static struct GNUNET_DHT_Handle *dht_handle;
@@ -140,6 +150,11 @@ free_get_pseu_authority_handle (struct GetPseuAuthorityHandle *gph)
140 GNUNET_NAMESTORE_cancel (gph->namestore_task); 150 GNUNET_NAMESTORE_cancel (gph->namestore_task);
141 gph->namestore_task = NULL; 151 gph->namestore_task = NULL;
142 } 152 }
153 if (NULL != gph->namecache_task)
154 {
155 GNUNET_NAMECACHE_cancel (gph->namecache_task);
156 gph->namecache_task = NULL;
157 }
143 if (GNUNET_SCHEDULER_NO_TASK != gph->timeout_task) 158 if (GNUNET_SCHEDULER_NO_TASK != gph->timeout_task)
144 { 159 {
145 GNUNET_SCHEDULER_cancel (gph->timeout_task); 160 GNUNET_SCHEDULER_cancel (gph->timeout_task);
@@ -198,7 +213,7 @@ process_pseu_block_ns (void *cls,
198 struct GetPseuAuthorityHandle *gph = cls; 213 struct GetPseuAuthorityHandle *gph = cls;
199 struct GNUNET_CRYPTO_EcdsaPublicKey pub; 214 struct GNUNET_CRYPTO_EcdsaPublicKey pub;
200 215
201 gph->namestore_task = NULL; 216 gph->namecache_task = NULL;
202 if (NULL == block) 217 if (NULL == block)
203 { 218 {
204 process_pseu_lookup_ns (gph, 0, NULL); 219 process_pseu_lookup_ns (gph, 0, NULL);
@@ -240,7 +255,7 @@ perform_pseu_lookup (struct GetPseuAuthorityHandle *gph,
240 GNUNET_GNSRECORD_query_from_public_key (&pub, 255 GNUNET_GNSRECORD_query_from_public_key (&pub,
241 label, 256 label,
242 &query); 257 &query);
243 gph->namestore_task = GNUNET_NAMESTORE_lookup_block (namestore_handle, 258 gph->namecache_task = GNUNET_NAMECACHE_lookup_block (namecache_handle,
244 &query, 259 &query,
245 &process_pseu_block_ns, 260 &process_pseu_block_ns,
246 gph); 261 gph);
@@ -553,13 +568,16 @@ GNS_shorten_start (const char *original_label,
553 * Initialize the shortening subsystem 568 * Initialize the shortening subsystem
554 * 569 *
555 * @param nh the namestore handle 570 * @param nh the namestore handle
571 * @param nc the namecache handle
556 * @param dht the dht handle 572 * @param dht the dht handle
557 */ 573 */
558void 574void
559GNS_shorten_init (struct GNUNET_NAMESTORE_Handle *nh, 575GNS_shorten_init (struct GNUNET_NAMESTORE_Handle *nh,
576 struct GNUNET_NAMECACHE_Handle *nc,
560 struct GNUNET_DHT_Handle *dht) 577 struct GNUNET_DHT_Handle *dht)
561{ 578{
562 namestore_handle = nh; 579 namestore_handle = nh;
580 namecache_handle = nc;
563 dht_handle = dht; 581 dht_handle = dht;
564} 582}
565 583
@@ -575,6 +593,7 @@ GNS_shorten_done ()
575 free_get_pseu_authority_handle (gph_head); 593 free_get_pseu_authority_handle (gph_head);
576 dht_handle = NULL; 594 dht_handle = NULL;
577 namestore_handle = NULL; 595 namestore_handle = NULL;
596 namecache_handle = NULL;
578} 597}
579 598
580/* end of gnunet-service-gns_shorten.c */ 599/* end of gnunet-service-gns_shorten.c */
diff --git a/src/gns/gnunet-service-gns_shorten.h b/src/gns/gnunet-service-gns_shorten.h
index 5f583eeb5..f99d465f9 100644
--- a/src/gns/gnunet-service-gns_shorten.h
+++ b/src/gns/gnunet-service-gns_shorten.h
@@ -26,6 +26,7 @@
26#define GNS_SHORTEN_H 26#define GNS_SHORTEN_H
27#include "gns.h" 27#include "gns.h"
28#include "gnunet_dht_service.h" 28#include "gnunet_dht_service.h"
29#include "gnunet_namecache_service.h"
29#include "gnunet_namestore_service.h" 30#include "gnunet_namestore_service.h"
30 31
31 32
@@ -34,10 +35,12 @@
34 * MUST be called before #GNS_shorten_start. 35 * MUST be called before #GNS_shorten_start.
35 * 36 *
36 * @param nh handle to the namestore 37 * @param nh handle to the namestore
38 * @param nc the namecache handle
37 * @param dht handle to the dht 39 * @param dht handle to the dht
38 */ 40 */
39void 41void
40GNS_shorten_init (struct GNUNET_NAMESTORE_Handle *nh, 42GNS_shorten_init (struct GNUNET_NAMESTORE_Handle *nh,
43 struct GNUNET_NAMECACHE_Handle *nc,
41 struct GNUNET_DHT_Handle *dht); 44 struct GNUNET_DHT_Handle *dht);
42 45
43 46