gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22056 - gnunet/src/gns


From: gnunet
Subject: [GNUnet-SVN] r22056 - gnunet/src/gns
Date: Sun, 17 Jun 2012 11:59:55 +0200

Author: schanzen
Date: 2012-06-17 11:59:54 +0200 (Sun, 17 Jun 2012)
New Revision: 22056

Modified:
   gnunet/src/gns/gnunet-service-gns.c
   gnunet/src/gns/gnunet-service-gns_resolver.c
   gnunet/src/gns/gnunet-service-gns_resolver.h
Log:
-fix cname, more ns/vpn delegation

Modified: gnunet/src/gns/gnunet-service-gns.c
===================================================================
--- gnunet/src/gns/gnunet-service-gns.c 2012-06-17 08:35:02 UTC (rev 22055)
+++ gnunet/src/gns/gnunet-service-gns.c 2012-06-17 09:59:54 UTC (rev 22056)
@@ -1121,7 +1121,7 @@
     GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Could not connect to DHT!\n");
   }
   
-  if (gns_resolver_init(namestore_handle, dht_handle, zone_hash,
+  if (gns_resolver_init(namestore_handle, dht_handle, zone_hash, c,
                         max_parallel_bg_queries,
                         ignore_pending)
       == GNUNET_SYSERR)

Modified: gnunet/src/gns/gnunet-service-gns_resolver.c
===================================================================
--- gnunet/src/gns/gnunet-service-gns_resolver.c        2012-06-17 08:35:02 UTC 
(rev 22055)
+++ gnunet/src/gns/gnunet-service-gns_resolver.c        2012-06-17 09:59:54 UTC 
(rev 22056)
@@ -33,6 +33,7 @@
 #include "gnunet_namestore_service.h"
 #include "gnunet_vpn_service.h"
 #include "gnunet_dns_service.h"
+#include "gnunet_resolver_service.h"
 #include "gnunet_dnsparser_lib.h"
 #include "gnunet_gns_service.h"
 #include "block_gns.h"
@@ -552,10 +553,7 @@
 /**
  * Callback that shortens authorities
  *
- * @param name the name given by delegation
- * @param zone the authority
- * @param our_zone our local zone
- * @param key the private key of our authority
+ * @param gph the handle to the shorten request
  */
 static void
 shorten_authority_chain (struct GetPseuAuthorityHandle *gph)
@@ -626,6 +624,7 @@
 gns_resolver_init(struct GNUNET_NAMESTORE_Handle *nh,
                   struct GNUNET_DHT_Handle *dh,
                   struct GNUNET_CRYPTO_ShortHashCode lz,
+                  const struct GNUNET_CONFIGURATION_Handle *cfg,
                   unsigned long long max_bg_queries,
                   int ignore_pending)
 {
@@ -636,11 +635,24 @@
     GNUNET_CONTAINER_heap_create(GNUNET_CONTAINER_HEAP_ORDER_MIN);
   max_allowed_background_queries = max_bg_queries;
   ignore_pending_records = ignore_pending;
+  
+  if (NULL == vpn_handle)
+  {
+    vpn_handle = GNUNET_VPN_connect (cfg);
+    if (NULL == vpn_handle)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "GNS_PHASE_INIT: Error connecting to VPN!\n");
 
+      return GNUNET_SYSERR;
+    }
+  }
+
   if ((namestore_handle != NULL) && (dht_handle != NULL))
   {
     return GNUNET_OK;
   }
+
   return GNUNET_SYSERR;
 }
 
@@ -661,7 +673,7 @@
 {
   struct ResolverHandle *rh = (struct ResolverHandle *)element;
   ResolverCleanupContinuation cont = cls;
-  
+
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
              "GNS_CLEANUP-%llu: Terminating background lookup for %s\n",
              rh->id, rh->name);
@@ -720,7 +732,7 @@
     GNUNET_free(ac);
     ac = ac_next;
   }
