*/
static struct GNUNET_NAMESTORE_QueueEntry *add_qe;
+/**
+ * Queue entry for the 'add-uri' operation.
+ */
+static struct GNUNET_NAMESTORE_QueueEntry *add_qe_uri;
+
/**
* Desired action is to list records.
*/
*/
static char *value;
+/**
+ * URI to import.
+ */
+static char *uri;
+
/**
* Type of the record to add/remove, NULL to remove all.
*/
*/
static char *expirationstring;
+/**
+ * Global return value
+ */
+static int ret;
+
/**
* Task run on shutdown. Cleans up everything.
do_shutdown (void *cls,
const struct GNUNET_SCHEDULER_TaskContext *tc)
{
+ if (NULL != list_it)
+ {
+ GNUNET_NAMESTORE_zone_iteration_stop (list_it);
+ list_it = NULL;
+ }
+ if (NULL != add_qe)
+ {
+ GNUNET_NAMESTORE_cancel (add_qe);
+ add_qe = NULL;
+ }
+ if (NULL != add_qe_uri)
+ {
+ GNUNET_NAMESTORE_cancel (add_qe_uri);
+ add_qe_uri = NULL;
+ }
+ if (NULL != del_qe)
+ {
+ GNUNET_NAMESTORE_cancel (del_qe);
+ del_qe = NULL;
+ }
if (NULL != ns)
{
- GNUNET_NAMESTORE_disconnect (ns, GNUNET_NO);
+ GNUNET_NAMESTORE_disconnect (ns);
ns = NULL;
}
if (NULL != zone_pkey)
GNUNET_CRYPTO_rsa_key_free (zone_pkey);
zone_pkey = NULL;
}
+ if (NULL != uri)
+ {
+ GNUNET_free (uri);
+ uri = NULL;
+ }
}
* Continuation called to notify client about result of the
* operation.
*
- * @param cls closure, unused
+ * @param cls closure, location of the QueueEntry pointer to NULL out
* @param success GNUNET_SYSERR on failure (including timeout/queue drop/failure to validate)
* GNUNET_NO if content was already there
* GNUNET_YES (or other positive value) on success
int32_t success,
const char *emsg)
{
- add_qe = NULL;
- if (success != GNUNET_YES)
+ struct GNUNET_NAMESTORE_QueueEntry **qe = cls;
+
+ *qe = NULL;
+ if (GNUNET_YES != success)
+ {
fprintf (stderr,
_("Adding record failed: %s\n"),
- (success == GNUNET_NO) ? "record exists" : emsg);
- if ( (NULL == del_qe) &&
+ (GNUNET_NO == success) ? "record exists" : emsg);
+ if (GNUNET_NO != success)
+ ret = 1;
+ }
+ if ( (NULL == add_qe) &&
+ (NULL == add_qe_uri) &&
+ (NULL == del_qe) &&
(NULL == list_it) )
GNUNET_SCHEDULER_shutdown ();
}
_("Deleting record failed: %s\n"),
emsg);
if ( (NULL == add_qe) &&
+ (NULL == add_qe_uri) &&
(NULL == list_it) )
GNUNET_SCHEDULER_shutdown ();
}
const char *typestring;
char *s;
unsigned int i;
+ char *etime;
+ struct GNUNET_TIME_Absolute aex;
+ struct GNUNET_TIME_Relative rex;
if (NULL == name)
{
list_it = NULL;
if ( (NULL == del_qe) &&
+ (NULL == add_qe_uri) &&
(NULL == add_qe) )
GNUNET_SCHEDULER_shutdown ();
return;
(unsigned int) rd[i].record_type);
continue;
}
- FPRINTF (stdout, "\t%s: %s\n", typestring, s);
+ if (0 != (rd[i].flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION))
+ {
+ rex.rel_value = rd[i].expiration_time;
+ etime = GNUNET_STRINGS_relative_time_to_string (rex);
+ }
+ else
+ {
+ aex.abs_value = rd[i].expiration_time;
+ etime = GNUNET_STRINGS_absolute_time_to_string (aex);
+ }
+ FPRINTF (stdout, "\t%s: %s (%s %s)\n", typestring, s,
+ (0 != (rd[i].flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION))
+ ? _(/* what follows is relative expiration */ "for at least")
+ : _(/* what follows is absolute expiration */ "until"),
+ etime);
+ GNUNET_free (etime);
GNUNET_free (s);
}
FPRINTF (stdout, "%s", "\n");
int etime_is_rel = GNUNET_SYSERR;
struct GNUNET_NAMESTORE_RecordData rd;
+ if ( (NULL != args[0]) && (NULL == uri) )
+ uri = GNUNET_strdup (args[0]);
if (NULL == keyfile)
{
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns",
- "ZONEKEY", &keyfile))
- {
- fprintf (stderr,
- _("Option `%s' not given, but I need a zone key file!\n"),
- "z");
- return;
- }
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns",
+ "ZONEKEY", &keyfile))
+ {
fprintf (stderr,
- _("Using default zone file `%s'\n"),
- keyfile);
+ _("Option `%s' not given, but I need a zone key file!\n"),
+ "z");
+ return;
+ }
+ fprintf (stderr,
+ _("Using default zone file `%s'\n"),
+ keyfile);
}
zone_pkey = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
GNUNET_free (keyfile);
keyfile = NULL;
- if (! (add|del|list))
+ if (! (add|del|list|(NULL != uri)))
{
/* nothing more to be done */
fprintf (stderr,
{
fprintf (stderr, _("Unsupported type `%s'\n"), typestring);
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
if ((NULL == typestring) && (add | del))
_("Missing option `%s' for operation `%s'\n"),
"-t", _("add/del"));
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
if (NULL != value)
value,
typestring);
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
} else if (add | del)
fprintf (stderr,
_("Missing option `%s' for operation `%s'\n"),
"-V", _("add/del"));
+ ret = 1;
GNUNET_SCHEDULER_shutdown ();
return;
}
_("Invalid time format `%s'\n"),
expirationstring);
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
}
_("Missing option `%s' for operation `%s'\n"),
"-e", _("add"));
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
+ memset (&rd, 0, sizeof (rd));
if (add)
{
if (NULL == name)
_("Missing option `%s' for operation `%s'\n"),
"-n", _("add"));
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
rd.data = data;
_("No valid expiration time for operation `%s'\n"),
_("add"));
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
if (1 != nonauthority)
name,
&rd,
&add_continuation,
- NULL);
+ &add_qe);
}
if (del)
{
_("Missing option `%s' for operation `%s'\n"),
"-n", _("del"));
GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
return;
}
rd.data = data;
list_it = GNUNET_NAMESTORE_zone_iteration_start (ns,
&zone,
- 0,
+ GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION,
must_not_flags,
&display_record,
NULL);
}
+ if (NULL != uri)
+ {
+ char sh[53];
+ char name[64];
+ struct GNUNET_CRYPTO_ShortHashCode sc;
+
+ if ( (2 != (sscanf (uri,
+ "gnunet://gns/%52s/%63s",
+ sh,
+ name)) ) ||
+ (GNUNET_OK !=
+ GNUNET_CRYPTO_short_hash_from_string (sh, &sc)) )
+ {
+ fprintf (stderr,
+ _("Invalid URI `%s'\n"),
+ uri);
+ GNUNET_SCHEDULER_shutdown ();
+ ret = 1;
+ return;
+ }
+ rd.data = ≻
+ rd.data_size = sizeof (struct GNUNET_CRYPTO_ShortHashCode);
+ rd.record_type = GNUNET_NAMESTORE_TYPE_PKEY;
+ if (GNUNET_YES == etime_is_rel)
+ {
+ rd.expiration_time = etime_rel.rel_value;
+ rd.flags |= GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION;
+ }
+ else if (GNUNET_NO == etime_is_rel)
+ rd.expiration_time = etime_abs.abs_value;
+ else
+ rd.expiration_time = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value;
+ if (1 != nonauthority)
+ rd.flags |= GNUNET_NAMESTORE_RF_AUTHORITY;
+
+ add_qe_uri = GNUNET_NAMESTORE_record_create (ns,
+ zone_pkey,
+ name,
+ &rd,
+ &add_continuation,
+ &add_qe_uri);
+ }
GNUNET_free_non_null (data);
}
{'t', "type", "TYPE",
gettext_noop ("type of the record to add/delete/display"), 1,
&GNUNET_GETOPT_set_string, &typestring},
+ {'u', "uri", "URI",
+ gettext_noop ("URI to import into our zone"), 1,
+ &GNUNET_GETOPT_set_string, &uri},
{'V', "value", "VALUE",
gettext_noop ("value of the record to add/delete"), 1,
&GNUNET_GETOPT_set_string, &value},
GNUNET_GETOPT_OPTION_END
};
- int ret;
-
if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
return 2;
GNUNET_log_setup ("gnunet-namestore", "WARNING", NULL);
- ret =
- (GNUNET_OK ==
- GNUNET_PROGRAM_run (argc, argv, "gnunet-namestore",
- _("GNUnet zone manipulation tool"),
- options,
- &run, NULL)) ? 0 : 1;
+ if (GNUNET_OK !=
+ GNUNET_PROGRAM_run (argc, argv, "gnunet-namestore",
+ _("GNUnet zone manipulation tool"),
+ options,
+ &run, NULL))
+ return 1;
return ret;
}