/src/wireshark/epan/protobuf-helper.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* protobuf-helper.c |
2 | | * |
3 | | * Wrapper of Protocol Buffers Language library which generated by protobuf_lang_parser.lemon and protobuf_lang_scanner.l. |
4 | | * Copyright 2019, Huang Qiangxiong <qiangxiong.huang@qq.com> |
5 | | * |
6 | | * Wireshark - Network traffic analyzer |
7 | | * By Gerald Combs <gerald@wireshark.org> |
8 | | * Copyright 1998 Gerald Combs |
9 | | * |
10 | | * SPDX-License-Identifier: GPL-2.0-or-later |
11 | | */ |
12 | | |
13 | | /* The packet-protobuf dissector needs get information from *.proto files for dissecting |
14 | | * protobuf packet correctly. The information includes: |
15 | | * - The names of MESSAGE, ENUM, FIELD, ENUM_VALUE; |
16 | | * - The data type of FIELD which assuring the value of protobuf field of packet can be dissected correctly. |
17 | | * |
18 | | * At present, we use C Protocol Buffers Language Parser which generated by protobuf_lang_parser.lemon and protobuf_lang_scanner.l. |
19 | | * Because wireshark is mainly implemented in plain ANSI C but the official protobuf library is implemented in C++ language. |
20 | | * |
21 | | * One day, if C++ library is allowed, we can create a protobuf-helper.cpp file, that invoking official protobuf C++ library directly, |
22 | | * to replace protobuf-helper.c. The packet-protobuf.c can keep unchanged. |
23 | | */ |
24 | | |
25 | | #include "config.h" |
26 | | |
27 | | #include "protobuf-helper.h" |
28 | | #include "protobuf_lang_tree.h" |
29 | | |
30 | | VALUE_STRING_ARRAY_GLOBAL_DEF(protobuf_field_type); |
31 | | |
32 | | void |
33 | | pbw_reinit_DescriptorPool(PbwDescriptorPool** pool, const char** directories, pbw_report_error_cb_t error_cb) |
34 | 0 | { |
35 | 0 | pbl_reinit_descriptor_pool((pbl_descriptor_pool_t**) pool, directories, (pbl_report_error_cb_t) error_cb); |
36 | 0 | } |
37 | | |
38 | | /* load a proto file, return 0 if succeeds */ |
39 | | int |
40 | 0 | pbw_load_proto_file(PbwDescriptorPool* pool, const char* filename) { |
41 | 0 | if (pbl_add_proto_file_to_be_parsed((pbl_descriptor_pool_t*) pool, filename)) { |
42 | 0 | return run_pbl_parser((pbl_descriptor_pool_t*) pool); |
43 | 0 | } else { |
44 | 0 | return 2; |
45 | 0 | } |
46 | 0 | } |
47 | | |
48 | | /* like DescriptorPool::FindMethodByName */ |
49 | | const PbwMethodDescriptor* |
50 | 0 | pbw_DescriptorPool_FindMethodByName(const PbwDescriptorPool* pool, const char* name) { |
51 | 0 | return (const PbwMethodDescriptor*)pbl_message_descriptor_pool_FindMethodByName((pbl_descriptor_pool_t*) pool, name); |
52 | 0 | } |
53 | | |
54 | | /* like MethodDescriptor::name() */ |
55 | | const char* |
56 | 0 | pbw_MethodDescriptor_name(const PbwMethodDescriptor* method) { |
57 | 0 | return pbl_method_descriptor_name((const pbl_method_descriptor_t*) method); |
58 | 0 | } |
59 | | |
60 | | /* like MethodDescriptor::full_name() */ |
61 | | const char* |
62 | 0 | pbw_MethodDescriptor_full_name(const PbwMethodDescriptor* method) { |
63 | 0 | return pbl_method_descriptor_full_name((const pbl_method_descriptor_t*) method); |
64 | 0 | } |
65 | | |
66 | | /* like MethodDescriptor::input_type() */ |
67 | | const PbwDescriptor* |
68 | 0 | pbw_MethodDescriptor_input_type(const PbwMethodDescriptor* method) { |
69 | 0 | return (const PbwDescriptor*)pbl_method_descriptor_input_type((const pbl_method_descriptor_t*) method); |
70 | 0 | } |
71 | | |
72 | | /* like MethodDescriptor::output_type() */ |
73 | | const PbwDescriptor* |
74 | 0 | pbw_MethodDescriptor_output_type(const PbwMethodDescriptor* method) { |
75 | 0 | return (const PbwDescriptor*)pbl_method_descriptor_output_type((const pbl_method_descriptor_t*) method); |
76 | 0 | } |
77 | | |
78 | | /* like DescriptorPool::FindMessageTypeByName() */ |
79 | | const PbwDescriptor* |
80 | 0 | pbw_DescriptorPool_FindMessageTypeByName(const PbwDescriptorPool* pool, const char* name) { |
81 | 0 | return (const PbwDescriptor*)pbl_message_descriptor_pool_FindMessageTypeByName((const pbl_descriptor_pool_t*) pool, name); |
82 | 0 | } |
83 | | |
84 | | /* like Descriptor::full_name() */ |
85 | | const char* |
86 | 0 | pbw_Descriptor_full_name(const PbwDescriptor* message) { |
87 | 0 | return pbl_message_descriptor_full_name((const pbl_message_descriptor_t*) message); |
88 | 0 | } |
89 | | |
90 | | /* like Descriptor::name() */ |
91 | | const char* |
92 | 0 | pbw_Descriptor_name(const PbwDescriptor* message) { |
93 | 0 | return pbl_message_descriptor_name((const pbl_message_descriptor_t*) message); |
94 | 0 | } |
95 | | |
96 | | /* like Descriptor::field_count() */ |
97 | | int |
98 | 0 | pbw_Descriptor_field_count(const PbwDescriptor* message) { |
99 | 0 | return pbl_message_descriptor_field_count((const pbl_message_descriptor_t*) message); |
100 | 0 | } |
101 | | |
102 | | /* like Descriptor::field() */ |
103 | | const PbwFieldDescriptor* |
104 | 0 | pbw_Descriptor_field(const PbwDescriptor* message, int field_index) { |
105 | 0 | return (const PbwFieldDescriptor*)pbl_message_descriptor_field((const pbl_message_descriptor_t*) message, field_index); |
106 | 0 | } |
107 | | |
108 | | /* like Descriptor::FindFieldByNumber() */ |
109 | | const PbwFieldDescriptor* |
110 | 0 | pbw_Descriptor_FindFieldByNumber(const PbwDescriptor* message, int number) { |
111 | 0 | return (const PbwFieldDescriptor*)pbl_message_descriptor_FindFieldByNumber((const pbl_message_descriptor_t*) message, number); |
112 | 0 | } |
113 | | |
114 | | /* like Descriptor::FindFieldByName() */ |
115 | | const PbwFieldDescriptor* |
116 | 0 | pbw_Descriptor_FindFieldByName(const PbwDescriptor* message, const char* name) { |
117 | 0 | return (const PbwFieldDescriptor*)pbl_message_descriptor_FindFieldByName((const pbl_message_descriptor_t*) message, name); |
118 | 0 | } |
119 | | |
120 | | /* like FieldDescriptor::full_name() */ |
121 | | const char* |
122 | 0 | pbw_FieldDescriptor_full_name(const PbwFieldDescriptor* field) { |
123 | 0 | return pbl_field_descriptor_full_name((const pbl_field_descriptor_t*) field); |
124 | 0 | } |
125 | | |
126 | | /* like FieldDescriptor::name() */ |
127 | | const char* |
128 | 0 | pbw_FieldDescriptor_name(const PbwFieldDescriptor* field) { |
129 | 0 | return pbl_field_descriptor_name((const pbl_field_descriptor_t*) field); |
130 | 0 | } |
131 | | |
132 | | /* like FieldDescriptor::number() */ |
133 | | int |
134 | 0 | pbw_FieldDescriptor_number(const PbwFieldDescriptor* field) { |
135 | 0 | return pbl_field_descriptor_number((const pbl_field_descriptor_t*) field); |
136 | 0 | } |
137 | | |
138 | | /* like FieldDescriptor::type() */ |
139 | | int |
140 | 0 | pbw_FieldDescriptor_type(const PbwFieldDescriptor* field) { |
141 | 0 | return pbl_field_descriptor_type((const pbl_field_descriptor_t*) field); |
142 | 0 | } |
143 | | |
144 | | /* like FieldDescriptor::is_repeated() */ |
145 | | int |
146 | 0 | pbw_FieldDescriptor_is_repeated(const PbwFieldDescriptor* field) { |
147 | 0 | return pbl_field_descriptor_is_repeated((const pbl_field_descriptor_t*) field); |
148 | 0 | } |
149 | | |
150 | | /* like FieldDescriptor::is_packed() */ |
151 | | int |
152 | 0 | pbw_FieldDescriptor_is_packed(const PbwFieldDescriptor* field) { |
153 | 0 | return pbl_field_descriptor_is_packed((const pbl_field_descriptor_t*) field); |
154 | 0 | } |
155 | | |
156 | | /* like FieldDescriptor::typeName() */ |
157 | | const char* |
158 | 0 | pbw_FieldDescriptor_typeName(int field_type) { |
159 | 0 | return pbl_field_descriptor_TypeName(field_type); |
160 | 0 | } |
161 | | |
162 | | /* like FieldDescriptor::message_type() */ |
163 | | const PbwDescriptor* |
164 | 0 | pbw_FieldDescriptor_message_type(const PbwFieldDescriptor* field) { |
165 | 0 | return (const PbwDescriptor*)pbl_field_descriptor_message_type((const pbl_field_descriptor_t*) field); |
166 | 0 | } |
167 | | |
168 | | /* like FieldDescriptor::enum_type() */ |
169 | | const PbwEnumDescriptor* |
170 | 0 | pbw_FieldDescriptor_enum_type(const PbwFieldDescriptor* field) { |
171 | 0 | return (const PbwEnumDescriptor*)pbl_field_descriptor_enum_type((const pbl_field_descriptor_t*) field); |
172 | 0 | } |
173 | | |
174 | | /* like FieldDescriptor::is_required() */ |
175 | | bool |
176 | 0 | pbw_FieldDescriptor_is_required(const PbwFieldDescriptor* field) { |
177 | 0 | return pbl_field_descriptor_is_required((const pbl_field_descriptor_t*)field); |
178 | 0 | } |
179 | | |
180 | | /* like FieldDescriptor::has_default_value() */ |
181 | | bool |
182 | 0 | pbw_FieldDescriptor_has_default_value(const PbwFieldDescriptor* field) { |
183 | 0 | return pbl_field_descriptor_has_default_value((const pbl_field_descriptor_t*)field); |
184 | 0 | } |
185 | | |
186 | | /* like FieldDescriptor::default_value_int32() */ |
187 | | int32_t |
188 | 0 | pbw_FieldDescriptor_default_value_int32(const PbwFieldDescriptor* field) { |
189 | 0 | return pbl_field_descriptor_default_value_int32((const pbl_field_descriptor_t*)field); |
190 | 0 | } |
191 | | |
192 | | /* like FieldDescriptor::default_value_int64() */ |
193 | | int64_t |
194 | 0 | pbw_FieldDescriptor_default_value_int64(const PbwFieldDescriptor* field) { |
195 | 0 | return pbl_field_descriptor_default_value_int64((const pbl_field_descriptor_t*)field); |
196 | 0 | } |
197 | | |
198 | | /* like FieldDescriptor::default_value_uint32() */ |
199 | | uint32_t |
200 | 0 | pbw_FieldDescriptor_default_value_uint32(const PbwFieldDescriptor* field) { |
201 | 0 | return pbl_field_descriptor_default_value_uint32((const pbl_field_descriptor_t*)field); |
202 | 0 | } |
203 | | |
204 | | /* like FieldDescriptor::default_value_uint64() */ |
205 | | uint64_t |
206 | 0 | pbw_FieldDescriptor_default_value_uint64(const PbwFieldDescriptor* field) { |
207 | 0 | return pbl_field_descriptor_default_value_uint64((const pbl_field_descriptor_t*)field); |
208 | 0 | } |
209 | | |
210 | | /* like FieldDescriptor::default_value_float() */ |
211 | | float |
212 | 0 | pbw_FieldDescriptor_default_value_float(const PbwFieldDescriptor* field) { |
213 | 0 | return pbl_field_descriptor_default_value_float((const pbl_field_descriptor_t*)field); |
214 | 0 | } |
215 | | |
216 | | /* like FieldDescriptor::default_value_double() */ |
217 | | double |
218 | 0 | pbw_FieldDescriptor_default_value_double(const PbwFieldDescriptor* field) { |
219 | 0 | return pbl_field_descriptor_default_value_double((const pbl_field_descriptor_t*)field); |
220 | 0 | } |
221 | | |
222 | | /* like FieldDescriptor::default_value_bool() */ |
223 | | bool |
224 | 0 | pbw_FieldDescriptor_default_value_bool(const PbwFieldDescriptor* field) { |
225 | 0 | return pbl_field_descriptor_default_value_bool((const pbl_field_descriptor_t*)field); |
226 | 0 | } |
227 | | |
228 | | /* like FieldDescriptor::default_value_string() */ |
229 | | const char* |
230 | 0 | pbw_FieldDescriptor_default_value_string(const PbwFieldDescriptor* field, int* size) { |
231 | 0 | return pbl_field_descriptor_default_value_string((const pbl_field_descriptor_t*)field, size); |
232 | 0 | } |
233 | | |
234 | | /* like FieldDescriptor::default_value_enum() */ |
235 | | const PbwEnumValueDescriptor* |
236 | 0 | pbw_FieldDescriptor_default_value_enum(const PbwFieldDescriptor* field) { |
237 | 0 | return (const PbwEnumValueDescriptor*) pbl_field_descriptor_default_value_enum((const pbl_field_descriptor_t*)field); |
238 | 0 | } |
239 | | |
240 | | /* like EnumDescriptor::name() */ |
241 | | const char* |
242 | 0 | pbw_EnumDescriptor_name(const PbwEnumDescriptor* anEnum) { |
243 | 0 | return pbl_enum_descriptor_name((const pbl_enum_descriptor_t*) anEnum); |
244 | 0 | } |
245 | | |
246 | | /* like EnumDescriptor::full_name() */ |
247 | | const char* |
248 | 0 | pbw_EnumDescriptor_full_name(const PbwEnumDescriptor* anEnum) { |
249 | 0 | return pbl_enum_descriptor_full_name((const pbl_enum_descriptor_t*) anEnum); |
250 | 0 | } |
251 | | |
252 | | /* like EnumDescriptor::value_count() */ |
253 | | int |
254 | 0 | pbw_EnumDescriptor_value_count(const PbwEnumDescriptor* anEnum) { |
255 | 0 | return pbl_enum_descriptor_value_count((const pbl_enum_descriptor_t*) anEnum); |
256 | 0 | } |
257 | | |
258 | | /* like EnumDescriptor::value() */ |
259 | | const PbwEnumValueDescriptor* |
260 | 0 | pbw_EnumDescriptor_value(const PbwEnumDescriptor* anEnum, int value_index) { |
261 | 0 | return (const PbwEnumValueDescriptor*) pbl_enum_descriptor_value((const pbl_enum_descriptor_t*) anEnum, value_index); |
262 | 0 | } |
263 | | |
264 | | /* like EnumDescriptor::FindValueByNumber() */ |
265 | | const PbwEnumValueDescriptor* |
266 | 0 | pbw_EnumDescriptor_FindValueByNumber(const PbwEnumDescriptor* anEnum, int number) { |
267 | 0 | return (const PbwEnumValueDescriptor*)pbl_enum_descriptor_FindValueByNumber((const pbl_enum_descriptor_t*) anEnum, number); |
268 | 0 | } |
269 | | |
270 | | /* like EnumDescriptor::FindValueByName() */ |
271 | | const PbwEnumValueDescriptor* |
272 | 0 | pbw_EnumDescriptor_FindValueByName(const PbwEnumDescriptor* anEnum, const char* name) { |
273 | 0 | return (const PbwEnumValueDescriptor*)pbl_enum_descriptor_FindValueByName((const pbl_enum_descriptor_t*)anEnum, name); |
274 | 0 | } |
275 | | |
276 | | /* like EnumValueDescriptor::name() */ |
277 | | const char* |
278 | 0 | pbw_EnumValueDescriptor_name(const PbwEnumValueDescriptor* enumValue) { |
279 | 0 | return pbl_enum_value_descriptor_name((const pbl_enum_value_descriptor_t*) enumValue); |
280 | 0 | } |
281 | | |
282 | | /* like EnumValueDescriptor::full_name() */ |
283 | | const char* |
284 | 0 | pbw_EnumValueDescriptor_full_name(const PbwEnumValueDescriptor* enumValue) { |
285 | 0 | return pbl_enum_value_descriptor_full_name((const pbl_enum_value_descriptor_t*) enumValue); |
286 | 0 | } |
287 | | |
288 | | /* like EnumValueDescriptor::number() */ |
289 | | int |
290 | 0 | pbw_EnumValueDescriptor_number(const PbwEnumValueDescriptor* enumValue) { |
291 | 0 | return pbl_enum_value_descriptor_number((const pbl_enum_value_descriptor_t*) enumValue); |
292 | 0 | } |
293 | | |
294 | | /* visit all messages of this pool */ |
295 | | void |
296 | | pbw_foreach_message(const PbwDescriptorPool* pool, void (*cb)(const PbwDescriptor* message, void* userdata), void* userdata) |
297 | 0 | { |
298 | 0 | pbl_foreach_message((const pbl_descriptor_pool_t*) pool, (void (*)(const pbl_message_descriptor_t*, void*)) cb, userdata); |
299 | 0 | } |
300 | | |
301 | | /* |
302 | | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
303 | | * |
304 | | * Local variables: |
305 | | * c-basic-offset: 4 |
306 | | * tab-width: 8 |
307 | | * indent-tabs-mode: nil |
308 | | * End: |
309 | | * |
310 | | * vi: set shiftwidth=4 tabstop=8 expandtab: |
311 | | * :indentSize=4:tabSize=8:noTabs=true: |
312 | | */ |