-  
+
   if (NULL != rh->dns_raw_packet)
     GNUNET_free (rh->dns_raw_packet);
 
@@ -822,7 +834,7 @@
                              &background_lookup_result_processor,
                              NULL);
   rh->timeout_task = GNUNET_SCHEDULER_NO_TASK;
-  
+
   GNUNET_DHT_get_stop (rh->get_handle);
   rh->get_handle = NULL;
   rh->proc(rh->proc_cls, rh, 0, NULL);
@@ -846,14 +858,14 @@
  */
 static void
 process_record_result_dht(void* cls,
-                 struct GNUNET_TIME_Absolute exp,
-                 const struct GNUNET_HashCode * key,
-                 const struct GNUNET_PeerIdentity *get_path,
-                 unsigned int get_path_length,
-                 const struct GNUNET_PeerIdentity *put_path,
-                 unsigned int put_path_length,
-                 enum GNUNET_BLOCK_Type type,
-                 size_t size, const void *data)
+                          struct GNUNET_TIME_Absolute exp,
+                          const struct GNUNET_HashCode * key,
+                          const struct GNUNET_PeerIdentity *get_path,
+                          unsigned int get_path_length,
+                          const struct GNUNET_PeerIdentity *put_path,
+                          unsigned int put_path_length,
+                          enum GNUNET_BLOCK_Type type,
+                          size_t size, const void *data)
 {
   struct ResolverHandle *rh;
   struct RecordLookupHandle *rlh;
@@ -867,26 +879,26 @@
   rh = (struct ResolverHandle *)cls;
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
              "GNS_PHASE_REC-%d: got dht result (size=%d)\n", rh->id, size);
-  
+
   if (data == NULL)
     return;
 
   //FIXME maybe check expiration here, check block type
-  
-  
+
+
   rlh = (struct RecordLookupHandle *) rh->proc_cls;
   nrb = (struct GNSNameRecordBlock*)data;
-  
+
   /* stop lookup and timeout task */
   GNUNET_DHT_get_stop (rh->get_handle);
   rh->get_handle = NULL;
-  
+
   if (rh->dht_heap_node != NULL)
   {
     GNUNET_CONTAINER_heap_remove_node(rh->dht_heap_node);
     rh->dht_heap_node = NULL;
   }
-  
+
   if (rh->timeout_task != GNUNET_SCHEDULER_NO_TASK)
   {
     GNUNET_SCHEDULER_cancel(rh->timeout_task);
@@ -901,7 +913,7 @@
 
     rd_data += strlen(name) + 1 + sizeof(struct GNSNameRecordBlock);
     rd_size = size - strlen(name) - 1 - sizeof(struct GNSNameRecordBlock);
-  
+
     if (GNUNET_SYSERR == GNUNET_NAMESTORE_records_deserialize (rd_size,
                                                                rd_data,
                                                                num_records,
@@ -915,20 +927,20 @@
     for (i=0; i<num_records; i++)
     {
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "GNS_PHASE_REC-%d: Got name: %s (wanted %s)\n",
-               rh->id, name, rh->name);
+                 "GNS_PHASE_REC-%d: Got name: %s (wanted %s)\n",
+                 rh->id, name, rh->name);
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "GNS_PHASE_REC-%d: Got type: %d\n",
-               rh->id, rd[i].record_type);
+                 "GNS_PHASE_REC-%d: Got type: %d\n",
+                 rh->id, rd[i].record_type);
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "GNS_PHASE_REC-%d: Got data length: %d\n",
-               rh->id, rd[i].data_size);
+                 "GNS_PHASE_REC-%d: Got data length: %d\n",
+                 rh->id, rd[i].data_size);
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "GNS_PHASE_REC-%d: Got flag %d\n",
-               rh->id, rd[i].flags);
-    
-     if ((strcmp(name, rh->name) == 0) &&
-         (rd[i].record_type == rlh->record_type))
+                 "GNS_PHASE_REC-%d: Got flag %d\n",
+                 rh->id, rd[i].flags);
+
+      if ((strcmp(name, rh->name) == 0) &&
+          (rd[i].record_type == rlh->record_type))
       {
         rh->answered++;
       }
