#include "gnunet_dnsparser_lib.h"
#include "gnunet_arm_service.h"
#include "gnunet_signatures.h"
+#include "gnunet_gns_service.h"
#include "gnunet_namestore_service.h"
#include "namestore.h"
const char *emsg;
LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received `%s'\n",
- "RECORD_STORE_RESPONSE");
+ "Received `%s' with result %i\n",
+ "RECORD_STORE_RESPONSE",
+ ntohl (msg->op_result));
/* TODO: add actual error message from namestore to response... */
res = ntohl (msg->op_result);
if (GNUNET_SYSERR == res)
}
+/**
+ * Handle an incoming message of type
+ * #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP_RESPONSE
+ *
+ * @param qe the respective entry in the message queue
+ * @param msg the message we received
+ * @param size the message size
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error and we did NOT notify the client
+ */
+static int
+handle_lookup_result (struct GNUNET_NAMESTORE_QueueEntry *qe,
+ const struct LabelLookupResponseMessage *msg,
+ size_t size)
+{
+ const char *name;
+ const char *rd_tmp;
+ size_t exp_msg_len;
+ size_t msg_len;
+ size_t name_len;
+ size_t rd_len;
+ unsigned int rd_count;
+ int found;
+
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Received `%s'\n",
+ "RECORD_LOOKUP_RESULT");
+
+ rd_len = ntohs (msg->rd_len);
+ rd_count = ntohs (msg->rd_count);
+ msg_len = ntohs (msg->gns_header.header.size);
+ name_len = ntohs (msg->name_len);
+ found = ntohs (msg->found);
+ exp_msg_len = sizeof (struct LabelLookupResponseMessage) + name_len + rd_len;
+ if (msg_len != exp_msg_len)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ name = (const char *) &msg[1];
+ if ( (name_len > 0) &&
+ ('\0' != name[name_len -1]) )
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (GNUNET_NO == found)
+ {
+ /* label was not in namestore */
+ if (NULL != qe->proc)
+ qe->proc (qe->proc_cls,
+ &msg->private_key,
+ name,
+ 0, NULL);
+ return GNUNET_OK;
+ }
+
+ rd_tmp = &name[name_len];
+ {
+ struct GNUNET_GNSRECORD_Data rd[rd_count];
+
+ if (GNUNET_OK != GNUNET_GNSRECORD_records_deserialize(rd_len, rd_tmp, rd_count, rd))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (0 == name_len)
+ name = NULL;
+ if (NULL != qe->proc)
+ qe->proc (qe->proc_cls,
+ &msg->private_key,
+ name,
+ rd_count,
+ (rd_count > 0) ? rd : NULL);
+ }
+ return GNUNET_OK;
+}
+
+
/**
* Handle an incoming message of type
* #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT
case GNUNET_NO:
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Namestore has no result for zone to name mapping \n");
- break;
+ if (NULL != qe->proc)
+ qe->proc (qe->proc_cls, &msg->zone, NULL, 0, NULL);
+ return GNUNET_NO;
case GNUNET_YES:
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Namestore has result for zone to name mapping \n");
return GNUNET_SYSERR;
}
return handle_record_result (qe, (const struct RecordResultMessage *) msg, size);
+ case GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP_RESPONSE:
+ if (size < sizeof (struct LabelLookupResponseMessage))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ return handle_lookup_result (qe, (const struct LabelLookupResponseMessage *) msg, size);
default:
GNUNET_break (0);
return GNUNET_SYSERR;
* @param rd_count number of records in the 'rd' array
* @param rd array of records with data to store
* @param cont continuation to call when done
- * @param cont_cls closure for 'cont'
+ * @param cont_cls closure for @a cont
* @return handle to abort the request
*/
struct GNUNET_NAMESTORE_QueueEntry *
return qe;
}
+/**
+ * Set the desired nick name for a zone
+ *
+ * @param h handle to the namestore
+ * @param pkey private key of the zone
+ * @param nick the nick name to set
+ * @param cont continuation to call when done
+ * @param cont_cls closure for 'cont'
+ * @return handle to abort the request
+ */
+struct GNUNET_NAMESTORE_QueueEntry *
+GNUNET_NAMESTORE_set_nick (struct GNUNET_NAMESTORE_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const char *nick,
+ GNUNET_NAMESTORE_ContinuationWithStatus cont,
+ void *cont_cls)
+{
+ struct GNUNET_GNSRECORD_Data rd;
+
+ memset (&rd, 0, sizeof (rd));
+ rd.data = nick;
+ rd.data_size = strlen (nick) +1;
+ rd.record_type = GNUNET_GNSRECORD_TYPE_NICK;
+ rd.expiration_time = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us;
+ rd.flags |= GNUNET_GNSRECORD_RF_PRIVATE;
+ return GNUNET_NAMESTORE_records_store(h, pkey, GNUNET_GNS_MASTERZONE_STR, 1, &rd, cont, cont_cls);
+}
+
+
+/**
+ * Lookup an item in the namestore.
+ *
+ * @param h handle to the namestore
+ * @param pkey private key of the zone
+ * @param label name that is being mapped (at most 255 characters long)
+ * @param rm function to call with the result (with 0 records if we don't have that label)
+ * @param rm_cls closure for @a rm
+ * @return handle to abort the request
+ */
+struct GNUNET_NAMESTORE_QueueEntry *
+GNUNET_NAMESTORE_records_lookup (struct GNUNET_NAMESTORE_Handle *h,
+ const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+ const char *label,
+ GNUNET_NAMESTORE_RecordMonitor rm,
+ void *rm_cls)
+{
+ struct GNUNET_NAMESTORE_QueueEntry *qe;
+ struct PendingMessage *pe;
+ struct LabelLookupMessage * msg;
+ size_t msg_size;
+ size_t label_len;
+
+ GNUNET_assert (NULL != h);
+ GNUNET_assert (NULL != pkey);
+ GNUNET_assert (NULL != label);
+
+ if (1 == (label_len = strlen (label) + 1))
+ return NULL;
+
+ qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry);
+ qe->nsh = h;
+ qe->proc = rm;
+ qe->proc_cls = rm_cls;
+ qe->op_id = get_op_id(h);
+ GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, qe);
+
+ msg_size = sizeof (struct LabelLookupMessage) + label_len;
+ pe = GNUNET_malloc (sizeof (struct PendingMessage) + msg_size);
+ pe->size = msg_size;
+ msg = (struct LabelLookupMessage *) &pe[1];
+ msg->gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP);
+ msg->gns_header.header.size = htons (msg_size);
+ msg->gns_header.r_id = htonl (qe->op_id);
+ msg->zone = *pkey;
+ msg->label_len = htonl(label_len);
+ memcpy (&msg[1], label, label_len);
+
+ /* transmit message */
+ GNUNET_CONTAINER_DLL_insert_tail (h->pending_head, h->pending_tail, pe);
+ do_transmit (h);
+ return qe;
+}
+
/**
* Look for an existing PKEY delegation record for a given public key.