aboutsummaryrefslogtreecommitdiff
path: root/src/reclaim/gnunet-service-reclaim_tickets.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/reclaim/gnunet-service-reclaim_tickets.c')
-rw-r--r--src/reclaim/gnunet-service-reclaim_tickets.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/reclaim/gnunet-service-reclaim_tickets.c b/src/reclaim/gnunet-service-reclaim_tickets.c
index f93e934ee..033684f71 100644
--- a/src/reclaim/gnunet-service-reclaim_tickets.c
+++ b/src/reclaim/gnunet-service-reclaim_tickets.c
@@ -105,6 +105,47 @@ struct TicketIssueHandle
105 105
106}; 106};
107 107
108/**
109 * Ticket iterator
110 */
111struct RECLAIM_TICKETS_Iterator
112{
113 /**
114 * Issuer Key
115 */
116 struct GNUNET_CRYPTO_EcdsaPrivateKey identity;
117
118 /**
119 * Issuer pubkey
120 */
121 struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
122
123 /**
124 * Namestore queue entry
125 */
126 struct GNUNET_NAMESTORE_QueueEntry *ns_qe;
127
128 /**
129 * Iter callback
130 */
131 RECLAIM_TICKETS_TicketIter cb;
132
133 /**
134 * Iter cls
135 */
136 void *cb_cls;
137
138 /**
139 * Ticket reference list
140 */
141 struct TicketReference *tickets_head;
142
143 /**
144 * Ticket reference list
145 */
146 struct TicketReference *tickets_tail;
147};
148
108static struct GNUNET_NAMESTORE_Handle *nsh; 149static struct GNUNET_NAMESTORE_Handle *nsh;
109 150
110/** 151/**
@@ -440,6 +481,146 @@ RECLAIM_TICKETS_issue_ticket (const struct GNUNET_CRYPTO_EcdsaPrivateKey *identi
440} 481}
441 482
442 483
484static void
485cleanup_iter (struct RECLAIM_TICKETS_Iterator *iter)
486{
487 struct TicketReference *tr;
488 struct TicketReference *tr_tmp;
489 if (NULL != iter->ns_qe)
490 GNUNET_NAMESTORE_cancel (iter->ns_qe);
491 for (tr = iter->tickets_head; NULL != tr;)
492 {
493 if (NULL != tr->attrs)
494 GNUNET_RECLAIM_ATTRIBUTE_list_destroy (tr->attrs);
495 tr_tmp = tr;
496 tr = tr->next;
497 GNUNET_free (tr_tmp);
498 }
499 GNUNET_free (iter);
500}
501
502static void
503do_cleanup_iter (void* cls)
504{
505 struct RECLAIM_TICKETS_Iterator *iter = cls;
506 cleanup_iter (iter);
507}
508
509/**
510 * Perform ticket iteration step
511 *
512 * @param ti ticket iterator to process
513 */
514static void
515run_ticket_iteration_round (struct RECLAIM_TICKETS_Iterator *iter)
516{
517 struct TicketReference *tr;
518 if (NULL == iter->tickets_head)
519 {
520 //No more tickets
521 iter->cb (iter->cb_cls,
522 NULL);
523 GNUNET_SCHEDULER_add_now (&do_cleanup_iter, iter);
524 return;
525 }
526 tr = iter->tickets_head;
527 GNUNET_CONTAINER_DLL_remove (iter->tickets_head,
528 iter->tickets_tail,
529 tr);
530 iter->cb (iter->cb_cls,
531 &tr->ticket);
532 if (NULL != tr->attrs)
533 GNUNET_RECLAIM_ATTRIBUTE_list_destroy (tr->attrs);
534 GNUNET_free (tr);
535}
536
537static void
538collect_tickets_cb (void *cls,
539 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
540 const char *label,
541 unsigned int rd_count,
542 const struct GNUNET_GNSRECORD_Data *rd)
543{
544 struct RECLAIM_TICKETS_Iterator *iter = cls;
545 struct TicketReference *tr;
546 size_t attr_data_len;
547 const char* attr_data;
548 iter->ns_qe = NULL;
549
550 for (int i = 0; i < rd_count; i++)
551 {
552 if (GNUNET_GNSRECORD_TYPE_RECLAIM_TICKETREF != rd[i].record_type)
553 continue;
554 tr = GNUNET_new (struct TicketReference);
555 memcpy (&tr->ticket, rd[i].data,
556 sizeof (struct GNUNET_RECLAIM_Ticket));
557 if (0 != memcmp (&tr->ticket.identity,
558 &iter->identity_pub,
559 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
560 {
561 //Not our ticket
562 GNUNET_free (tr);
563 continue;
564 }
565 attr_data = rd[i].data + sizeof (struct GNUNET_RECLAIM_Ticket);
566 attr_data_len = rd[i].data_size - sizeof (struct GNUNET_RECLAIM_Ticket);
567 tr->attrs = GNUNET_RECLAIM_ATTRIBUTE_list_deserialize (attr_data,
568 attr_data_len);
569 GNUNET_CONTAINER_DLL_insert (iter->tickets_head,
570 iter->tickets_tail,
571 tr);
572 }
573 run_ticket_iteration_round (iter);
574}
575
576static void
577collect_tickets_error_cb (void *cls)
578{
579 struct RECLAIM_TICKETS_Iterator *iter = cls;
580 iter->ns_qe = NULL;
581 iter->cb (iter->cb_cls,
582 NULL);
583 cleanup_iter (iter);
584}
585
586void
587RECLAIM_TICKETS_iteration_next (struct RECLAIM_TICKETS_Iterator *iter)
588{
589 run_ticket_iteration_round (iter);
590}
591
592void
593RECLAIM_TICKETS_iteration_stop (struct RECLAIM_TICKETS_Iterator *iter)
594{
595 cleanup_iter (iter);
596}
597
598struct RECLAIM_TICKETS_Iterator*
599RECLAIM_TICKETS_iteration_start (const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
600 RECLAIM_TICKETS_TicketIter cb,
601 void* cb_cls)
602{
603 struct RECLAIM_TICKETS_Iterator *iter;
604
605 iter = GNUNET_new (struct RECLAIM_TICKETS_Iterator);
606 iter->identity = *identity;
607 GNUNET_CRYPTO_ecdsa_key_get_public (identity,
608 &iter->identity_pub);
609 iter->cb = cb;
610 iter->cb_cls = cb_cls;
611 iter->ns_qe = GNUNET_NAMESTORE_records_lookup (nsh,
612 identity,
613 GNUNET_GNS_EMPTY_LABEL_AT,
614 &collect_tickets_error_cb,
615 iter,
616 &collect_tickets_cb,
617 iter);
618 return iter;
619}
620
621
622
623
443int 624int
444RECLAIM_TICKETS_init (const struct GNUNET_CONFIGURATION_Handle *c) 625RECLAIM_TICKETS_init (const struct GNUNET_CONFIGURATION_Handle *c)
445{ 626{
@@ -453,3 +634,11 @@ RECLAIM_TICKETS_init (const struct GNUNET_CONFIGURATION_Handle *c)
453 } 634 }
454 return GNUNET_OK; 635 return GNUNET_OK;
455} 636}
637
638void
639RECLAIM_TICKETS_deinit (void)
640{
641 if (NULL != nsh)
642 GNUNET_NAMESTORE_disconnect (nsh);
643 nsh = NULL;
644}