@@ -951,7 +963,7 @@
                                  &on_namestore_record_put_result, //cont
                                  NULL); //cls
 
-  
+
     if (rh->answered)
       rh->proc(rh->proc_cls, rh, num_records, rd);
     else
@@ -978,13 +990,13 @@
   struct GNUNET_CRYPTO_HashAsciiEncoded lookup_key_string;
   struct RecordLookupHandle *rlh = (struct RecordLookupHandle *)rh->proc_cls;
   struct ResolverHandle *rh_heap_root;
-  
+
   GNUNET_CRYPTO_short_hash(rh->name, strlen(rh->name), &name_hash);
   GNUNET_CRYPTO_short_hash_double(&name_hash, &name_hash_double);
   GNUNET_CRYPTO_short_hash_double(&rh->authority, &zone_hash_double);
   GNUNET_CRYPTO_hash_xor(&name_hash_double, &zone_hash_double, &lookup_key);
   GNUNET_CRYPTO_hash_to_enc (&lookup_key, &lookup_key_string);
-  
+
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
              "GNS_PHASE_REC-%d: starting dht lookup for %s with key: %s\n",
              rh->id, rh->name, (char*)&lookup_key_string);
@@ -1000,15 +1012,15 @@
     if (rh->timeout_task == GNUNET_SCHEDULER_NO_TASK)
     {
 
-    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "GNS_PHASE_REC-%d: Adjusting timeout\n", rh->id);
-    /*
-     * Set timeout for authority lookup phase to 1/2
-     */
+      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+                 "GNS_PHASE_REC-%d: Adjusting timeout\n", rh->id);
+      /*
+       * Set timeout for authority lookup phase to 1/2
+       */
       rh->timeout_task = GNUNET_SCHEDULER_add_delayed(
-                                GNUNET_TIME_relative_divide(rh->timeout, 2),
-                                                &handle_lookup_timeout,
-                                                rh);
+                                                      
GNUNET_TIME_relative_divide(rh->timeout, 2),
+                                                      &handle_lookup_timeout,
+                                                      rh);
     }
     //rh->timeout_task = GNUNET_SCHEDULER_add_delayed (DHT_LOOKUP_TIMEOUT,
     //                                                   &dht_lookup_timeout,
@@ -1025,9 +1037,9 @@
       GNUNET_DHT_get_stop(rh_heap_root->get_handle);
       rh_heap_root->get_handle = NULL;
       rh_heap_root->dht_heap_node = NULL;
-      
+
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-           "GNS_PHASE_REC-%d: Replacing oldest background query for %s\n",
+                 "GNS_PHASE_REC-%d: Replacing oldest background query for 
%s\n",
                  rh->id, rh_heap_root->name);
       rh_heap_root->proc(rh_heap_root->proc_cls,
                          rh_heap_root,
@@ -1035,22 +1047,22 @@
                          NULL);
     }
     rh->dht_heap_node = GNUNET_CONTAINER_heap_insert (dht_lookup_heap,
-                                         rh,
-                                         GNUNET_TIME_absolute_get().abs_value);
+                                                      rh,
+                                                      
GNUNET_TIME_absolute_get().abs_value);
   }
-  
+
   xquery = htonl(rlh->record_type);
