diff options
author | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2019-04-12 16:34:16 +0200 |
---|---|---|
committer | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2019-04-14 10:01:23 +0200 |
commit | dfe11b6b541b47c85cdf56e55ebb816d6793db31 (patch) | |
tree | b1c05be186902b4e510ab803e489094402b8149a /src/reclaim/gnunet-service-reclaim_tickets.c | |
parent | a12b8c2c4cbf952c8c305cde193bb25c13a0912b (diff) | |
download | gnunet-dfe11b6b541b47c85cdf56e55ebb816d6793db31.tar.gz gnunet-dfe11b6b541b47c85cdf56e55ebb816d6793db31.zip |
RECLAIM: Towards -sql
Diffstat (limited to 'src/reclaim/gnunet-service-reclaim_tickets.c')
-rw-r--r-- | src/reclaim/gnunet-service-reclaim_tickets.c | 189 |
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 | */ | ||
111 | struct 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 | |||
108 | static struct GNUNET_NAMESTORE_Handle *nsh; | 149 | static 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 | ||
484 | static void | ||
485 | cleanup_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 | |||
502 | static void | ||
503 | do_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 | */ | ||
514 | static void | ||
515 | run_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 | |||
537 | static void | ||
538 | collect_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 | |||
576 | static void | ||
577 | collect_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 | |||
586 | void | ||
587 | RECLAIM_TICKETS_iteration_next (struct RECLAIM_TICKETS_Iterator *iter) | ||
588 | { | ||
589 | run_ticket_iteration_round (iter); | ||
590 | } | ||
591 | |||
592 | void | ||
593 | RECLAIM_TICKETS_iteration_stop (struct RECLAIM_TICKETS_Iterator *iter) | ||
594 | { | ||
595 | cleanup_iter (iter); | ||
596 | } | ||
597 | |||
598 | struct RECLAIM_TICKETS_Iterator* | ||
599 | RECLAIM_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 | |||
443 | int | 624 | int |
444 | RECLAIM_TICKETS_init (const struct GNUNET_CONFIGURATION_Handle *c) | 625 | RECLAIM_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 | |||
638 | void | ||
639 | RECLAIM_TICKETS_deinit (void) | ||
640 | { | ||
641 | if (NULL != nsh) | ||
642 | GNUNET_NAMESTORE_disconnect (nsh); | ||
643 | nsh = NULL; | ||
644 | } | ||