+ struct GNUNET_IDENTITY_Operation *op;
+ struct GNUNET_IDENTITY_CreateRequestMessage *crm;
+ struct GNUNET_CRYPTO_EccPrivateKey *pk;
+ size_t slen;
+
+ slen = strlen (name) + 1;
+ pk = GNUNET_CRYPTO_ecc_key_create ();
+
+ if (slen >= GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (struct GNUNET_IDENTITY_CreateRequestMessage))
+ {
+ GNUNET_break (0);
+ GNUNET_free (pk);
+ return NULL;
+ }
+ op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) +
+ sizeof (struct GNUNET_IDENTITY_CreateRequestMessage) +
+ slen);
+ op->h = id;
+ op->cont = cont;
+ op->cls = cont_cls;
+ crm = (struct GNUNET_IDENTITY_CreateRequestMessage *) &op[1];
+ crm->header.type = htons (GNUNET_MESSAGE_TYPE_IDENTITY_CREATE);
+ crm->header.size = htons (sizeof (struct GNUNET_IDENTITY_CreateRequestMessage) +
+ slen);
+ crm->name_len = htons (slen);
+ crm->reserved = htons (0);
+ crm->private_key = *pk;
+ memcpy (&crm[1], name, slen);
+ op->msg = &crm->header;
+ GNUNET_CONTAINER_DLL_insert_tail (id->op_head,
+ id->op_tail,
+ op);
+ if (NULL == id->th)
+ transmit_next (id);
+ GNUNET_free (pk);
+ return op;