use NULL value in load_path_suffix to NOT load any files
[oweals/gnunet.git] / src / reclaim / plugin_gnsrecord_reclaim.c
1 /*
2      This file is part of GNUnet
3      Copyright (C) 2013, 2014 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  */
20
21 /**
22  * @file reclaim/plugin_gnsrecord_reclaim.c
23  * @brief gnsrecord plugin to provide the API for identity records
24  * @author Martin Schanzenbach
25  */
26 #include "platform.h"
27
28 #include "gnunet_util_lib.h"
29
30 #include "gnunet_gnsrecord_lib.h"
31 #include "gnunet_gnsrecord_plugin.h"
32
33 /**
34  * Convert the 'value' of a record to a string.
35  *
36  * @param cls closure, unused
37  * @param type type of the record
38  * @param data value in binary encoding
39  * @param data_size number of bytes in @a data
40  * @return NULL on error, otherwise human-readable representation of the value
41  */
42 static char *
43 value_to_string (void *cls, uint32_t type, const void *data, size_t data_size)
44 {
45   switch (type)
46   {
47   case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR:
48     return GNUNET_STRINGS_data_to_string_alloc (data, data_size);
49
50   case GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_REDIRECT:
51   case GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_CLIENT:
52     return GNUNET_strndup (data, data_size);
53
54   case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR_REF:
55   case GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET:
56   case GNUNET_GNSRECORD_TYPE_RECLAIM_MASTER:
57   case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTEST_ATTR:
58   case GNUNET_GNSRECORD_TYPE_RECLAIM_REFERENCE:
59     return GNUNET_STRINGS_data_to_string_alloc (data, data_size);
60
61   default:
62     return NULL;
63   }
64 }
65
66
67 /**
68  * Convert human-readable version of a 'value' of a record to the binary
69  * representation.
70  *
71  * @param cls closure, unused
72  * @param type type of the record
73  * @param s human-readable string
74  * @param data set to value in binary encoding (will be allocated)
75  * @param data_size set to number of bytes in @a data
76  * @return #GNUNET_OK on success
77  */
78 static int
79 string_to_value (void *cls, uint32_t type, const char *s, void **data,
80                  size_t *data_size)
81 {
82   if (NULL == s)
83     return GNUNET_SYSERR;
84   switch (type)
85   {
86   case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR:
87     return GNUNET_STRINGS_string_to_data (s, strlen (s), *data, *data_size);
88
89   case GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_REDIRECT:
90   case GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_CLIENT:
91     *data = GNUNET_strdup (s);
92     *data_size = strlen (s);
93     return GNUNET_OK;
94
95   case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR_REF:
96   case GNUNET_GNSRECORD_TYPE_RECLAIM_MASTER:
97   case GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET:
98   case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTEST_ATTR:
99   case GNUNET_GNSRECORD_TYPE_RECLAIM_REFERENCE:
100     return GNUNET_STRINGS_string_to_data (s, strlen (s), *data, *data_size);
101
102   default:
103     return GNUNET_SYSERR;
104   }
105 }
106
107
108 /**
109  * Mapping of record type numbers to human-readable
110  * record type names.
111  */
112 static struct
113 {
114   const char *name;
115   uint32_t number;
116 } name_map[] = {
117   { "RECLAIM_ATTR", GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR },
118   { "RECLAIM_ATTR_REF", GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR_REF },
119   { "RECLAIM_ATTEST", GNUNET_GNSRECORD_TYPE_RECLAIM_ATTEST_ATTR },
120   { "RECLAIM_MASTER", GNUNET_GNSRECORD_TYPE_RECLAIM_MASTER },
121   { "RECLAIM_OIDC_CLIENT", GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_CLIENT },
122   { "RECLAIM_OIDC_REDIRECT", GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_REDIRECT },
123   { "RECLAIM_TICKET", GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET },
124   { "RECLAIM_REFERENCE", GNUNET_GNSRECORD_TYPE_RECLAIM_REFERENCE },
125   { NULL, UINT32_MAX }
126 };
127
128
129 /**
130  * Convert a type name (i.e. "AAAA") to the corresponding number.
131  *
132  * @param cls closure, unused
133  * @param dns_typename name to convert
134  * @return corresponding number, UINT32_MAX on error
135  */
136 static uint32_t
137 typename_to_number (void *cls, const char *dns_typename)
138 {
139   unsigned int i;
140
141   i = 0;
142   while ((NULL != name_map[i].name) &&
143          (0 != strcasecmp (dns_typename, name_map[i].name)))
144     i++;
145   return name_map[i].number;
146 }
147
148
149 /**
150  * Convert a type number (i.e. 1) to the corresponding type string (i.e. "A")
151  *
152  * @param cls closure, unused
153  * @param type number of a type to convert
154  * @return corresponding typestring, NULL on error
155  */
156 static const char *
157 number_to_typename (void *cls, uint32_t type)
158 {
159   unsigned int i;
160
161   i = 0;
162   while ((NULL != name_map[i].name) && (type != name_map[i].number))
163     i++;
164   return name_map[i].name;
165 }
166
167
168 /**
169  * Entry point for the plugin.
170  *
171  * @param cls NULL
172  * @return the exported block API
173  */
174 void *
175 libgnunet_plugin_gnsrecord_reclaim_init (void *cls)
176 {
177   struct GNUNET_GNSRECORD_PluginFunctions *api;
178
179   api = GNUNET_new (struct GNUNET_GNSRECORD_PluginFunctions);
180   api->value_to_string = &value_to_string;
181   api->string_to_value = &string_to_value;
182   api->typename_to_number = &typename_to_number;
183   api->number_to_typename = &number_to_typename;
184   return api;
185 }
186
187
188 /**
189  * Exit point from the plugin.
190  *
191  * @param cls the return value from #libgnunet_plugin_block_test_init
192  * @return NULL
193  */
194 void *
195 libgnunet_plugin_gnsrecord_reclaim_done (void *cls)
196 {
197   struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
198
199   GNUNET_free (api);
200   return NULL;
201 }
202
203
204 /* end of plugin_gnsrecord_dns.c */