/*
This file is part of GNUnet.
- (C) 2012, 2013 Christian Grothoff (and other contributing authors)
+ (C) 2012, 2013, 2014 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
/**
* Is record public (opposite of #GNUNET_GNSRECORD_RF_PRIVATE)
*/
-static int public;
+static int is_public;
/**
* Is record a shadow record (#GNUNET_GNSRECORD_RF_SHADOW_RECORD)
*/
-static int shadow;
+static int is_shadow;
+
+/**
+ * Is record pending approval (#GNUNET_GNSRECORD_RF_PENDING)
+ */
+static int is_pending;
/**
* Queue entry for the 'del' operation.
rde->data = data;
rde->data_size = data_size;
rde->record_type = type;
- if (1 == shadow)
+ if (1 == is_shadow)
rde->flags |= GNUNET_GNSRECORD_RF_SHADOW_RECORD;
- if (1 != public)
+ if (1 != is_public)
rde->flags |= GNUNET_GNSRECORD_RF_PRIVATE;
+ if (1 == is_pending)
+ rde->flags |= GNUNET_GNSRECORD_RF_PENDING;
if (GNUNET_YES == etime_is_rel)
{
rde->expiration_time = etime_rel.rel_value_us;
}
+/**
+ * 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
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)
{
else
rd.expiration_time = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us;
- if (1 == shadow)
+ if (1 == is_shadow)
rd.flags |= GNUNET_GNSRECORD_RF_SHADOW_RECORD;
add_qe_uri = GNUNET_NAMESTORE_records_store (ns,
&zone_pkey,
int
main (int argc, char *const *argv)
{
- public = -1;
- shadow = -1;
+ is_public = -1;
+ is_pending = -1;
+ is_shadow = -1;
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
{'a', "add", NULL,
&GNUNET_GETOPT_set_string, &value},
{'p', "public", NULL,
gettext_noop ("create or list public record"), 0,
- &GNUNET_GETOPT_set_one, &public},
+ &GNUNET_GETOPT_set_one, &is_public},
+ {'P', "pending", NULL,
+ gettext_noop ("create record that is pending approval (and thus for now inactive)"), 0,
+ &GNUNET_GETOPT_set_one, &is_pending},
{'s', "shadow", NULL,
gettext_noop ("create shadow record (only valid if all other records of the same type have expired"), 0,
- &GNUNET_GETOPT_set_one, &shadow},
+ &GNUNET_GETOPT_set_one, &is_shadow},
{'z', "zone", "EGO",
gettext_noop ("name of the ego controlling the zone"), 1,
&GNUNET_GETOPT_set_string, &ego_name},