-  
+
   GNUNET_assert(rh->get_handle == NULL);
   rh->get_handle = GNUNET_DHT_get_start(dht_handle, 
-                       GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
-                       &lookup_key,
-                       DHT_GNS_REPLICATION_LEVEL,
-                       GNUNET_DHT_RO_NONE,
-                       &xquery, 
-                       sizeof(xquery),
-                       &process_record_result_dht,
-                       rh);
+                                        GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
+                                        &lookup_key,
+                                        DHT_GNS_REPLICATION_LEVEL,
+                                        GNUNET_DHT_RO_NONE,
+                                        &xquery, 
+                                        sizeof(xquery),
+                                        &process_record_result_dht,
+                                        rh);
 
 }
 
@@ -1069,11 +1081,11 @@
  */
 static void
 process_record_result_ns(void* cls,
-                  const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *key,
-                  struct GNUNET_TIME_Absolute expiration,
-                  const char *name, unsigned int rd_count,
-                  const struct GNUNET_NAMESTORE_RecordData *rd,
-                  const struct GNUNET_CRYPTO_RsaSignature *signature)
+                         const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded 
*key,
+                         struct GNUNET_TIME_Absolute expiration,
+                         const char *name, unsigned int rd_count,
+                         const struct GNUNET_NAMESTORE_RecordData *rd,
+                         const struct GNUNET_CRYPTO_RsaSignature *signature)
 {
   struct ResolverHandle *rh;
   struct RecordLookupHandle *rlh;
@@ -1083,32 +1095,32 @@
   rh = (struct ResolverHandle *) cls;
   rlh = (struct RecordLookupHandle *)rh->proc_cls;
   GNUNET_CRYPTO_short_hash(key,
-                     sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
-                     &zone);
+                           sizeof(struct 
GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
+                           &zone);
   remaining_time = GNUNET_TIME_absolute_get_remaining (expiration);
-  
-  
 
+
+
   rh->status = 0;
-  
+
   if (name != NULL)
   {
     rh->status |= RSL_RECORD_EXISTS;
   }
-  
+
   if (remaining_time.rel_value == 0)
   {
     rh->status |= RSL_RECORD_EXPIRED;
   }
-  
+
   if (rd_count == 0)
   {
     /**
      * Lookup terminated and no results
      */
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-      "GNS_PHASE_REC-%d: Namestore lookup for %s terminated without results\n",
-         rh->id, name);
+               "GNS_PHASE_REC-%d: Namestore lookup for %s terminated without 
results\n",
+               rh->id, name);
 
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
                "GNS_PHASE_REC-%d: Record %s unknown in namestore\n",
@@ -1122,10 +1134,10 @@
   }
   else
   {
-    
+
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-           "GNS_PHASE_REC-%d: Processing additional result %s from 
namestore\n",
-              rh->id, name);
+               "GNS_PHASE_REC-%d: Processing additional result %s from 
namestore\n",
+               rh->id, name);
     int i;
     for (i=0; i<rd_count;i++)
     {
@@ -1137,11 +1149,11 @@
           (rd[i].flags & GNUNET_NAMESTORE_RF_PENDING))
       {
         GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-        "GNS_PHASE_REC-%d: Record %s is awaiting user confirmation. 
Skipping\n",
-        rh->id, name);
+                   "GNS_PHASE_REC-%d: Record %s is awaiting user confirmation. 
Skipping\n",
+                   rh->id, name);
         continue;
       }
-      
+
       if ((GNUNET_TIME_absolute_get_remaining (rd[i].expiration)).rel_value
           == 0)
       {
@@ -1150,11 +1162,11 @@
                    rh->id);
         continue;
       }
-      
+
       rh->answered++;
-      
+
     }
-    
+
     /**
      * no answers found
      */
@@ -1165,7 +1177,7 @@
       rh->proc(rh->proc_cls, rh, 0, NULL);
       return;
     }
-    
+
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
                "GNS_PHASE_REC-%d: Found %d answer(s) to query in %d 
records!\n",
                rh->id, rh->answered, rd_count);
@@ -1236,7 +1248,7 @@
     rh->proc (rh->proc_cls, rh, 1, &rd);
     return;
   }
