uncrustify as demanded.
[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       return GNUNET_STRINGS_data_to_string_alloc(data, data_size);
58
59     default:
60       return NULL;
61     }
62 }
63
64
65 /**
66  * Convert human-readable version of a 'value' of a record to the binary
67  * representation.
68  *
69  * @param cls closure, unused
70  * @param type type of the record
71  * @param s human-readable string
72  * @param data set to value in binary encoding (will be allocated)
73  * @param data_size set to number of bytes in @a data
74  * @return #GNUNET_OK on success
75  */
76 static int
77 string_to_value(void *cls, uint32_t type, const char *s, void **data,
78                 size_t *data_size)
79 {
80   if (NULL == s)
81     return GNUNET_SYSERR;
82   switch (type)
83     {
84     case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR:
85       return GNUNET_STRINGS_string_to_data(s, strlen(s), *data, *data_size);
86
87     case GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_REDIRECT:
88     case GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_CLIENT:
89       *data = GNUNET_strdup(s);
90       *data_size = strlen(s);
91       return GNUNET_OK;
92
93     case GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR_REF:
94     case GNUNET_GNSRECORD_TYPE_RECLAIM_MASTER:
95     case GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET:
96       return GNUNET_STRINGS_string_to_data(s, strlen(s), *data, *data_size);
97
98     default:
99       return GNUNET_SYSERR;
100     }
101 }
102
103
104 /**
105  * Mapping of record type numbers to human-readable
106  * record type names.
107  */
108 static struct {
109   const char *name;
110   uint32_t number;
111 } name_map[] = {
112   { "RECLAIM_ATTR", GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR },
113   { "RECLAIM_ATTR_REF", GNUNET_GNSRECORD_TYPE_RECLAIM_ATTR_REF },
114   { "RECLAIM_MASTER", GNUNET_GNSRECORD_TYPE_RECLAIM_MASTER },
115   { "RECLAIM_OIDC_CLIENT", GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_CLIENT },
116   { "RECLAIM_OIDC_REDIRECT", GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_REDIRECT },
117   { "RECLAIM_TICKET", GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET },
118   { NULL, UINT32_MAX }
119 };
120
121
122 /**
123  * Convert a type name (i.e. "AAAA") to the corresponding number.
124  *
125  * @param cls closure, unused
126  * @param dns_typename name to convert
127  * @return corresponding number, UINT32_MAX on error
128  */
129 static uint32_t
130 typename_to_number(void *cls, const char *dns_typename)
131 {
132   unsigned int i;
133
134   i = 0;
135   while ((NULL != name_map[i].name) &&
136          (0 != strcasecmp(dns_typename, name_map[i].name)))
137     i++;
138   return name_map[i].number;
139 }
140
141
142 /**
143  * Convert a type number (i.e. 1) to the corresponding type string (i.e. "A")
144  *
145  * @param cls closure, unused
146  * @param type number of a type to convert
147  * @return corresponding typestring, NULL on error
148  */
149 static const char *
150 number_to_typename(void *cls, uint32_t type)
151 {
152   unsigned int i;
153
154   i = 0;
155   while ((NULL != name_map[i].name) && (type != name_map[i].number))
156     i++;
157   return name_map[i].name;
158 }
159
160
161 /**
162  * Entry point for the plugin.
163  *
164  * @param cls NULL
165  * @return the exported block API
166  */
167 void *
168 libgnunet_plugin_gnsrecord_reclaim_init(void *cls)
169 {
170   struct GNUNET_GNSRECORD_PluginFunctions *api;
171
172   api = GNUNET_new(struct GNUNET_GNSRECORD_PluginFunctions);
173   api->value_to_string = &value_to_string;
174   api->string_to_value = &string_to_value;
175   api->typename_to_number = &typename_to_number;
176   api->number_to_typename = &number_to_typename;
177   return api;
178 }
179
180
181 /**
182  * Exit point from the plugin.
183  *
184  * @param cls the return value from #libgnunet_plugin_block_test_init
185  * @return NULL
186  */
187 void *
188 libgnunet_plugin_gnsrecord_reclaim_done(void *cls)
189 {
190   struct GNUNET_GNSRECORD_PluginFunctions *api = cls;
191
192   GNUNET_free(api);
193   return NULL;
194 }
195
196 /* end of plugin_gnsrecord_dns.c */