GNUnet 0.26.2-1-g232dc9ef2
 
Loading...
Searching...
No Matches
pq_result_helper.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet
3 Copyright (C) 2014-2024 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
26#include "platform.h"
27#include "gnunet_time_lib.h"
28#include "gnunet_common.h"
29#include "gnunet_util_lib.h"
30#include "gnunet_pq_lib.h"
31#include "pq.h"
32
35 bool *is_null)
36{
37 struct GNUNET_PQ_ResultSpec rsr;
38
39 rsr = rs;
40 rsr.is_nullable = true;
41 rsr.is_null = is_null;
42 return rsr;
43}
44
45
53static void
55 void *rd)
56{
57 void **dst = rd;
58
59 (void) cls;
60 if (NULL != *dst)
61 {
63 *dst = NULL;
64 }
65}
66
67
83 PGresult *result,
84 int row,
85 const char *fname,
86 size_t *dst_size,
87 void *dst)
88{
89 size_t len;
90 const char *res;
91 void *idst;
92 int fnum;
93
94 (void) cls;
95 *dst_size = 0;
96 *((void **) dst) = NULL;
97
98 fnum = PQfnumber (result,
99 fname);
100 if (fnum < 0)
101 {
102 GNUNET_break (0);
103 return GNUNET_SYSERR;
104 }
105 if (PQgetisnull (result,
106 row,
107 fnum))
108 return GNUNET_NO;
109 /* if a field is null, continue but
110 * remember that we now return a different result */
111 len = PQgetlength (result,
112 row,
113 fnum);
114 res = PQgetvalue (result,
115 row,
116 fnum);
117 GNUNET_assert (NULL != res);
118 *dst_size = len;
119 idst = GNUNET_malloc (len);
120 *((void **) dst) = idst;
121 GNUNET_memcpy (idst,
122 res,
123 len);
124 return GNUNET_OK;
125}
126
127
130 void **dst,
131 size_t *sptr)
132{
133 struct GNUNET_PQ_ResultSpec res = {
135 .cleaner = &clean_varsize_blob,
136 .dst = (void *) (dst),
137 .fname = name,
138 .result_size = sptr
139 };
140
141 return res;
142}
143
144
160 PGresult *result,
161 int row,
162 const char *fname,
163 size_t *dst_size,
164 void *dst)
165{
166 size_t len;
167 const char *res;
168 int fnum;
169
170 (void) cls;
171 fnum = PQfnumber (result,
172 fname);
173 if (fnum < 0)
174 {
175 GNUNET_break (0);
177 "Result does not have field %s\n",
178 fname);
179 return GNUNET_SYSERR;
180 }
181 if (PQgetisnull (result,
182 row,
183 fnum))
184 return GNUNET_NO;
185 /* if a field is null, continue but
186 * remember that we now return a different result */
187 len = PQgetlength (result,
188 row,
189 fnum);
190 if (*dst_size != len)
191 {
193 "Expected %u bytes for field `%s', got %u\n",
194 (unsigned int) *dst_size,
195 fname,
196 (unsigned int) len);
197 GNUNET_break (0);
198 return GNUNET_SYSERR;
199 }
200 res = PQgetvalue (result,
201 row,
202 fnum);
203 GNUNET_assert (NULL != res);
205 res,
206 len);
207 return GNUNET_OK;
208}
209
210
213 void *dst,
214 size_t dst_size)
215{
216 struct GNUNET_PQ_ResultSpec res = {
218 .dst = (dst),
220 .fname = name
221 };
222
223 return res;
224}
225
226
242 PGresult *result,
243 int row,
244 const char *fname,
245 size_t *dst_size,
246 void *dst)
247{
248 struct GNUNET_CRYPTO_RsaPublicKey **pk = dst;
249 size_t len;
250 const char *res;
251 int fnum;
252
253 (void) cls;
254 (void) dst_size;
255 *pk = NULL;
256 fnum = PQfnumber (result,
257 fname);
258 if (fnum < 0)
259 {
260 GNUNET_break (0);
261 return GNUNET_SYSERR;
262 }
263 if (PQgetisnull (result,
264 row,
265 fnum))
266 return GNUNET_NO;
267
268 /* if a field is null, continue but
269 * remember that we now return a different result */
270 len = PQgetlength (result,
271 row,
272 fnum);
273 res = PQgetvalue (result,
274 row,
275 fnum);
277 len);
278 if (NULL == *pk)
279 {
280 GNUNET_break (0);
281 return GNUNET_SYSERR;
282 }
283 return GNUNET_OK;
284}
285
286
294static void
296 void *rd)
297{
299
300 (void) cls;
301 if (NULL != *pk)
302 {
304 *pk = NULL;
305 }
306}
307
308
311 struct GNUNET_CRYPTO_RsaPublicKey **rsa)
312{
313 struct GNUNET_PQ_ResultSpec res = {
315 .cleaner = &clean_rsa_public_key,
316 .dst = (void *) rsa,
317 .fname = name
318 };
319
320 return res;
321}
322
323
339 PGresult *result,
340 int row,
341 const char *fname,
342 size_t *dst_size,
343 void *dst)
344{
345 struct GNUNET_CRYPTO_RsaSignature **sig = dst;
346 size_t len;
347 const void *res;
348 int fnum;
349
350 (void) cls;
351 (void) dst_size;
352 *sig = NULL;
353 fnum = PQfnumber (result,
354 fname);
355 if (fnum < 0)
356 {
357 GNUNET_break (0);
358 return GNUNET_SYSERR;
359 }
360 if (PQgetisnull (result,
361 row,
362 fnum))
363 return GNUNET_NO;
364 /* if a field is null, continue but
365 * remember that we now return a different result */
366 len = PQgetlength (result,
367 row,
368 fnum);
369 res = PQgetvalue (result,
370 row,
371 fnum);
373 len);
374 if (NULL == *sig)
375 {
376 GNUNET_break (0);
377 return GNUNET_SYSERR;
378 }
379 return GNUNET_OK;
380}
381
382
390static void
392 void *rd)
393{
394 struct GNUNET_CRYPTO_RsaSignature **sig = rd;
395
396 (void) cls;
397 if (NULL != *sig)
398 {
400 *sig = NULL;
401 }
402}
403
404
407 struct GNUNET_CRYPTO_RsaSignature **sig)
408{
409 struct GNUNET_PQ_ResultSpec res = {
411 .cleaner = &clean_rsa_signature,
412 .dst = (void *) sig,
413 .fname = name
414 };
415
416 return res;
417}
418
419
435 PGresult *result,
436 int row,
437 const char *fname,
438 size_t *dst_size,
439 void *dst)
440{
441 char **str = dst;
442 size_t len;
443 const char *res;
444 int fnum;
445
446 (void) cls;
447 (void) dst_size;
448 *str = NULL;
449 fnum = PQfnumber (result,
450 fname);
451 if (fnum < 0)
452 {
453 GNUNET_break (0);
454 return GNUNET_SYSERR;
455 }
456 if (PQgetisnull (result,
457 row,
458 fnum))
459 return GNUNET_NO;
460 /* if a field is null, continue but
461 * remember that we now return a different result */
462 len = PQgetlength (result,
463 row,
464 fnum);
465 res = PQgetvalue (result,
466 row,
467 fnum);
469 len);
470 if (NULL == *str)
471 {
472 GNUNET_break (0);
473 return GNUNET_SYSERR;
474 }
475 return GNUNET_OK;
476}
477
478
486static void
488 void *rd)
489{
490 char **str = rd;
491
492 (void) cls;
493 if (NULL != *str)
494 {
495 GNUNET_free (*str);
496 *str = NULL;
497 }
498}
499
500
503 char **dst)
504{
505 struct GNUNET_PQ_ResultSpec res = {
507 .cleaner = &clean_string,
508 .dst = (void *) dst,
509 .fname = (name)
510 };
511
512 return res;
513}
514
515
531 PGresult *result,
532 int row,
533 const char *fname,
534 size_t *dst_size,
535 void *dst)
536{
537 bool *b = dst;
538 const uint8_t *res;
539 int fnum;
540 size_t len;
541
542 (void) cls;
543 (void) dst_size;
544 fnum = PQfnumber (result,
545 fname);
546 if (fnum < 0)
547 {
548 GNUNET_break (0);
549 return GNUNET_SYSERR;
550 }
551 if (PQgetisnull (result,
552 row,
553 fnum))
554 return GNUNET_NO;
555 /* if a field is null, continue but
556 * remember that we now return a different result */
557 len = PQgetlength (result,
558 row,
559 fnum);
560 if (sizeof (uint8_t) != len)
561 {
562 GNUNET_break (0);
563 return GNUNET_SYSERR;
564 }
565 res = (const uint8_t *) PQgetvalue (result,
566 row,
567 fnum);
568 *b = (0 != *res);
569 return GNUNET_OK;
570}
571
572
575 bool *dst)
576{
577 struct GNUNET_PQ_ResultSpec res = {
578 .conv = &extract_bool,
579 .dst = (void *) dst,
580 .fname = name
581 };
582
583 return res;
584}
585
586
602 PGresult *result,
603 int row,
604 const char *fname,
605 size_t *dst_size,
606 void *dst)
607{
608 struct GNUNET_TIME_Relative *udst = dst;
609 const int64_t *res;
610 int fnum;
611
612 (void) cls;
613 fnum = PQfnumber (result,
614 fname);
615 if (fnum < 0)
616 {
617 GNUNET_break (0);
618 return GNUNET_SYSERR;
619 }
620 if (PQgetisnull (result,
621 row,
622 fnum))
623 return GNUNET_NO;
624 GNUNET_assert (NULL != dst);
625 if (sizeof(struct GNUNET_TIME_Relative) != *dst_size)
626 {
627 GNUNET_break (0);
628 return GNUNET_SYSERR;
629 }
630 if (sizeof(int64_t) !=
631 PQgetlength (result,
632 row,
633 fnum))
634 {
635 GNUNET_break (0);
636 return GNUNET_SYSERR;
637 }
638 res = (int64_t *) PQgetvalue (result,
639 row,
640 fnum);
641 if (INT64_MAX == GNUNET_ntohll ((uint64_t) *res))
643 else
644 udst->rel_value_us = GNUNET_ntohll ((uint64_t) *res);
645 return GNUNET_OK;
646}
647
648
651 struct GNUNET_TIME_Relative *rt)
652{
653 struct GNUNET_PQ_ResultSpec res = {
655 .dst = (void *) rt,
656 .dst_size = sizeof(*rt),
657 .fname = name
658 };
659
660 return res;
661}
662
663
679 PGresult *result,
680 int row,
681 const char *fname,
682 size_t *dst_size,
683 void *dst)
684{
685 struct GNUNET_TIME_Absolute *udst = dst;
686 const int64_t *res;
687 int fnum;
688
689 (void) cls;
690 fnum = PQfnumber (result,
691 fname);
692 if (fnum < 0)
693 {
694 GNUNET_break (0);
695 return GNUNET_SYSERR;
696 }
697 if (PQgetisnull (result,
698 row,
699 fnum))
700 return GNUNET_NO;
701 GNUNET_assert (NULL != dst);
702 if (sizeof(struct GNUNET_TIME_Absolute) != *dst_size)
703 {
704 GNUNET_break (0);
705 return GNUNET_SYSERR;
706 }
707 if (sizeof(int64_t) !=
708 PQgetlength (result,
709 row,
710 fnum))
711 {
712 GNUNET_break (0);
713 return GNUNET_SYSERR;
714 }
715 res = (int64_t *) PQgetvalue (result,
716 row,
717 fnum);
718 if (INT64_MAX == GNUNET_ntohll ((uint64_t) *res))
720 else
721 udst->abs_value_us = GNUNET_ntohll ((uint64_t) *res);
722 return GNUNET_OK;
723}
724
725
728 struct GNUNET_TIME_Absolute *at)
729{
730 struct GNUNET_PQ_ResultSpec res = {
732 .dst = (void *) at,
733 .dst_size = sizeof(*at),
734 .fname = name
735 };
736
737 return res;
738}
739
740
743 struct GNUNET_TIME_AbsoluteNBO *at)
744{
747 &at->abs_value_us__);
748
749 return res;
750}
751
752
768 PGresult *result,
769 int row,
770 const char *fname,
771 size_t *dst_size,
772 void *dst)
773{
774 struct GNUNET_TIME_Timestamp *udst = dst;
775 struct GNUNET_TIME_Absolute abs;
776 const int64_t *res;
777 int fnum;
778
779 (void) cls;
780 fnum = PQfnumber (result,
781 fname);
782 if (fnum < 0)
783 {
784 GNUNET_break (0);
785 return GNUNET_SYSERR;
786 }
787 if (PQgetisnull (result,
788 row,
789 fnum))
790 return GNUNET_NO;
791 GNUNET_assert (NULL != dst);
792 if (sizeof(struct GNUNET_TIME_Absolute) != *dst_size)
793 {
794 GNUNET_break (0);
795 return GNUNET_SYSERR;
796 }
797 if (sizeof(int64_t) !=
798 PQgetlength (result,
799 row,
800 fnum))
801 {
802 GNUNET_break (0);
803 return GNUNET_SYSERR;
804 }
805 res = (int64_t *) PQgetvalue (result,
806 row,
807 fnum);
808 if (INT64_MAX == GNUNET_ntohll ((uint64_t) *res))
809 {
811 }
812 else
813 {
814 abs.abs_value_us = GNUNET_ntohll ((uint64_t) *res);
815 if (0 != abs.abs_value_us % GNUNET_TIME_UNIT_SECONDS.rel_value_us)
816 {
817 /* timestamps must be multiple of seconds! */
818 GNUNET_break (0);
819 return GNUNET_SYSERR;
820 }
821 }
822 udst->abs_time = abs;
823 return GNUNET_OK;
824}
825
826
829 struct GNUNET_TIME_Timestamp *at)
830{
831 struct GNUNET_PQ_ResultSpec res = {
833 .dst = (void *) at,
834 .dst_size = sizeof(*at),
835 .fname = name
836 };
837
838 return res;
839}
840
841
857 PGresult *result,
858 int row,
859 const char *fname,
860 size_t *dst_size,
861 void *dst)
862{
863 struct GNUNET_TIME_TimestampNBO *udst = dst;
866
867 (void) cls;
868 r = extract_timestamp (NULL,
869 result,
870 row,
871 fname,
872 dst_size,
873 &t);
874 if (GNUNET_OK != r)
875 return r;
877 return r;
878}
879
880
883 struct GNUNET_TIME_TimestampNBO *at)
884{
885 struct GNUNET_PQ_ResultSpec res = {
887 .dst = (void *) at,
888 .dst_size = sizeof(*at),
889 .fname = name
890 };
891
892 return res;
893}
894
895
911 PGresult *result,
912 int row,
913 const char *fname,
914 size_t *dst_size,
915 void *dst)
916{
917 uint16_t *udst = dst;
918 const uint16_t *res;
919 int fnum;
920
921 (void) cls;
922 fnum = PQfnumber (result,
923 fname);
924 if (fnum < 0)
925 {
926 GNUNET_break (0);
927 return GNUNET_SYSERR;
928 }
929 if (PQgetisnull (result,
930 row,
931 fnum))
932 return GNUNET_NO;
933 GNUNET_assert (NULL != dst);
934 if (sizeof(uint16_t) != *dst_size)
935 {
936 GNUNET_break (0);
937 return GNUNET_SYSERR;
938 }
939 if (sizeof(uint16_t) !=
940 PQgetlength (result,
941 row,
942 fnum))
943 {
944 GNUNET_break (0);
945 return GNUNET_SYSERR;
946 }
947 res = (uint16_t *) PQgetvalue (result,
948 row,
949 fnum);
950 *udst = ntohs (*res);
951 return GNUNET_OK;
952}
953
954
957 uint16_t *u16)
958{
959 struct GNUNET_PQ_ResultSpec res = {
961 .dst = (void *) u16,
962 .dst_size = sizeof(*u16),
963 .fname = name
964 };
965
966 return res;
967}
968
969
985 PGresult *result,
986 int row,
987 const char *fname,
988 size_t *dst_size,
989 void *dst)
990{
991 uint32_t *udst = dst;
992 const uint32_t *res;
993 int fnum;
994
995 (void) cls;
996 fnum = PQfnumber (result,
997 fname);
998 if (fnum < 0)
999 {
1000 GNUNET_break (0);
1001 return GNUNET_SYSERR;
1002 }
1003 if (PQgetisnull (result,
1004 row,
1005 fnum))
1006 return GNUNET_NO;
1007 GNUNET_assert (NULL != dst);
1008 if (sizeof(uint32_t) != *dst_size)
1009 {
1010 GNUNET_break (0);
1011 return GNUNET_SYSERR;
1012 }
1013 if (sizeof(uint32_t) !=
1014 PQgetlength (result,
1015 row,
1016 fnum))
1017 {
1018 GNUNET_break (0);
1019 return GNUNET_SYSERR;
1020 }
1021 res = (uint32_t *) PQgetvalue (result,
1022 row,
1023 fnum);
1024 *udst = ntohl (*res);
1025 return GNUNET_OK;
1026}
1027
1028
1031 uint32_t *u32)
1032{
1033 struct GNUNET_PQ_ResultSpec res = {
1034 .conv = &extract_uint32,
1035 .dst = (void *) u32,
1036 .dst_size = sizeof(*u32),
1037 .fname = name
1038 };
1039
1040 return res;
1041}
1042
1043
1057static enum GNUNET_GenericReturnValue
1059 PGresult *result,
1060 int row,
1061 const char *fname,
1062 size_t *dst_size,
1063 void *dst)
1064{
1065 uint64_t *udst = dst;
1066 const uint64_t *res;
1067 int fnum;
1068
1069 (void) cls;
1070 fnum = PQfnumber (result,
1071 fname);
1072 if (fnum < 0)
1073 {
1075 "Field %s missing in result\n",
1076 fname);
1077 GNUNET_break (0);
1078 return GNUNET_SYSERR;
1079 }
1080 if (PQgetisnull (result,
1081 row,
1082 fnum))
1083 return GNUNET_NO;
1084
1085 GNUNET_assert (NULL != dst);
1086 if (sizeof(uint64_t) != *dst_size)
1087 {
1088 GNUNET_break (0);
1089 return GNUNET_SYSERR;
1090 }
1091 if (sizeof(uint64_t) !=
1092 PQgetlength (result,
1093 row,
1094 fnum))
1095 {
1096 GNUNET_break (0);
1098 "Got length %u for field `%s'\n",
1099 PQgetlength (result,
1100 row,
1101 fnum),
1102 fname);
1103 return GNUNET_SYSERR;
1104 }
1105 res = (uint64_t *) PQgetvalue (result,
1106 row,
1107 fnum);
1108 *udst = GNUNET_ntohll (*res);
1109 return GNUNET_OK;
1110}
1111
1112
1115 uint64_t *u64)
1116{
1117 struct GNUNET_PQ_ResultSpec res = {
1118 .conv = &extract_uint64,
1119 .dst = (void *) u64,
1120 .dst_size = sizeof(*u64),
1121 .fname = name
1122 };
1123
1124 return res;
1125}
1126
1127
1141static enum GNUNET_GenericReturnValue
1143 PGresult *result,
1144 int row,
1145 const char *fname,
1146 size_t *dst_size,
1147 void *dst)
1148{
1149 int64_t *udst = dst;
1150 const int64_t *res;
1151 int fnum;
1152
1153 (void) cls;
1154 fnum = PQfnumber (result,
1155 fname);
1156 if (fnum < 0)
1157 {
1159 "Field %s missing in result\n",
1160 fname);
1161 GNUNET_break (0);
1162 return GNUNET_SYSERR;
1163 }
1164 if (PQgetisnull (result,
1165 row,
1166 fnum))
1167 return GNUNET_NO;
1168
1169 GNUNET_assert (NULL != dst);
1170 if (sizeof(int64_t) != *dst_size)
1171 {
1172 GNUNET_break (0);
1173 return GNUNET_SYSERR;
1174 }
1175 if (sizeof(int64_t) !=
1176 PQgetlength (result,
1177 row,
1178 fnum))
1179 {
1180 GNUNET_break (0);
1182 "Got length %u for field `%s'\n",
1183 PQgetlength (result,
1184 row,
1185 fnum),
1186 fname);
1187 return GNUNET_SYSERR;
1188 }
1189 res = (int64_t *) PQgetvalue (result,
1190 row,
1191 fnum);
1192 *udst = GNUNET_ntohll (*res);
1193 return GNUNET_OK;
1194}
1195
1196
1199 int64_t *i64)
1200{
1201 struct GNUNET_PQ_ResultSpec res = {
1202 .conv = &extract_int64,
1203 .dst = (void *) i64,
1204 .dst_size = sizeof(*i64),
1205 .fname = name
1206 };
1207
1208 return res;
1209}
1210
1211
1217{
1218 /* Oid of the expected type, must match the oid in the header of the PQResult struct */
1219 Oid oid;
1220
1221 /* Target type */
1223
1224 /* If not 0, defines the expected size of each entry */
1226
1227 /* Out-pointer to write the number of elements in the array */
1228 size_t *num;
1229
1230 /* Out-pointer. If @a typ is array_of_byte and @a same_size is 0,
1231 * allocate and put the array of @a num sizes here. NULL otherwise */
1232 size_t **sizes;
1233
1234 /* If true, allow NULL as value for an element in the array */
1236
1237 /* * Out-pointer. When @a allow_nulls is set to true, this is the
1238 * location where to put the array allocated to contain @a num bools,
1239 * representing the positions of NULL entries in the array. */
1240 bool **is_nulls;
1241};
1242
1243
1259static enum GNUNET_GenericReturnValue
1261 void *cls,
1262 PGresult *result,
1263 int row,
1264 const char *fname,
1265 size_t *dst_size,
1266 void *dst)
1267{
1268 const struct array_result_cls *info = cls;
1269 int data_sz;
1270 char *data;
1271 void *out = NULL;
1272 struct pq_array_header header;
1273 int col_num;
1274
1275 GNUNET_assert (NULL != dst);
1276 *((void **) dst) = NULL;
1277
1278#define FAIL_IF(cond) \
1279 do { \
1280 if ((cond)) \
1281 { \
1282 GNUNET_break (! (cond)); \
1283 goto FAIL; \
1284 } \
1285 } while (0)
1286
1287 col_num = PQfnumber (result, fname);
1288 FAIL_IF (0 > col_num);
1289
1290 data_sz = PQgetlength (result, row, col_num);
1291 FAIL_IF (0 > data_sz);
1292
1293 /* Report if this field is empty */
1294 if (0 == (size_t) data_sz)
1295 return GNUNET_NO;
1296
1297 data = PQgetvalue (result, row, col_num);
1298
1299 if (sizeof(header) > (size_t) data_sz)
1300 {
1301 uint32_t ndim;
1302
1303 /* data_sz is shorter than header if the
1304 array length is 0, in which case ndim is 0! */
1305 FAIL_IF (sizeof(uint32_t) > (size_t) data_sz);
1306 memcpy (&ndim,
1307 data,
1308 sizeof (ndim));
1309 FAIL_IF (0 != ndim);
1310 *info->num = 0;
1311 return GNUNET_OK;
1312 }
1313 FAIL_IF (sizeof(header) > (size_t) data_sz);
1314 FAIL_IF (NULL == data);
1315
1316 {
1317 struct pq_array_header *h =
1318 (struct pq_array_header *) data;
1319
1320 header.ndim = ntohl (h->ndim);
1321 header.has_nulls = ntohl (h->has_nulls);
1322 header.oid = ntohl (h->oid);
1323 header.dim = ntohl (h->dim);
1324 header.lbound = ntohl (h->lbound);
1325
1326 FAIL_IF (1 != header.ndim);
1327 FAIL_IF (INT_MAX <= header.dim);
1328 FAIL_IF ((0 != header.has_nulls) && ! info->allow_nulls);
1329 FAIL_IF (1 != header.lbound);
1330 FAIL_IF (info->oid != header.oid);
1331 }
1332
1333 if (NULL != info->num)
1334 *info->num = header.dim;
1335
1336 /* Prepare the array of bools, marking NULL elements */
1337 if (info->allow_nulls)
1338 *info->is_nulls = GNUNET_new_array (header.dim, bool);
1339
1340 {
1341 char *in = data + sizeof(header);
1342
1343#define HANDLE_ELEMENT(typ, conv, access) \
1344 do { \
1345 int32_t sz = ntohl (*(int32_t *) in); \
1346\
1347 in += sizeof(uint32_t); \
1348 if (-1 != sz) \
1349 { \
1350 FAIL_IF (sz != sizeof(typ)); \
1351 access (typ, conv); \
1352 in += sz; \
1353 } \
1354 else \
1355 { \
1356 FAIL_IF (! info->allow_nulls); \
1357 (*info->is_nulls)[i] = true; \
1358 } \
1359\
1360 out += sizeof(typ); \
1361 } while (0)
1362
1363#define HANDLE_ARRAY(typ, conv, access) \
1364 do { \
1365 if (NULL != dst_size) \
1366 *dst_size = sizeof(typ) *(header.dim); \
1367 out = GNUNET_new_array (header.dim, typ); \
1368 *((void **) dst) = out; \
1369 for (uint32_t i = 0; i < header.dim; i++) \
1370 { \
1371 HANDLE_ELEMENT (typ, conv, access); \
1372 } \
1373 } while (0)
1374
1375#define DEREF(typ, conv) \
1376 *(typ *) out = conv (*(typ *) in)
1377
1378#define ACCESS_ABS(typ, conv) \
1379 ((typ *) out)->abs_value_us = conv (*(uint64_t *) in)
1380
1381#define ACCESS_REL(typ, conv) \
1382 ((typ *) out)->rel_value_us = conv (*(uint64_t *) in)
1383
1384#define ACCESS_TSTMP(typ, conv) \
1385 ((typ *) out)->abs_time.abs_value_us = conv (*(uint64_t *) in)
1386
1387 switch (info->typ)
1388 {
1389 case array_of_bool:
1390 HANDLE_ARRAY (bool, /* no conv */, DEREF);
1391 break;
1392 case array_of_uint16:
1393 HANDLE_ARRAY (uint16_t, ntohs, DEREF);
1394 break;
1395 case array_of_uint32:
1396 HANDLE_ARRAY (uint32_t, ntohl, DEREF);
1397 break;
1398 case array_of_uint64:
1399 HANDLE_ARRAY (uint64_t, GNUNET_ntohll, DEREF);
1400 break;
1401 case array_of_abs_time:
1404 ACCESS_ABS);
1405 break;
1406 case array_of_rel_time:
1409 ACCESS_REL);
1410 break;
1411 case array_of_timestamp:
1414 ACCESS_TSTMP);
1415 break;
1416 case array_of_byte:
1417 if (0 == info->same_size)
1418 *info->sizes = GNUNET_new_array (header.dim, size_t);
1419 /* fallthrough */
1420 case array_of_string:
1421 {
1422 size_t total_sz = 0;
1423 bool is_string = (array_of_string == info->typ);
1430 uint32_t elem_sz[header.dim];
1437 uint32_t in_adv[header.dim];
1438 bool is_null[header.dim];
1439
1440 memset (elem_sz, 0, sizeof(elem_sz));
1441 memset (in_adv, 0, sizeof(in_adv));
1442 memset (is_null, 0, sizeof(is_null));
1443
1444 /* first, calculate total size required for allocation */
1445 for (uint32_t i = 0; i < header.dim; i++)
1446 {
1447 int32_t sz = ntohl (*(int32_t *) in);
1448
1449 if (-1 == sz) /* signifies NULL entry */
1450 {
1451 FAIL_IF (! info->allow_nulls);
1452 is_null[i] = true;
1453 elem_sz[i] = info->same_size ? info->same_size : 0;
1454 in_adv[i] = 0;
1455 }
1456 else
1457 {
1458 FAIL_IF (0 > sz);
1459 elem_sz[i] = sz;
1460 in_adv[i] = sz;
1461 }
1462 FAIL_IF (info->same_size &&
1463 (elem_sz[i] != info->same_size));
1464
1465 if (info->allow_nulls)
1466 (*info->is_nulls)[i] = is_null[i];
1467
1468 if ((! is_string) &&
1469 (! info->same_size))
1470 (*info->sizes)[i] = elem_sz[i];
1471
1472 total_sz += elem_sz[i];
1473 /* add room for terminator for non-NULL entry of type string */
1474 total_sz += (is_string && ! is_null[i]) ? 1 : 0;
1475 in += sizeof(int32_t);
1476 in += in_adv[i];
1477
1478 FAIL_IF (total_sz < elem_sz[i]);
1479 }
1480
1481 FAIL_IF ((! info->allow_nulls) && (0 == total_sz));
1482 if (NULL != dst_size)
1483 *dst_size = total_sz;
1484
1485 out = GNUNET_malloc (total_sz);
1486 *((void **) dst) = out;
1487 in = data + sizeof(header); /* reset to beginning of input */
1488
1489 /* Finally, copy the data */
1490 for (uint32_t i = 0; i < header.dim; i++)
1491 {
1492 in += sizeof(uint32_t); /* skip length */
1493 if (! is_null[i])
1494 GNUNET_memcpy (out, in, elem_sz[i]);
1495
1496 in += in_adv[i];
1497 out += elem_sz[i];
1498 out += (is_string && ! is_null[i]) ? 1 : 0;
1499 }
1500 break;
1501 }
1502 default:
1503 FAIL_IF (1 != 0);
1504 }
1505 }
1506
1507 return GNUNET_OK;
1508
1509FAIL:
1510 GNUNET_free (*(void **) dst);
1511 return GNUNET_SYSERR;
1512#undef FAIL_IF
1513#undef DEREF
1514#undef ACCESS_ABS
1515#undef ACCESS_REL
1516#undef ACCESS_TSTMP
1517#undef HANDLE_ARRAY
1518#undef HANDLE_ELEMENT
1519}
1520
1521
1524 struct GNUNET_PQ_ResultSpec rs,
1525 bool **is_nulls)
1526{
1527 struct GNUNET_PQ_ResultSpec rsr;
1528 struct array_result_cls *info = rs.cls;
1529
1531 GNUNET_assert (NULL != is_nulls);
1532 info->allow_nulls = true;
1533 info->is_nulls = is_nulls;
1534
1535 rsr = rs;
1536 return rsr;
1537}
1538
1539
1543static void
1544array_cleanup (void *cls,
1545 void *rd)
1546{
1547
1548 struct array_result_cls *info = cls;
1549 void **dst = rd;
1550
1551 if ((array_of_byte == info->typ) &&
1552 (0 == info->same_size) &&
1553 (NULL != info->sizes))
1554 GNUNET_free (*(info->sizes));
1555
1556 if (info->allow_nulls)
1557 GNUNET_free (*info->is_nulls);
1558
1559 GNUNET_free (cls);
1560 GNUNET_free (*dst);
1561 *dst = NULL;
1562}
1563
1564
1567 struct GNUNET_PQ_Context *db,
1568 const char *name,
1569 size_t *num,
1570 bool **dst)
1571{
1572 struct array_result_cls *info =
1574
1575 info->num = num;
1576 info->typ = array_of_bool;
1579 "bool",
1580 &info->oid));
1581
1582 {
1583 struct GNUNET_PQ_ResultSpec res = {
1585 .cleaner = array_cleanup,
1586 .dst = (void *) dst,
1587 .fname = name,
1588 .cls = info
1589 };
1590 return res;
1591 }
1592}
1593
1594
1597 struct GNUNET_PQ_Context *db,
1598 const char *name,
1599 size_t *num,
1600 uint16_t **dst)
1601{
1602 struct array_result_cls *info =
1604
1605 info->num = num;
1606 info->typ = array_of_uint16;
1609 "int2",
1610 &info->oid));
1611
1612 {
1613 struct GNUNET_PQ_ResultSpec res = {
1615 .cleaner = array_cleanup,
1616 .dst = (void *) dst,
1617 .fname = name,
1618 .cls = info
1619 };
1620 return res;
1621 }
1622}
1623
1624
1627 struct GNUNET_PQ_Context *db,
1628 const char *name,
1629 size_t *num,
1630 uint32_t **dst)
1631{
1632 struct array_result_cls *info =
1634
1635 info->num = num;
1636 info->typ = array_of_uint32;
1639 "int4",
1640 &info->oid));
1641
1642 {
1643 struct GNUNET_PQ_ResultSpec res = {
1645 .cleaner = array_cleanup,
1646 .dst = (void *) dst,
1647 .fname = name,
1648 .cls = info
1649 };
1650 return res;
1651 }
1652}
1653
1654
1657 struct GNUNET_PQ_Context *db,
1658 const char *name,
1659 size_t *num,
1660 uint64_t **dst)
1661{
1662 struct array_result_cls *info =
1664
1665 info->num = num;
1666 info->typ = array_of_uint64;
1669 "int8",
1670 &info->oid));
1671
1672 {struct GNUNET_PQ_ResultSpec res = {
1674 .cleaner = array_cleanup,
1675 .dst = (void *) dst,
1676 .fname = name,
1677 .cls = info
1678 };
1679 return res;}
1680}
1681
1682
1685 struct GNUNET_PQ_Context *db,
1686 const char *name,
1687 size_t *num,
1688 struct GNUNET_TIME_Absolute **dst)
1689{
1690 struct array_result_cls *info =
1692
1693 info->num = num;
1694 info->typ = array_of_abs_time;
1697 "int8",
1698 &info->oid));
1699
1700 {struct GNUNET_PQ_ResultSpec res = {
1702 .cleaner = array_cleanup,
1703 .dst = (void *) dst,
1704 .fname = name,
1705 .cls = info
1706 };
1707 return res;}
1708}
1709
1710
1713 struct GNUNET_PQ_Context *db,
1714 const char *name,
1715 size_t *num,
1716 struct GNUNET_TIME_Relative **dst)
1717{
1718 struct array_result_cls *info =
1720
1721 info->num = num;
1722 info->typ = array_of_rel_time;
1725 "int8",
1726 &info->oid));
1727
1728 {
1729 struct GNUNET_PQ_ResultSpec res = {
1731 .cleaner = array_cleanup,
1732 .dst = (void *) dst,
1733 .fname = name,
1734 .cls = info
1735 };
1736 return res;
1737 }
1738}
1739
1740
1743 struct GNUNET_PQ_Context *db,
1744 const char *name,
1745 size_t *num,
1746 struct GNUNET_TIME_Timestamp **dst)
1747{
1748 struct array_result_cls *info =
1750
1751 info->num = num;
1752 info->typ = array_of_timestamp;
1755 "int8",
1756 &info->oid));
1757
1758 {
1759 struct GNUNET_PQ_ResultSpec res = {
1761 .cleaner = array_cleanup,
1762 .dst = (void *) dst,
1763 .fname = name,
1764 .cls = info
1765 };
1766 return res;
1767 }
1768}
1769
1770
1773 struct GNUNET_PQ_Context *db,
1774 const char *name,
1775 size_t *num,
1776 size_t **sizes,
1777 void **dst)
1778{
1779 struct array_result_cls *info =
1781
1782 info->num = num;
1783 info->sizes = sizes;
1784 info->typ = array_of_byte;
1787 "bytea",
1788 &info->oid));
1789
1790 {
1791 struct GNUNET_PQ_ResultSpec res = {
1793 .cleaner = array_cleanup,
1794 .dst = (void *) dst,
1795 .fname = name,
1796 .cls = info
1797 };
1798 return res;
1799 }
1800}
1801
1802
1805 struct GNUNET_PQ_Context *db,
1806 const char *name,
1807 size_t size,
1808 size_t *num,
1809 void **dst)
1810{
1811 struct array_result_cls *info =
1813
1814 info->num = num;
1815 info->same_size = size;
1816 info->typ = array_of_byte;
1819 "bytea",
1820 &info->oid));
1821
1822 {
1823 struct GNUNET_PQ_ResultSpec res = {
1825 .cleaner = array_cleanup,
1826 .dst = (void *) dst,
1827 .fname = name,
1828 .cls = info
1829 };
1830 return res;
1831 }
1832}
1833
1834
1837 struct GNUNET_PQ_Context *db,
1838 const char *name,
1839 size_t *num,
1840 char **dst)
1841{
1842 struct array_result_cls *info =
1844
1845 info->num = num;
1846 info->typ = array_of_string;
1849 "text",
1850 &info->oid));
1851
1852 {
1853 struct GNUNET_PQ_ResultSpec res = {
1855 .cleaner = array_cleanup,
1856 .dst = (void *) dst,
1857 .fname = name,
1858 .cls = info
1859 };
1860 return res;
1861 }
1862}
1863
1864
1878static enum GNUNET_GenericReturnValue
1880 PGresult *result,
1881 int row,
1882 const char *fname,
1883 size_t *dst_size,
1884 void *dst)
1885{
1886 struct GNUNET_CRYPTO_BlindSignPublicKey **bpk = dst;
1888 size_t len;
1889 const char *res;
1890 int fnum;
1891 uint32_t be;
1892
1893 (void) cls;
1894 (void) dst_size;
1895 fnum = PQfnumber (result,
1896 fname);
1897 if (fnum < 0)
1898 {
1899 GNUNET_break (0);
1900 return GNUNET_SYSERR;
1901 }
1902 if (PQgetisnull (result,
1903 row,
1904 fnum))
1905 return GNUNET_NO;
1906
1907 /* if a field is null, continue but
1908 * remember that we now return a different result */
1909 len = PQgetlength (result,
1910 row,
1911 fnum);
1912 res = PQgetvalue (result,
1913 row,
1914 fnum);
1915 if (len < sizeof (be))
1916 {
1917 GNUNET_break (0);
1918 return GNUNET_SYSERR;
1919 }
1920 GNUNET_memcpy (&be,
1921 res,
1922 sizeof (be));
1923 res += sizeof (be);
1924 len -= sizeof (be);
1926 tmp->cipher = ntohl (be);
1927 tmp->rc = 1;
1928 switch (tmp->cipher)
1929 {
1931 break;
1935 len);
1936 if (NULL == tmp->details.rsa_public_key)
1937 {
1938 GNUNET_break (0);
1939 GNUNET_free (tmp);
1940 return GNUNET_SYSERR;
1941 }
1943 len,
1944 &tmp->pub_key_hash);
1945 *bpk = tmp;
1946 return GNUNET_OK;
1948 if (sizeof (tmp->details.cs_public_key) != len)
1949 {
1950 GNUNET_break (0);
1951 GNUNET_free (tmp);
1952 return GNUNET_SYSERR;
1953 }
1955 res,
1956 len);
1958 len,
1959 &tmp->pub_key_hash);
1960 *bpk = tmp;
1961 return GNUNET_OK;
1962 }
1963 GNUNET_break (0);
1964 GNUNET_free (tmp);
1965 return GNUNET_SYSERR;
1966}
1967
1968
1976static void
1978 void *rd)
1979{
1981
1982 (void) cls;
1983 if (NULL != *pub)
1984 {
1986 *pub = NULL;
1987 }
1988}
1989
1990
1993 const char *name,
1995{
1996 struct GNUNET_PQ_ResultSpec res = {
1998 .cleaner = &clean_blind_sign_pub,
1999 .dst = (void *) pub,
2000 .fname = name
2001 };
2002
2003 return res;
2004}
2005
2006
2020static enum GNUNET_GenericReturnValue
2022 PGresult *result,
2023 int row,
2024 const char *fname,
2025 size_t *dst_size,
2026 void *dst)
2027{
2028 struct GNUNET_CRYPTO_BlindSignPrivateKey **bpk = dst;
2030 size_t len;
2031 const char *res;
2032 int fnum;
2033 uint32_t be;
2034
2035 (void) cls;
2036 (void) dst_size;
2037 fnum = PQfnumber (result,
2038 fname);
2039 if (fnum < 0)
2040 {
2041 GNUNET_break (0);
2042 return GNUNET_SYSERR;
2043 }
2044 if (PQgetisnull (result,
2045 row,
2046 fnum))
2047 return GNUNET_NO;
2048
2049 /* if a field is null, continue but
2050 * remember that we now return a different result */
2051 len = PQgetlength (result,
2052 row,
2053 fnum);
2054 res = PQgetvalue (result,
2055 row,
2056 fnum);
2057 if (len < sizeof (be))
2058 {
2059 GNUNET_break (0);
2060 return GNUNET_SYSERR;
2061 }
2062 GNUNET_memcpy (&be,
2063 res,
2064 sizeof (be));
2065 res += sizeof (be);
2066 len -= sizeof (be);
2068 tmp->cipher = ntohl (be);
2069 tmp->rc = 1;
2070 switch (tmp->cipher)
2071 {
2073 break;
2077 len);
2078 if (NULL == tmp->details.rsa_private_key)
2079 {
2080 GNUNET_break (0);
2081 GNUNET_free (tmp);
2082 return GNUNET_SYSERR;
2083 }
2084 *bpk = tmp;
2085 return GNUNET_OK;
2087 if (sizeof (tmp->details.cs_private_key) != len)
2088 {
2089 GNUNET_break (0);
2090 GNUNET_free (tmp);
2091 return GNUNET_SYSERR;
2092 }
2094 res,
2095 len);
2096 *bpk = tmp;
2097 return GNUNET_OK;
2098 }
2099 GNUNET_break (0);
2100 GNUNET_free (tmp);
2101 return GNUNET_SYSERR;
2102}
2103
2104
2112static void
2114 void *rd)
2115{
2116 struct GNUNET_CRYPTO_BlindSignPrivateKey **priv = rd;
2117
2118 (void) cls;
2119 if (NULL != *priv)
2120 {
2122 *priv = NULL;
2123 }
2124}
2125
2126
2129 const char *name,
2131{
2132 struct GNUNET_PQ_ResultSpec res = {
2134 .cleaner = &clean_blind_sign_priv,
2135 .dst = (void *) priv,
2136 .fname = name
2137 };
2138
2139 return res;
2140}
2141
2142
2156static enum GNUNET_GenericReturnValue
2158 PGresult *result,
2159 int row,
2160 const char *fname,
2161 size_t *dst_size,
2162 void *dst)
2163{
2164 struct GNUNET_CRYPTO_BlindedSignature **sig = dst;
2166 size_t len;
2167 const char *res;
2168 int fnum;
2169 uint32_t be[2];
2170
2171 (void) cls;
2172 (void) dst_size;
2173 fnum = PQfnumber (result,
2174 fname);
2175 if (fnum < 0)
2176 {
2177 GNUNET_break (0);
2178 return GNUNET_SYSERR;
2179 }
2180 if (PQgetisnull (result,
2181 row,
2182 fnum))
2183 return GNUNET_NO;
2184
2185 /* if a field is null, continue but
2186 * remember that we now return a different result */
2187 len = PQgetlength (result,
2188 row,
2189 fnum);
2190 res = PQgetvalue (result,
2191 row,
2192 fnum);
2193 if (len < sizeof (be))
2194 {
2195 GNUNET_break (0);
2196 return GNUNET_SYSERR;
2197 }
2198 GNUNET_memcpy (&be,
2199 res,
2200 sizeof (be));
2201 if (0x01 != ntohl (be[1])) /* magic marker: blinded */
2202 {
2203 GNUNET_break (0);
2204 return GNUNET_SYSERR;
2205 }
2206 res += sizeof (be);
2207 len -= sizeof (be);
2209 bs->rc = 1;
2210 bs->cipher = ntohl (be[0]);
2211 switch (bs->cipher)
2212 {
2214 break;
2218 len);
2219 if (NULL == bs->details.blinded_rsa_signature)
2220 {
2221 GNUNET_break (0);
2222 GNUNET_free (bs);
2223 return GNUNET_SYSERR;
2224 }
2225 *sig = bs;
2226 return GNUNET_OK;
2228 if (sizeof (bs->details.blinded_cs_answer) != len)
2229 {
2230 GNUNET_break (0);
2231 GNUNET_free (bs);
2232 return GNUNET_SYSERR;
2233 }
2235 res,
2236 len);
2237 *sig = bs;
2238 return GNUNET_OK;
2239 }
2240 GNUNET_break (0);
2241 GNUNET_free (bs);
2242 return GNUNET_SYSERR;
2243}
2244
2245
2253static void
2255 void *rd)
2256{
2257 struct GNUNET_CRYPTO_BlindedSignature **b_sig = rd;
2258
2259 (void) cls;
2261}
2262
2263
2266 const char *name,
2267 struct GNUNET_CRYPTO_BlindedSignature **b_sig)
2268{
2269 struct GNUNET_PQ_ResultSpec res = {
2271 .cleaner = &clean_blinded_sig,
2272 .dst = (void *) b_sig,
2273 .fname = name
2274 };
2275
2276 return res;
2277}
2278
2279
2293static enum GNUNET_GenericReturnValue
2295 PGresult *result,
2296 int row,
2297 const char *fname,
2298 size_t *dst_size,
2299 void *dst)
2300{
2301 struct GNUNET_CRYPTO_UnblindedSignature **sig = dst;
2303 size_t len;
2304 const char *res;
2305 int fnum;
2306 uint32_t be[2];
2307
2308 (void) cls;
2309 (void) dst_size;
2310 fnum = PQfnumber (result,
2311 fname);
2312 if (fnum < 0)
2313 {
2314 GNUNET_break (0);
2315 return GNUNET_SYSERR;
2316 }
2317 if (PQgetisnull (result,
2318 row,
2319 fnum))
2320 return GNUNET_NO;
2321
2322 /* if a field is null, continue but
2323 * remember that we now return a different result */
2324 len = PQgetlength (result,
2325 row,
2326 fnum);
2327 res = PQgetvalue (result,
2328 row,
2329 fnum);
2330 if (len < sizeof (be))
2331 {
2332 GNUNET_break (0);
2333 return GNUNET_SYSERR;
2334 }
2335 GNUNET_memcpy (&be,
2336 res,
2337 sizeof (be));
2338 if (0x00 != ntohl (be[1])) /* magic marker: unblinded */
2339 {
2340 GNUNET_break (0);
2341 return GNUNET_SYSERR;
2342 }
2343 res += sizeof (be);
2344 len -= sizeof (be);
2346 ubs->rc = 1;
2347 ubs->cipher = ntohl (be[0]);
2348 switch (ubs->cipher)
2349 {
2351 break;
2355 len);
2356 if (NULL == ubs->details.rsa_signature)
2357 {
2358 GNUNET_break (0);
2359 GNUNET_free (ubs);
2360 return GNUNET_SYSERR;
2361 }
2362 *sig = ubs;
2363 return GNUNET_OK;
2365 if (sizeof (ubs->details.cs_signature) != len)
2366 {
2367 GNUNET_break (0);
2368 GNUNET_free (ubs);
2369 return GNUNET_SYSERR;
2370 }
2372 res,
2373 len);
2374 *sig = ubs;
2375 return GNUNET_OK;
2376 }
2377 GNUNET_break (0);
2378 GNUNET_free (ubs);
2379 return GNUNET_SYSERR;
2380}
2381
2382
2390static void
2392 void *rd)
2393{
2394 struct GNUNET_CRYPTO_UnblindedSignature **ub_sig = rd;
2395
2396 (void) cls;
2398}
2399
2400
2403 const char *name,
2404 struct GNUNET_CRYPTO_UnblindedSignature **ub_sig)
2405{
2406 struct GNUNET_PQ_ResultSpec res = {
2408 .cleaner = &clean_unblinded_sig,
2409 .dst = (void *) ub_sig,
2410 .fname = name
2411 };
2412
2413 return res;
2414}
2415
2416
2417/* end of pq_result_helper.c */
#define INT_MAX
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition gnunet-arm.c:98
static char * data
The data to insert into the dht.
struct GNUNET_CRYPTO_BlindablePrivateKey pk
Private key from command line option, or NULL.
static char * name
Name (label) of the records to list.
static struct GNUNET_SCHEDULER_Task * t
Main task.
static char * res
Currently read line or NULL on EOF.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
static int result
Global testing status.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
#define info
static struct GNUNET_FS_DirectoryBuilder * db
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
@ FAIL
helper functions for Postgres DB interactions
#define GNUNET_PQ_result_spec_auto_from_type(name, dst)
We expect a fixed-size result, with size determined by the type of * dst
uint32_t ndim
enum GNUNET_GenericReturnValue GNUNET_PQ_get_oid_by_name(struct GNUNET_PQ_Context *db, const char *name, Oid *oid)
Returns the oid for a given datatype by name.
Definition pq_connect.c:460
Functions related to time.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition crypto_hash.c:41
#define GNUNET_log(kind,...)
void GNUNET_CRYPTO_rsa_signature_free(struct GNUNET_CRYPTO_RsaSignature *sig)
Free memory occupied by signature.
struct GNUNET_CRYPTO_RsaSignature * GNUNET_CRYPTO_rsa_signature_decode(const void *buf, size_t buf_size)
Decode the signature from the data-format back to the "normal", internal format.
struct GNUNET_CRYPTO_RsaPublicKey * GNUNET_CRYPTO_rsa_public_key_decode(const char *buf, size_t len)
Decode the public key from the data-format back to the "normal", internal format.
Definition crypto_rsa.c:423
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
struct GNUNET_CRYPTO_RsaPrivateKey * GNUNET_CRYPTO_rsa_private_key_decode(const void *buf, size_t buf_size)
Decode the private key from the data-format back to the "normal", internal format.
Definition crypto_rsa.c:204
void GNUNET_CRYPTO_rsa_public_key_free(struct GNUNET_CRYPTO_RsaPublicKey *key)
Free memory occupied by the public key.
Definition crypto_rsa.c:268
void GNUNET_CRYPTO_unblinded_sig_decref(struct GNUNET_CRYPTO_UnblindedSignature *ub_sig)
Decrement reference counter of a ub_sig, and free it if it reaches zero.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
void GNUNET_CRYPTO_blinded_sig_decref(struct GNUNET_CRYPTO_BlindedSignature *blind_sig)
Decrement reference counter of a blind_sig, and free it if it reaches zero.
GNUNET_GenericReturnValue
Named constants for return values.
void GNUNET_CRYPTO_blind_sign_pub_decref(struct GNUNET_CRYPTO_BlindSignPublicKey *bsign_pub)
Decrement reference counter of a bsign_pub, and free it if it reaches zero.
void GNUNET_CRYPTO_blind_sign_priv_decref(struct GNUNET_CRYPTO_BlindSignPrivateKey *bsign_priv)
Decrement reference counter of a bsign_priv, and free it if it reaches zero.
@ GNUNET_CRYPTO_BSA_INVALID
Invalid type of signature.
@ GNUNET_CRYPTO_BSA_CS
Clause Blind Schnorr signature.
@ GNUNET_CRYPTO_BSA_RSA
RSA blind signature.
@ GNUNET_OK
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_TIME_UNIT_SECONDS
One second.
struct GNUNET_TIME_TimestampNBO GNUNET_TIME_timestamp_hton(struct GNUNET_TIME_Timestamp t)
Convert timestamp to network byte order.
Definition time.c:91
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
static unsigned int size
Size of the "table".
Definition peer.c:68
shared internal data structures of libgnunetpq
array_types
Internal types that are supported as array types.
Definition pq.h:148
@ array_of_byte
Definition pq.h:153
@ array_of_uint32
Definition pq.h:151
@ array_of_string
Definition pq.h:154
@ array_of_rel_time
Definition pq.h:156
@ array_of_uint16
Definition pq.h:150
@ array_of_uint64
Definition pq.h:152
@ array_of_abs_time
Definition pq.h:155
@ array_of_timestamp
Definition pq.h:157
@ array_of_bool
Definition pq.h:149
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_bool(struct GNUNET_PQ_Context *db, const char *name, size_t *num, bool **dst)
array of bool expected.
static void clean_blinded_sig(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
static enum GNUNET_GenericReturnValue extract_string(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static enum GNUNET_GenericReturnValue extract_varsize_blob(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static enum GNUNET_GenericReturnValue extract_fixed_blob(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_variable_size(struct GNUNET_PQ_Context *db, const char *name, size_t *num, size_t **sizes, void **dst)
Array of variable-size result expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_timestamp_nbo(const char *name, struct GNUNET_TIME_TimestampNBO *at)
Timestamp expected.
static enum GNUNET_GenericReturnValue extract_uint16(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_fixed_size(struct GNUNET_PQ_Context *db, const char *name, size_t size, size_t *num, void **dst)
Array of fixed-size result expected.
static enum GNUNET_GenericReturnValue extract_int64(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blinded_sig(const char *name, struct GNUNET_CRYPTO_BlindedSignature **b_sig)
Blinded signature expected.
static enum GNUNET_GenericReturnValue extract_blind_sign_priv(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static enum GNUNET_GenericReturnValue extract_timestamp_nbo(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static enum GNUNET_GenericReturnValue extract_unblinded_sig(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_timestamp(struct GNUNET_PQ_Context *db, const char *name, size_t *num, struct GNUNET_TIME_Timestamp **dst)
array of relative time expected.
static enum GNUNET_GenericReturnValue extract_abs_time(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void clean_rsa_public_key(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
static void clean_varsize_blob(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_fixed_size(const char *name, void *dst, size_t dst_size)
Fixed-size result expected.
static enum GNUNET_GenericReturnValue extract_bool(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_bool(const char *name, bool *dst)
boolean expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time_nbo(const char *name, struct GNUNET_TIME_AbsoluteNBO *at)
Absolute time expected.
#define DEREF(typ, conv)
static enum GNUNET_GenericReturnValue extract_uint32(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint64(const char *name, uint64_t *u64)
uint64_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_string(const char *name, char **dst)
0-terminated string expected.
#define FAIL_IF(cond)
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blind_sign_priv(const char *name, struct GNUNET_CRYPTO_BlindSignPrivateKey **priv)
Blind sign private key expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blind_sign_pub(const char *name, struct GNUNET_CRYPTO_BlindSignPublicKey **pub)
Blind sign public key expected.
#define ACCESS_ABS(typ, conv)
#define ACCESS_REL(typ, conv)
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_allow_nulls(struct GNUNET_PQ_ResultSpec rs, bool **is_nulls)
Allow NULL values in an array to be found in the database for the given value.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_allow_null(struct GNUNET_PQ_ResultSpec rs, bool *is_null)
Allow NULL value to be found in the database for the given value.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint16(struct GNUNET_PQ_Context *db, const char *name, size_t *num, uint16_t **dst)
array of uint16_t expected.
#define HANDLE_ARRAY(typ, conv, access)
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time(const char *name, struct GNUNET_TIME_Absolute *at)
Absolute time expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_int64(const char *name, int64_t *i64)
int64_t expected.
static void clean_string(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint16(const char *name, uint16_t *u16)
uint16_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_string(struct GNUNET_PQ_Context *db, const char *name, size_t *num, char **dst)
Array of 0-terminated strings expected.
static enum GNUNET_GenericReturnValue extract_uint64(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static enum GNUNET_GenericReturnValue extract_rel_time(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_relative_time(const char *name, struct GNUNET_TIME_Relative *rt)
Relative time expected.
static enum GNUNET_GenericReturnValue extract_rsa_public_key(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_timestamp(const char *name, struct GNUNET_TIME_Timestamp *at)
Timestamp expected.
static enum GNUNET_GenericReturnValue extract_blinded_sig(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size(const char *name, void **dst, size_t *sptr)
Variable-size result expected.
static enum GNUNET_GenericReturnValue extract_array_generic(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result as array of a specific type from row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_rsa_public_key(const char *name, struct GNUNET_CRYPTO_RsaPublicKey **rsa)
RSA public key expected.
static void clean_blind_sign_pub(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint64(struct GNUNET_PQ_Context *db, const char *name, size_t *num, uint64_t **dst)
array of uint64_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_abs_time(struct GNUNET_PQ_Context *db, const char *name, size_t *num, struct GNUNET_TIME_Absolute **dst)
array of absolute time expected.
static void clean_unblinded_sig(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_rel_time(struct GNUNET_PQ_Context *db, const char *name, size_t *num, struct GNUNET_TIME_Relative **dst)
array of relative time expected.
static enum GNUNET_GenericReturnValue extract_rsa_signature(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_rsa_signature(const char *name, struct GNUNET_CRYPTO_RsaSignature **sig)
RSA signature expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint32(struct GNUNET_PQ_Context *db, const char *name, size_t *num, uint32_t **dst)
array of uint32_t expected.
#define ACCESS_TSTMP(typ, conv)
static enum GNUNET_GenericReturnValue extract_blind_sign_pub(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_unblinded_sig(const char *name, struct GNUNET_CRYPTO_UnblindedSignature **ub_sig)
Unblinded signature expected.
static void clean_blind_sign_priv(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
static enum GNUNET_GenericReturnValue extract_timestamp(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void array_cleanup(void *cls, void *rd)
Cleanup of the data and closure of an array spec.
static void clean_rsa_signature(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
Type of private signing keys for blind signing.
struct GNUNET_CRYPTO_CsPrivateKey cs_private_key
If we use GNUNET_CRYPTO_BSA_CS in cipher.
unsigned int rc
Reference counter.
struct GNUNET_CRYPTO_RsaPrivateKey * rsa_private_key
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the public key.
union GNUNET_CRYPTO_BlindSignPrivateKey::@21 details
Details, depending on cipher.
Type of public signing keys for blind signatures.
union GNUNET_CRYPTO_BlindSignPublicKey::@20 details
Details, depending on cipher.
unsigned int rc
Reference counter.
struct GNUNET_HashCode pub_key_hash
Hash of the public key.
struct GNUNET_CRYPTO_CsPublicKey cs_public_key
If we use GNUNET_CRYPTO_BSA_CS in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the public key.
struct GNUNET_CRYPTO_RsaPublicKey * rsa_public_key
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
Type for blinded signatures.
unsigned int rc
Reference counter.
struct GNUNET_CRYPTO_CsBlindSignature blinded_cs_answer
If we use GNUNET_CRYPTO_BSA_CS in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the signature.
struct GNUNET_CRYPTO_RsaSignature * blinded_rsa_signature
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
union GNUNET_CRYPTO_BlindedSignature::@19 details
Details, depending on cipher.
The public information of an RSA key pair.
Definition crypto_rsa.c:53
Type of (unblinded) signatures.
union GNUNET_CRYPTO_UnblindedSignature::@18 details
Details, depending on cipher.
struct GNUNET_CRYPTO_RsaSignature * rsa_signature
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
unsigned int rc
Reference counter.
struct GNUNET_CRYPTO_CsSignature cs_signature
If we use GNUNET_CRYPTO_BSA_CS in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the signature.
Handle to Postgres database.
Definition pq.h:36
Description of a DB result cell.
const char * fname
Field name of the desired result.
bool * is_null
Points to a location where we should store "true" if the result found is NULL, and otherwise "false".
void * dst
Destination for the data.
bool is_nullable
True if NULL is allowed for a value in the database.
void * cls
Closure for conv and cleaner.
GNUNET_PQ_ResultConverter conv
What is the format of the result?
size_t dst_size
Allowed size for the data, 0 for variable-size (in this case, the type of dst is a void ** and we nee...
Time for absolute time used by GNUnet, in microseconds and in network byte order.
Time for absolute times used by GNUnet, in microseconds.
uint64_t abs_value_us
The actual value.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.
Time for timestamps used by GNUnet, in seconds and in network byte order.
Time for timestamps used by GNUnet, in microseconds rounded to seconds.
struct GNUNET_TIME_Absolute abs_time
The actual value.
Closure for the array result specifications.
enum array_types typ
The header for a postgresql array in binary format.
Definition pq.h:167
uint32_t lbound
Definition pq.h:172
uint32_t has_nulls
Definition pq.h:169
uint32_t oid
Definition pq.h:170
uint32_t ndim
Definition pq.h:168
uint32_t dim
Definition pq.h:171
const char * str
Definition time.c:1252