-  
+
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
              "GNS_PHASE_REC-%d: Got garbage from VPN!\n",
              rh->id);
@@ -1249,7 +1261,7 @@
  *
  * @param rh resolver handle
  * @param rlh record lookup handle
- * @param rd_cound number of results
+ * @param rd_count number of results
  * @param rd results
  */
 static void
@@ -1298,13 +1310,85 @@
 /**
  * Sends a UDP dns query to a nameserver specified in the rh
  * 
- * @param rh the request handle
+ * @param rh the resolver handle
  */
 static void
 send_dns_packet (struct ResolverHandle *rh);
 
+static void
+handle_dns_resolver (void *cls,
+                     const struct sockaddr *addr,
+                     socklen_t addrlen)
+{
+  struct ResolverHandle *rh = cls;
+  struct RecordLookupHandle *rlh = rh->proc_cls;
+  struct GNUNET_NAMESTORE_RecordData rd;
 
+  if (NULL == addr)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "No address found in DNS!\n");
+    finish_lookup (rh, rlh, 0, NULL);
+    free_resolver_handle (rh);
+    return;
+  }
+  
+  if (addrlen == sizeof (struct sockaddr_in))
+    rd.record_type = GNUNET_GNS_RECORD_TYPE_A;
+  else
+    rd.record_type = GNUNET_GNS_RECORD_AAAA;
+  
+  rd.expiration = GNUNET_TIME_UNIT_FOREVER_ABS;
+  rd.data_size = addrlen;
+  rd.data = addr;
+
+  finish_lookup (rh, rlh, 1, &rd);
+  free_resolver_handle (rh);
+}
+
+/**
+ * Resolve DNS name via local stub resolver
+ *
+ * @param rh the resolver handle
+ */
 static void
+resolve_dns_name (struct ResolverHandle *rh)
+{
+  struct RecordLookupHandle *rlh = rh->proc_cls;
+  int af;
+
+  if ((rlh->record_type != GNUNET_GNS_RECORD_TYPE_A) &&
+      (rlh->record_type != GNUNET_GNS_RECORD_AAAA))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Can only resolve A/AAAA via stub... abort\n");
+    finish_lookup (rh, rlh, 0, NULL);
+    free_resolver_handle (rh);
+    return;
+  }
+
+  if (rlh->record_type == GNUNET_GNS_RECORD_TYPE_A)
+    af = AF_INET;
+  else
+    af = AF_INET6;
+
+  //GNUNET_RESOLVER_connect (cfg); FIXME into init
+
+  rh->dns_resolver_handle = GNUNET_RESOLVER_ip_get (rh->dns_name,
+                                                    af,
+                                                    rh->timeout,
+                                                    &handle_dns_resolver,
+                                                    rh);
+}
+
+
+/**
+ * Read DNS udp packet from socket
+ *
+ * @param cls the resolver handle
+ * @param tc task context
+ */
+static void
 read_dns_response (void *cls,
                    const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
@@ -1317,7 +1401,9 @@
   struct GNUNET_DNSPARSER_Packet *packet;
   struct GNUNET_NAMESTORE_RecordData rd;
   int found_delegation = GNUNET_NO;
+  int found_cname = GNUNET_NO;
   char* delegation_name = NULL;
+  int zone_offset = 0;
   int i;
 
   rh->dns_read_task = GNUNET_SCHEDULER_NO_TASK;
@@ -1367,9 +1453,10 @@
                   packet->answers[i].data.hostname
                  );
       strcpy (rh->dns_name, packet->answers[i].data.hostname);
-      send_dns_packet (rh);
-      GNUNET_DNSPARSER_free_packet (packet);
-      return;
+      found_cname = GNUNET_YES;
+      //send_dns_packet (rh);
+      //GNUNET_DNSPARSER_free_packet (packet);
+      continue;
     }
     
     if ((packet->answers[i].type == rlh->record_type) &&
@@ -1390,6 +1477,23 @@
     }
   }
 
