gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r33260 - in gnunet: doc/man src/namestore


From: gnunet
Subject: [GNUnet-SVN] r33260 - in gnunet: doc/man src/namestore
Date: Tue, 13 May 2014 16:28:03 +0200

Author: grothoff
Date: 2014-05-13 16:28:03 +0200 (Tue, 13 May 2014)
New Revision: 33260

Modified:
   gnunet/doc/man/gnunet-namestore.1
   gnunet/src/namestore/gnunet-namestore.c
Log:
fixing #3302: match record type and value as well during deletion, if specified

Modified: gnunet/doc/man/gnunet-namestore.1
===================================================================
--- gnunet/doc/man/gnunet-namestore.1   2014-05-13 12:47:54 UTC (rev 33259)
+++ gnunet/doc/man/gnunet-namestore.1   2014-05-13 14:28:03 UTC (rev 33260)
@@ -20,7 +20,7 @@
 Use the configuration file FILENAME.
 .B
 .IP "\-d, \-\-delete"
-Desired operation is deleting all of the records under the given name
+Desired operation is deleting records under the given name that match the 
specified type (\-t) and value (\-V).  If type or value are not specified, it 
means that all types (or values) should be assumed to match (and possibly 
multiple or all values under the given label will be deleted).  Specifying a 
label (\-n) is mandatory.  Note that matching by expiration time or flags is 
(currently) not supported.
 .B
 .IP "\-D, \-\-display"
 Desired operation is listing of matching records
@@ -41,7 +41,7 @@
 Monitor changes to the zone on an ongoing basis (in contrast to \-D, which 
merely displays the current records)
 .B
 .IP "\-n NAME, \-\-name=NAME"
-Name of the record to add/delete/display
+Label or name of the record to add/delete/display
 .B
 .IP "\-p, \-\-public"
 Create a record that is public (shared with other users that know the label)

Modified: gnunet/src/namestore/gnunet-namestore.c
===================================================================
--- gnunet/src/namestore/gnunet-namestore.c     2014-05-13 12:47:54 UTC (rev 
33259)
+++ gnunet/src/namestore/gnunet-namestore.c     2014-05-13 14:28:03 UTC (rev 
33260)
@@ -537,6 +537,88 @@
 
 
 /**
+ * We were asked to delete something; this function is called with
+ * the existing records. Now we should determine what should be
+ * deleted and then issue the deletion operation.
+ *
+ * @param cls NULL
+ * @param zone private key of the zone we are deleting from
+ * @param label name of the records we are editing
+ * @param rd_count size of the @a rd array
+ * @param rd existing records
+ */
+static void
+del_monitor (void *cls,
+             const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
+             const char *label,
+             unsigned int rd_count,
+             const struct GNUNET_GNSRECORD_Data *rd)
+{
+  struct GNUNET_GNSRECORD_Data rdx[rd_count];
+  unsigned int rd_left;
+  unsigned int i;
+  uint32_t type;
+  char *vs;
+
+  del_qe = NULL;
+  if (0 == rd_count)
+  {
+    FPRINTF (stderr,
+             _("There are no records under label `%s' that could be 
deleted.\n"),
+             label);
+    test_finished ();
+    return;
+  }
+  if ( (NULL == value) &&
+       (NULL == typestring) )
+  {
+    /* delete everything */
+    del_qe = GNUNET_NAMESTORE_records_store (ns,
+                                             &zone_pkey,
+                                             name,
+                                             0, NULL,
+                                             &del_continuation,
+                                             NULL);
+    return;
+  }
+  rd_left = 0;
+  if (NULL != typestring)
+    type = GNUNET_GNSRECORD_typename_to_number (typestring);
+  else
+    type = GNUNET_GNSRECORD_TYPE_ANY;
+  for (i=0;i<rd_count;i++)
+  {
+    vs = NULL;
+    if (! ( ( (GNUNET_GNSRECORD_TYPE_ANY == type) ||
+              (rd[i].record_type == type) ) &&
+            ( (NULL == value) ||
+              (NULL == (vs = (GNUNET_GNSRECORD_value_to_string 
(rd[i].record_type,
+                                                                rd[i].data,
+                                                                
rd[i].data_size)))) ||
+              (0 == strcmp (vs, value)) ) ) )
+      rdx[rd_left++] = rd[i];
+    GNUNET_free_non_null (vs);
+  }
+  if (rd_count == rd_left)
+  {
+    /* nothing got deleted */
+    FPRINTF (stderr,
+             _("There are no records under label `%s' that match the request 
for deletion.\n"),
+             label);
+    test_finished ();
+    return;
+  }
+  /* delete everything but what we copied to 'rdx' */
+  del_qe = GNUNET_NAMESTORE_records_store (ns,
+                                           &zone_pkey,
+                                           name,
+                                           rd_left, rdx,
+                                           &del_continuation,
+                                           NULL);
+}
+
+
+/**
  * Function called with the result from the check if the namestore
  * service is actually running.  If it is, we start the actual
  * operation.
@@ -675,12 +757,11 @@
       ret = 1;
       return;
     }
-    del_qe = GNUNET_NAMESTORE_records_store (ns,
-                                            &zone_pkey,
-                                            name,
-                                            0, NULL,
-                                            &del_continuation,
-                                            NULL);
+    del_qe = GNUNET_NAMESTORE_records_lookup (ns,
+                                              &zone_pkey,
+                                              name,
+                                              &del_monitor,
+                                              NULL);
   }
   if (list)
   {




reply via email to

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