+  if (GNUNET_YES == found_cname)
+  {
+    zone_offset = strlen (rh->dns_name) - strlen (rh->dns_zone) - 1;
+    
+    if (0 > zone_offset)
+      zone_offset = 0;
+
+    /* restart query with CNAME */
+    if (0 == strcmp (rh->dns_name+zone_offset, rh->dns_zone))
+      send_dns_packet (rh);
+    else
+      resolve_dns_name (rh);
+
+    GNUNET_DNSPARSER_free_packet (packet);
+    return;
+  }
+
   for (i = 0; i < packet->num_authority_records; i++)
   {
     
@@ -1503,6 +1607,7 @@
     /* Synthesize dns name */
     if (rd[i].record_type == GNUNET_GNS_RECORD_TYPE_NS)
     {
+      strcpy (rh->dns_zone, (char*)rd[i].data);
       if (0 == strcmp (rh->name, ""))
         strcpy (rh->dns_name, (char*)rd[i].data);
       else
@@ -1637,7 +1742,8 @@
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "GNS_PHASE_REC_VPN-%llu: Error parsing VPN RR!\n",
                 rh->id);
-    rh->proc(rh->proc_cls, rh, 0, NULL);
+    finish_lookup (rh, rh->proc_cls, 0, NULL);
+    free_resolver_handle (rh);
     return;
   }
 
@@ -1657,11 +1763,22 @@
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "GNS_PHASE_REC_VPN-%llu: Error parsing VPN RR hashes!\n",
                 rh->id);
-    rh->proc(rh->proc_cls, rh, 0, NULL);
+    finish_lookup (rh, rh->proc_cls, 0, NULL);
+    free_resolver_handle (rh);
     return;
   }
 
   rh->proc = &handle_record_vpn;
+
+  if (NULL == vpn_handle)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "GNS_PHASE_REC_VPN-%llu: VPN not connected!\n",
+                rh->id);
+    finish_lookup (rh, rh->proc_cls, 0, NULL);
+    free_resolver_handle (rh);
+    return;
+  }
   
   //FIXME timeout??
   rh->vpn_handle = GNUNET_VPN_redirect_to_peer (vpn_handle,

Modified: gnunet/src/gns/gnunet-service-gns_resolver.h
===================================================================
--- gnunet/src/gns/gnunet-service-gns_resolver.h        2012-06-17 08:35:02 UTC 
(rev 22055)
+++ gnunet/src/gns/gnunet-service-gns_resolver.h        2012-06-17 09:59:54 UTC 
(rev 22056)
@@ -142,9 +142,15 @@
   /* a synthesized dns name */
   char dns_name[MAX_DNS_NAME_LENGTH];
 
+  /* the authoritative dns zone */
+  char dns_zone[MAX_DNS_NAME_LENGTH];
+
   /* the address of the DNS server FIXME not needed? */
   struct sockaddr_in dns_addr;
 
+  /* handle to the local stub resolver request */
+  struct GNUNET_RESOLVER_RequestHandle *dns_resolver_handle;
+
   /* select task for DNS */
   GNUNET_SCHEDULER_TaskIdentifier dns_read_task;
 
@@ -301,6 +307,7 @@
  * @param nh handle to the namestore
  * @param dh handle to the dht
  * @param lz the local zone
+ * @param cfg configuration handle
  * @param max_bg_queries maximum amount of background queries
  * @param ignore_pending ignore records that still require user confirmation
  *        on lookup
@@ -310,6 +317,7 @@
 gns_resolver_init(struct GNUNET_NAMESTORE_Handle *nh,
                   struct GNUNET_DHT_Handle *dh,
                   struct GNUNET_CRYPTO_ShortHashCode lz,
+                  const struct GNUNET_CONFIGURATION_Handle *cfg,
                   unsigned long long max_bg_queries,
                   int ignore_pending);
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]