1 /*
2 * Automatically generated from spybye.rpc
3 * by event_rpcgen.py/0.1. DO NOT EDIT THIS FILE.
4 */
5
6 #include <sys/types.h>
7 #include <sys/time.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <assert.h>
11 #include <event.h>
12
13
14 #include "spybye.gen.h"
15
16 void event_err(int eval, const char *fmt, ...);
17 void event_warn(const char *fmt, ...);
18 void event_errx(int eval, const char *fmt, ...);
19 void event_warnx(const char *fmt, ...);
20
21
22 /*
23 * Implementation of dangerousload
24 */
25
26 struct dangerousload *
dangerousload_new()27 dangerousload_new()
28 {
29 struct dangerousload *tmp;
30 if ((tmp = malloc(sizeof(struct dangerousload))) == NULL) {
31 event_warn("%s: malloc", __func__);
32 return (NULL);
33 }
34 tmp->time_in_seconds_assign = dangerousload_time_in_seconds_assign;
35 tmp->time_in_seconds_get = dangerousload_time_in_seconds_get;
36 tmp->time_in_seconds_set = 0;
37
38 tmp->parent_url_data = NULL;
39 tmp->parent_url_assign = dangerousload_parent_url_assign;
40 tmp->parent_url_get = dangerousload_parent_url_get;
41 tmp->parent_url_set = 0;
42
43 tmp->dangerous_url_data = NULL;
44 tmp->dangerous_url_assign = dangerousload_dangerous_url_assign;
45 tmp->dangerous_url_get = dangerousload_dangerous_url_get;
46 tmp->dangerous_url_set = 0;
47
48 tmp->virus_result_data = NULL;
49 tmp->virus_result_assign = dangerousload_virus_result_assign;
50 tmp->virus_result_get = dangerousload_virus_result_get;
51 tmp->virus_result_set = 0;
52
53 memset(tmp->digest_data, 0, sizeof(tmp->digest_data));
54 tmp->digest_assign = dangerousload_digest_assign;
55 tmp->digest_get = dangerousload_digest_get;
56 tmp->digest_set = 0;
57
58 return (tmp);
59 }
60
61
62
63
64
65
66 int
dangerousload_time_in_seconds_assign(struct dangerousload * msg,const u_int32_t value)67 dangerousload_time_in_seconds_assign(struct dangerousload *msg, const u_int32_t value)
68 {
69 msg->time_in_seconds_set = 1;
70 msg->time_in_seconds_data = value;
71 return (0);
72 }
73
74 int
dangerousload_parent_url_assign(struct dangerousload * msg,const char * value)75 dangerousload_parent_url_assign(struct dangerousload *msg, const char * value)
76 {
77 if (msg->parent_url_data != NULL)
78 free(msg->parent_url_data);
79 if ((msg->parent_url_data = strdup(value)) == NULL)
80 return (-1);
81 msg->parent_url_set = 1;
82 return (0);
83 }
84
85 int
dangerousload_dangerous_url_assign(struct dangerousload * msg,const char * value)86 dangerousload_dangerous_url_assign(struct dangerousload *msg, const char * value)
87 {
88 if (msg->dangerous_url_data != NULL)
89 free(msg->dangerous_url_data);
90 if ((msg->dangerous_url_data = strdup(value)) == NULL)
91 return (-1);
92 msg->dangerous_url_set = 1;
93 return (0);
94 }
95
96 int
dangerousload_virus_result_assign(struct dangerousload * msg,const char * value)97 dangerousload_virus_result_assign(struct dangerousload *msg, const char * value)
98 {
99 if (msg->virus_result_data != NULL)
100 free(msg->virus_result_data);
101 if ((msg->virus_result_data = strdup(value)) == NULL)
102 return (-1);
103 msg->virus_result_set = 1;
104 return (0);
105 }
106
107 int
dangerousload_digest_assign(struct dangerousload * msg,const u_int8_t * value)108 dangerousload_digest_assign(struct dangerousload *msg, const u_int8_t *value)
109 {
110 msg->digest_set = 1;
111 memcpy(msg->digest_data, value, 16);
112 return (0);
113 }
114
115 int
dangerousload_time_in_seconds_get(struct dangerousload * msg,u_int32_t * value)116 dangerousload_time_in_seconds_get(struct dangerousload *msg, u_int32_t *value)
117 {
118 if (msg->time_in_seconds_set != 1)
119 return (-1);
120 *value = msg->time_in_seconds_data;
121 return (0);
122 }
123
124 int
dangerousload_parent_url_get(struct dangerousload * msg,char ** value)125 dangerousload_parent_url_get(struct dangerousload *msg, char * *value)
126 {
127 if (msg->parent_url_set != 1)
128 return (-1);
129 *value = msg->parent_url_data;
130 return (0);
131 }
132
133 int
dangerousload_dangerous_url_get(struct dangerousload * msg,char ** value)134 dangerousload_dangerous_url_get(struct dangerousload *msg, char * *value)
135 {
136 if (msg->dangerous_url_set != 1)
137 return (-1);
138 *value = msg->dangerous_url_data;
139 return (0);
140 }
141
142 int
dangerousload_virus_result_get(struct dangerousload * msg,char ** value)143 dangerousload_virus_result_get(struct dangerousload *msg, char * *value)
144 {
145 if (msg->virus_result_set != 1)
146 return (-1);
147 *value = msg->virus_result_data;
148 return (0);
149 }
150
151 int
dangerousload_digest_get(struct dangerousload * msg,u_int8_t ** value)152 dangerousload_digest_get(struct dangerousload *msg, u_int8_t **value)
153 {
154 if (msg->digest_set != 1)
155 return (-1);
156 *value = msg->digest_data;
157 return (0);
158 }
159
160 void
dangerousload_clear(struct dangerousload * tmp)161 dangerousload_clear(struct dangerousload *tmp)
162 {
163 tmp->time_in_seconds_set = 0;
164 if (tmp->parent_url_set == 1) {
165 free (tmp->parent_url_data);
166 tmp->parent_url_data = NULL;
167 tmp->parent_url_set = 0;
168 }
169 if (tmp->dangerous_url_set == 1) {
170 free (tmp->dangerous_url_data);
171 tmp->dangerous_url_data = NULL;
172 tmp->dangerous_url_set = 0;
173 }
174 if (tmp->virus_result_set == 1) {
175 free (tmp->virus_result_data);
176 tmp->virus_result_data = NULL;
177 tmp->virus_result_set = 0;
178 }
179 tmp->digest_set = 0;
180 memset(tmp->digest_data, 0, sizeof(tmp->digest_data));
181 }
182
183 void
dangerousload_free(struct dangerousload * tmp)184 dangerousload_free(struct dangerousload *tmp)
185 {
186 if (tmp->parent_url_data != NULL)
187 free (tmp->parent_url_data);
188 if (tmp->dangerous_url_data != NULL)
189 free (tmp->dangerous_url_data);
190 if (tmp->virus_result_data != NULL)
191 free (tmp->virus_result_data);
192 free(tmp);
193 }
194
195 void
dangerousload_marshal(struct evbuffer * evbuf,const struct dangerousload * tmp)196 dangerousload_marshal(struct evbuffer *evbuf, const struct dangerousload *tmp){
197 evtag_marshal_int(evbuf, DANGEROUSLOAD_TIME_IN_SECONDS, tmp->time_in_seconds_data);
198 evtag_marshal_string(evbuf, DANGEROUSLOAD_PARENT_URL, tmp->parent_url_data);
199 evtag_marshal_string(evbuf, DANGEROUSLOAD_DANGEROUS_URL, tmp->dangerous_url_data);
200 if (tmp->virus_result_set) {
201 evtag_marshal_string(evbuf, DANGEROUSLOAD_VIRUS_RESULT, tmp->virus_result_data);
202 }
203 if (tmp->digest_set) {
204 evtag_marshal(evbuf, DANGEROUSLOAD_DIGEST, tmp->digest_data, sizeof(tmp->digest_data));
205 }
206 }
207
208 int
dangerousload_unmarshal(struct dangerousload * tmp,struct evbuffer * evbuf)209 dangerousload_unmarshal(struct dangerousload *tmp, struct evbuffer *evbuf)
210 {
211 u_int8_t tag;
212 while (EVBUFFER_LENGTH(evbuf) > 0) {
213 if (evtag_peek(evbuf, &tag) == -1)
214 return (-1);
215 switch (tag) {
216
217 case DANGEROUSLOAD_TIME_IN_SECONDS:
218
219 if (tmp->time_in_seconds_set)
220 return (-1);
221 if (evtag_unmarshal_int(evbuf, DANGEROUSLOAD_TIME_IN_SECONDS, &tmp->time_in_seconds_data) == -1) {
222 event_warnx("%s: failed to unmarshal time_in_seconds", __func__);
223 return (-1);
224 }
225 tmp->time_in_seconds_set = 1;
226 break;
227
228 case DANGEROUSLOAD_PARENT_URL:
229
230 if (tmp->parent_url_set)
231 return (-1);
232 if (evtag_unmarshal_string(evbuf, DANGEROUSLOAD_PARENT_URL, &tmp->parent_url_data) == -1) {
233 event_warnx("%s: failed to unmarshal parent_url", __func__);
234 return (-1);
235 }
236 tmp->parent_url_set = 1;
237 break;
238
239 case DANGEROUSLOAD_DANGEROUS_URL:
240
241 if (tmp->dangerous_url_set)
242 return (-1);
243 if (evtag_unmarshal_string(evbuf, DANGEROUSLOAD_DANGEROUS_URL, &tmp->dangerous_url_data) == -1) {
244 event_warnx("%s: failed to unmarshal dangerous_url", __func__);
245 return (-1);
246 }
247 tmp->dangerous_url_set = 1;
248 break;
249
250 case DANGEROUSLOAD_VIRUS_RESULT:
251
252 if (tmp->virus_result_set)
253 return (-1);
254 if (evtag_unmarshal_string(evbuf, DANGEROUSLOAD_VIRUS_RESULT, &tmp->virus_result_data) == -1) {
255 event_warnx("%s: failed to unmarshal virus_result", __func__);
256 return (-1);
257 }
258 tmp->virus_result_set = 1;
259 break;
260
261 case DANGEROUSLOAD_DIGEST:
262
263 if (tmp->digest_set)
264 return (-1);
265 if (evtag_unmarshal_fixed(evbuf, DANGEROUSLOAD_DIGEST, tmp->digest_data, sizeof(tmp->digest_data)) == -1) {
266 event_warnx("%s: failed to unmarshal digest", __func__);
267 return (-1);
268 }
269 tmp->digest_set = 1;
270 break;
271
272 default:
273 return -1;
274 }
275 }
276
277 if (dangerousload_complete(tmp) == -1)
278 return (-1);
279 return (0);
280 }
281
282 int
dangerousload_complete(struct dangerousload * msg)283 dangerousload_complete(struct dangerousload *msg)
284 {
285 if (!msg->time_in_seconds_set)
286 return (-1);
287 if (!msg->parent_url_set)
288 return (-1);
289 if (!msg->dangerous_url_set)
290 return (-1);
291 return (0);
292 }
293
294 int
evtag_unmarshal_dangerousload(struct evbuffer * evbuf,u_int8_t need_tag,struct dangerousload * msg)295 evtag_unmarshal_dangerousload(struct evbuffer *evbuf, u_int8_t need_tag, struct dangerousload *msg)
296 {
297 u_int8_t tag;
298 int res = -1;
299
300 struct evbuffer *tmp = evbuffer_new();
301
302 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
303 goto error;
304
305 if (dangerousload_unmarshal(msg, tmp) == -1)
306 goto error;
307
308 res = 0;
309
310 error:
311 evbuffer_free(tmp);
312 return (res);
313 }
314
315 void
evtag_marshal_dangerousload(struct evbuffer * evbuf,u_int8_t tag,const struct dangerousload * msg)316 evtag_marshal_dangerousload(struct evbuffer *evbuf, u_int8_t tag, const struct dangerousload *msg)
317 {
318 struct evbuffer *_buf = evbuffer_new();
319 assert(_buf != NULL);
320 evbuffer_drain(_buf, -1);
321 dangerousload_marshal(_buf, msg);
322 evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
323 evbuffer_free(_buf);
324 }
325
326 /*
327 * Implementation of dangerous_report
328 */
329
330 struct dangerous_report *
dangerous_report_new()331 dangerous_report_new()
332 {
333 struct dangerous_report *tmp;
334 if ((tmp = malloc(sizeof(struct dangerous_report))) == NULL) {
335 event_warn("%s: malloc", __func__);
336 return (NULL);
337 }
338 tmp->time_in_seconds_assign = dangerous_report_time_in_seconds_assign;
339 tmp->time_in_seconds_get = dangerous_report_time_in_seconds_get;
340 tmp->time_in_seconds_set = 0;
341
342 tmp->remote_ip_data = NULL;
343 tmp->remote_ip_assign = dangerous_report_remote_ip_assign;
344 tmp->remote_ip_get = dangerous_report_remote_ip_get;
345 tmp->remote_ip_set = 0;
346
347 tmp->report_data = NULL;
348 tmp->report_assign = dangerous_report_report_assign;
349 tmp->report_get = dangerous_report_report_get;
350 tmp->report_set = 0;
351
352 return (tmp);
353 }
354
355
356
357
358 int
dangerous_report_time_in_seconds_assign(struct dangerous_report * msg,const u_int32_t value)359 dangerous_report_time_in_seconds_assign(struct dangerous_report *msg, const u_int32_t value)
360 {
361 msg->time_in_seconds_set = 1;
362 msg->time_in_seconds_data = value;
363 return (0);
364 }
365
366 int
dangerous_report_remote_ip_assign(struct dangerous_report * msg,const char * value)367 dangerous_report_remote_ip_assign(struct dangerous_report *msg, const char * value)
368 {
369 if (msg->remote_ip_data != NULL)
370 free(msg->remote_ip_data);
371 if ((msg->remote_ip_data = strdup(value)) == NULL)
372 return (-1);
373 msg->remote_ip_set = 1;
374 return (0);
375 }
376
377 int
dangerous_report_report_assign(struct dangerous_report * msg,const struct dangerousload * value)378 dangerous_report_report_assign(struct dangerous_report *msg, const struct dangerousload *value)
379 {
380 struct evbuffer *tmp = NULL;
381 if (msg->report_set) {
382 dangerousload_clear(msg->report_data);
383 msg->report_set = 0;
384 } else {
385 msg->report_data = dangerousload_new();
386 if (msg->report_data == NULL) {
387 event_warn("%s: dangerousload_new()", __func__);
388 goto error;
389 }
390 }
391 if ((tmp = evbuffer_new()) == NULL) {
392 event_warn("%s: evbuffer_new()", __func__);
393 goto error;
394 }
395 dangerousload_marshal(tmp, value);
396 if (dangerousload_unmarshal(msg->report_data, tmp) == -1) {
397 event_warnx("%s: dangerousload_unmarshal", __func__);
398 goto error;
399 }
400 msg->report_set = 1;
401 evbuffer_free(tmp);
402 return (0);
403 error:
404 if (tmp != NULL)
405 evbuffer_free(tmp);
406 if (msg->report_data != NULL) {
407 dangerousload_free(msg->report_data);
408 msg->report_data = NULL;
409 }
410 return (-1);
411 }
412
413 int
dangerous_report_time_in_seconds_get(struct dangerous_report * msg,u_int32_t * value)414 dangerous_report_time_in_seconds_get(struct dangerous_report *msg, u_int32_t *value)
415 {
416 if (msg->time_in_seconds_set != 1)
417 return (-1);
418 *value = msg->time_in_seconds_data;
419 return (0);
420 }
421
422 int
dangerous_report_remote_ip_get(struct dangerous_report * msg,char ** value)423 dangerous_report_remote_ip_get(struct dangerous_report *msg, char * *value)
424 {
425 if (msg->remote_ip_set != 1)
426 return (-1);
427 *value = msg->remote_ip_data;
428 return (0);
429 }
430
431 int
dangerous_report_report_get(struct dangerous_report * msg,struct dangerousload ** value)432 dangerous_report_report_get(struct dangerous_report *msg, struct dangerousload **value)
433 {
434 if (msg->report_set != 1) {
435 msg->report_data = dangerousload_new();
436 if (msg->report_data == NULL)
437 return (-1);
438 msg->report_set = 1;
439 }
440 *value = msg->report_data;
441 return (0);
442 }
443
444 void
dangerous_report_clear(struct dangerous_report * tmp)445 dangerous_report_clear(struct dangerous_report *tmp)
446 {
447 tmp->time_in_seconds_set = 0;
448 if (tmp->remote_ip_set == 1) {
449 free (tmp->remote_ip_data);
450 tmp->remote_ip_data = NULL;
451 tmp->remote_ip_set = 0;
452 }
453 if (tmp->report_set == 1) {
454 dangerousload_free(tmp->report_data);
455 tmp->report_data = NULL;
456 tmp->report_set = 0;
457 }
458 }
459
460 void
dangerous_report_free(struct dangerous_report * tmp)461 dangerous_report_free(struct dangerous_report *tmp)
462 {
463 if (tmp->remote_ip_data != NULL)
464 free (tmp->remote_ip_data);
465 if (tmp->report_data != NULL)
466 dangerousload_free(tmp->report_data);
467 free(tmp);
468 }
469
470 void
dangerous_report_marshal(struct evbuffer * evbuf,const struct dangerous_report * tmp)471 dangerous_report_marshal(struct evbuffer *evbuf, const struct dangerous_report *tmp){
472 evtag_marshal_int(evbuf, DANGEROUS_REPORT_TIME_IN_SECONDS, tmp->time_in_seconds_data);
473 evtag_marshal_string(evbuf, DANGEROUS_REPORT_REMOTE_IP, tmp->remote_ip_data);
474 evtag_marshal_dangerousload(evbuf, DANGEROUS_REPORT_REPORT, tmp->report_data);
475 }
476
477 int
dangerous_report_unmarshal(struct dangerous_report * tmp,struct evbuffer * evbuf)478 dangerous_report_unmarshal(struct dangerous_report *tmp, struct evbuffer *evbuf)
479 {
480 u_int8_t tag;
481 while (EVBUFFER_LENGTH(evbuf) > 0) {
482 if (evtag_peek(evbuf, &tag) == -1)
483 return (-1);
484 switch (tag) {
485
486 case DANGEROUS_REPORT_TIME_IN_SECONDS:
487
488 if (tmp->time_in_seconds_set)
489 return (-1);
490 if (evtag_unmarshal_int(evbuf, DANGEROUS_REPORT_TIME_IN_SECONDS, &tmp->time_in_seconds_data) == -1) {
491 event_warnx("%s: failed to unmarshal time_in_seconds", __func__);
492 return (-1);
493 }
494 tmp->time_in_seconds_set = 1;
495 break;
496
497 case DANGEROUS_REPORT_REMOTE_IP:
498
499 if (tmp->remote_ip_set)
500 return (-1);
501 if (evtag_unmarshal_string(evbuf, DANGEROUS_REPORT_REMOTE_IP, &tmp->remote_ip_data) == -1) {
502 event_warnx("%s: failed to unmarshal remote_ip", __func__);
503 return (-1);
504 }
505 tmp->remote_ip_set = 1;
506 break;
507
508 case DANGEROUS_REPORT_REPORT:
509
510 if (tmp->report_set)
511 return (-1);
512 tmp->report_data = dangerousload_new();
513 if (tmp->report_data == NULL)
514 return (-1);
515 if (evtag_unmarshal_dangerousload(evbuf, DANGEROUS_REPORT_REPORT, tmp->report_data) == -1) {
516 event_warnx("%s: failed to unmarshal report", __func__);
517 return (-1);
518 }
519 tmp->report_set = 1;
520 break;
521
522 default:
523 return -1;
524 }
525 }
526
527 if (dangerous_report_complete(tmp) == -1)
528 return (-1);
529 return (0);
530 }
531
532 int
dangerous_report_complete(struct dangerous_report * msg)533 dangerous_report_complete(struct dangerous_report *msg)
534 {
535 if (!msg->time_in_seconds_set)
536 return (-1);
537 if (!msg->remote_ip_set)
538 return (-1);
539 if (dangerousload_complete(msg->report_data) == -1)
540 return (-1);
541 return (0);
542 }
543
544 int
evtag_unmarshal_dangerous_report(struct evbuffer * evbuf,u_int8_t need_tag,struct dangerous_report * msg)545 evtag_unmarshal_dangerous_report(struct evbuffer *evbuf, u_int8_t need_tag, struct dangerous_report *msg)
546 {
547 u_int8_t tag;
548 int res = -1;
549
550 struct evbuffer *tmp = evbuffer_new();
551
552 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
553 goto error;
554
555 if (dangerous_report_unmarshal(msg, tmp) == -1)
556 goto error;
557
558 res = 0;
559
560 error:
561 evbuffer_free(tmp);
562 return (res);
563 }
564
565 void
evtag_marshal_dangerous_report(struct evbuffer * evbuf,u_int8_t tag,const struct dangerous_report * msg)566 evtag_marshal_dangerous_report(struct evbuffer *evbuf, u_int8_t tag, const struct dangerous_report *msg)
567 {
568 struct evbuffer *_buf = evbuffer_new();
569 assert(_buf != NULL);
570 evbuffer_drain(_buf, -1);
571 dangerous_report_marshal(_buf, msg);
572 evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
573 evbuffer_free(_buf);
574 }
575
576 /*
577 * Implementation of virusscan
578 */
579
580 struct virusscan *
virusscan_new()581 virusscan_new()
582 {
583 struct virusscan *tmp;
584 if ((tmp = malloc(sizeof(struct virusscan))) == NULL) {
585 event_warn("%s: malloc", __func__);
586 return (NULL);
587 }
588 tmp->buffer_data = NULL;
589 tmp->buffer_length = 0;
590 tmp->buffer_assign = virusscan_buffer_assign;
591 tmp->buffer_get = virusscan_buffer_get;
592 tmp->buffer_set = 0;
593
594 tmp->context_data = NULL;
595 tmp->context_length = 0;
596 tmp->context_assign = virusscan_context_assign;
597 tmp->context_get = virusscan_context_get;
598 tmp->context_set = 0;
599
600 return (tmp);
601 }
602
603
604
605 int
virusscan_buffer_assign(struct virusscan * msg,const u_int8_t * value,u_int32_t len)606 virusscan_buffer_assign(struct virusscan *msg, const u_int8_t * value, u_int32_t len)
607 {
608 if (msg->buffer_data != NULL)
609 free (msg->buffer_data);
610 msg->buffer_data = malloc(len);
611 if (msg->buffer_data == NULL)
612 return (-1);
613 msg->buffer_set = 1;
614 msg->buffer_length = len;
615 memcpy(msg->buffer_data, value, len);
616 return (0);
617 }
618
619 int
virusscan_context_assign(struct virusscan * msg,const u_int8_t * value,u_int32_t len)620 virusscan_context_assign(struct virusscan *msg, const u_int8_t * value, u_int32_t len)
621 {
622 if (msg->context_data != NULL)
623 free (msg->context_data);
624 msg->context_data = malloc(len);
625 if (msg->context_data == NULL)
626 return (-1);
627 msg->context_set = 1;
628 msg->context_length = len;
629 memcpy(msg->context_data, value, len);
630 return (0);
631 }
632
633 int
virusscan_buffer_get(struct virusscan * msg,u_int8_t ** value,u_int32_t * plen)634 virusscan_buffer_get(struct virusscan *msg, u_int8_t * *value, u_int32_t *plen)
635 {
636 if (msg->buffer_set != 1)
637 return (-1);
638 *value = msg->buffer_data;
639 *plen = msg->buffer_length;
640 return (0);
641 }
642
643 int
virusscan_context_get(struct virusscan * msg,u_int8_t ** value,u_int32_t * plen)644 virusscan_context_get(struct virusscan *msg, u_int8_t * *value, u_int32_t *plen)
645 {
646 if (msg->context_set != 1)
647 return (-1);
648 *value = msg->context_data;
649 *plen = msg->context_length;
650 return (0);
651 }
652
653 void
virusscan_clear(struct virusscan * tmp)654 virusscan_clear(struct virusscan *tmp)
655 {
656 if (tmp->buffer_set == 1) {
657 free (tmp->buffer_data);
658 tmp->buffer_data = NULL;
659 tmp->buffer_length = 0;
660 tmp->buffer_set = 0;
661 }
662 if (tmp->context_set == 1) {
663 free (tmp->context_data);
664 tmp->context_data = NULL;
665 tmp->context_length = 0;
666 tmp->context_set = 0;
667 }
668 }
669
670 void
virusscan_free(struct virusscan * tmp)671 virusscan_free(struct virusscan *tmp)
672 {
673 if (tmp->buffer_data != NULL)
674 free (tmp->buffer_data);
675 if (tmp->context_data != NULL)
676 free (tmp->context_data);
677 free(tmp);
678 }
679
680 void
virusscan_marshal(struct evbuffer * evbuf,const struct virusscan * tmp)681 virusscan_marshal(struct evbuffer *evbuf, const struct virusscan *tmp){
682 evtag_marshal(evbuf, VIRUSSCAN_BUFFER, tmp->buffer_data, tmp->buffer_length);
683 evtag_marshal(evbuf, VIRUSSCAN_CONTEXT, tmp->context_data, tmp->context_length);
684 }
685
686 int
virusscan_unmarshal(struct virusscan * tmp,struct evbuffer * evbuf)687 virusscan_unmarshal(struct virusscan *tmp, struct evbuffer *evbuf)
688 {
689 u_int8_t tag;
690 while (EVBUFFER_LENGTH(evbuf) > 0) {
691 if (evtag_peek(evbuf, &tag) == -1)
692 return (-1);
693 switch (tag) {
694
695 case VIRUSSCAN_BUFFER:
696
697 if (tmp->buffer_set)
698 return (-1);
699 if (evtag_payload_length(evbuf, &tmp->buffer_length) == -1)
700 return (-1);
701 if (tmp->buffer_length > EVBUFFER_LENGTH(evbuf))
702 return (-1);
703 if ((tmp->buffer_data = malloc(tmp->buffer_length)) == NULL)
704 return (-1);
705 if (evtag_unmarshal_fixed(evbuf, VIRUSSCAN_BUFFER, tmp->buffer_data, tmp->buffer_length) == -1) {
706 event_warnx("%s: failed to unmarshal buffer", __func__);
707 return (-1);
708 }
709 tmp->buffer_set = 1;
710 break;
711
712 case VIRUSSCAN_CONTEXT:
713
714 if (tmp->context_set)
715 return (-1);
716 if (evtag_payload_length(evbuf, &tmp->context_length) == -1)
717 return (-1);
718 if (tmp->context_length > EVBUFFER_LENGTH(evbuf))
719 return (-1);
720 if ((tmp->context_data = malloc(tmp->context_length)) == NULL)
721 return (-1);
722 if (evtag_unmarshal_fixed(evbuf, VIRUSSCAN_CONTEXT, tmp->context_data, tmp->context_length) == -1) {
723 event_warnx("%s: failed to unmarshal context", __func__);
724 return (-1);
725 }
726 tmp->context_set = 1;
727 break;
728
729 default:
730 return -1;
731 }
732 }
733
734 if (virusscan_complete(tmp) == -1)
735 return (-1);
736 return (0);
737 }
738
739 int
virusscan_complete(struct virusscan * msg)740 virusscan_complete(struct virusscan *msg)
741 {
742 if (!msg->buffer_set)
743 return (-1);
744 if (!msg->context_set)
745 return (-1);
746 return (0);
747 }
748
749 int
evtag_unmarshal_virusscan(struct evbuffer * evbuf,u_int8_t need_tag,struct virusscan * msg)750 evtag_unmarshal_virusscan(struct evbuffer *evbuf, u_int8_t need_tag, struct virusscan *msg)
751 {
752 u_int8_t tag;
753 int res = -1;
754
755 struct evbuffer *tmp = evbuffer_new();
756
757 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
758 goto error;
759
760 if (virusscan_unmarshal(msg, tmp) == -1)
761 goto error;
762
763 res = 0;
764
765 error:
766 evbuffer_free(tmp);
767 return (res);
768 }
769
770 void
evtag_marshal_virusscan(struct evbuffer * evbuf,u_int8_t tag,const struct virusscan * msg)771 evtag_marshal_virusscan(struct evbuffer *evbuf, u_int8_t tag, const struct virusscan *msg)
772 {
773 struct evbuffer *_buf = evbuffer_new();
774 assert(_buf != NULL);
775 evbuffer_drain(_buf, -1);
776 virusscan_marshal(_buf, msg);
777 evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
778 evbuffer_free(_buf);
779 }
780
781 /*
782 * Implementation of virusresult
783 */
784
785 struct virusresult *
virusresult_new()786 virusresult_new()
787 {
788 struct virusresult *tmp;
789 if ((tmp = malloc(sizeof(struct virusresult))) == NULL) {
790 event_warn("%s: malloc", __func__);
791 return (NULL);
792 }
793 tmp->result_data = NULL;
794 tmp->result_assign = virusresult_result_assign;
795 tmp->result_get = virusresult_result_get;
796 tmp->result_set = 0;
797
798 tmp->context_data = NULL;
799 tmp->context_length = 0;
800 tmp->context_assign = virusresult_context_assign;
801 tmp->context_get = virusresult_context_get;
802 tmp->context_set = 0;
803
804 return (tmp);
805 }
806
807
808
809 int
virusresult_result_assign(struct virusresult * msg,const char * value)810 virusresult_result_assign(struct virusresult *msg, const char * value)
811 {
812 if (msg->result_data != NULL)
813 free(msg->result_data);
814 if ((msg->result_data = strdup(value)) == NULL)
815 return (-1);
816 msg->result_set = 1;
817 return (0);
818 }
819
820 int
virusresult_context_assign(struct virusresult * msg,const u_int8_t * value,u_int32_t len)821 virusresult_context_assign(struct virusresult *msg, const u_int8_t * value, u_int32_t len)
822 {
823 if (msg->context_data != NULL)
824 free (msg->context_data);
825 msg->context_data = malloc(len);
826 if (msg->context_data == NULL)
827 return (-1);
828 msg->context_set = 1;
829 msg->context_length = len;
830 memcpy(msg->context_data, value, len);
831 return (0);
832 }
833
834 int
virusresult_result_get(struct virusresult * msg,char ** value)835 virusresult_result_get(struct virusresult *msg, char * *value)
836 {
837 if (msg->result_set != 1)
838 return (-1);
839 *value = msg->result_data;
840 return (0);
841 }
842
843 int
virusresult_context_get(struct virusresult * msg,u_int8_t ** value,u_int32_t * plen)844 virusresult_context_get(struct virusresult *msg, u_int8_t * *value, u_int32_t *plen)
845 {
846 if (msg->context_set != 1)
847 return (-1);
848 *value = msg->context_data;
849 *plen = msg->context_length;
850 return (0);
851 }
852
853 void
virusresult_clear(struct virusresult * tmp)854 virusresult_clear(struct virusresult *tmp)
855 {
856 if (tmp->result_set == 1) {
857 free (tmp->result_data);
858 tmp->result_data = NULL;
859 tmp->result_set = 0;
860 }
861 if (tmp->context_set == 1) {
862 free (tmp->context_data);
863 tmp->context_data = NULL;
864 tmp->context_length = 0;
865 tmp->context_set = 0;
866 }
867 }
868
869 void
virusresult_free(struct virusresult * tmp)870 virusresult_free(struct virusresult *tmp)
871 {
872 if (tmp->result_data != NULL)
873 free (tmp->result_data);
874 if (tmp->context_data != NULL)
875 free (tmp->context_data);
876 free(tmp);
877 }
878
879 void
virusresult_marshal(struct evbuffer * evbuf,const struct virusresult * tmp)880 virusresult_marshal(struct evbuffer *evbuf, const struct virusresult *tmp){
881 evtag_marshal_string(evbuf, VIRUSRESULT_RESULT, tmp->result_data);
882 evtag_marshal(evbuf, VIRUSRESULT_CONTEXT, tmp->context_data, tmp->context_length);
883 }
884
885 int
virusresult_unmarshal(struct virusresult * tmp,struct evbuffer * evbuf)886 virusresult_unmarshal(struct virusresult *tmp, struct evbuffer *evbuf)
887 {
888 u_int8_t tag;
889 while (EVBUFFER_LENGTH(evbuf) > 0) {
890 if (evtag_peek(evbuf, &tag) == -1)
891 return (-1);
892 switch (tag) {
893
894 case VIRUSRESULT_RESULT:
895
896 if (tmp->result_set)
897 return (-1);
898 if (evtag_unmarshal_string(evbuf, VIRUSRESULT_RESULT, &tmp->result_data) == -1) {
899 event_warnx("%s: failed to unmarshal result", __func__);
900 return (-1);
901 }
902 tmp->result_set = 1;
903 break;
904
905 case VIRUSRESULT_CONTEXT:
906
907 if (tmp->context_set)
908 return (-1);
909 if (evtag_payload_length(evbuf, &tmp->context_length) == -1)
910 return (-1);
911 if (tmp->context_length > EVBUFFER_LENGTH(evbuf))
912 return (-1);
913 if ((tmp->context_data = malloc(tmp->context_length)) == NULL)
914 return (-1);
915 if (evtag_unmarshal_fixed(evbuf, VIRUSRESULT_CONTEXT, tmp->context_data, tmp->context_length) == -1) {
916 event_warnx("%s: failed to unmarshal context", __func__);
917 return (-1);
918 }
919 tmp->context_set = 1;
920 break;
921
922 default:
923 return -1;
924 }
925 }
926
927 if (virusresult_complete(tmp) == -1)
928 return (-1);
929 return (0);
930 }
931
932 int
virusresult_complete(struct virusresult * msg)933 virusresult_complete(struct virusresult *msg)
934 {
935 if (!msg->result_set)
936 return (-1);
937 if (!msg->context_set)
938 return (-1);
939 return (0);
940 }
941
942 int
evtag_unmarshal_virusresult(struct evbuffer * evbuf,u_int8_t need_tag,struct virusresult * msg)943 evtag_unmarshal_virusresult(struct evbuffer *evbuf, u_int8_t need_tag, struct virusresult *msg)
944 {
945 u_int8_t tag;
946 int res = -1;
947
948 struct evbuffer *tmp = evbuffer_new();
949
950 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
951 goto error;
952
953 if (virusresult_unmarshal(msg, tmp) == -1)
954 goto error;
955
956 res = 0;
957
958 error:
959 evbuffer_free(tmp);
960 return (res);
961 }
962
963 void
evtag_marshal_virusresult(struct evbuffer * evbuf,u_int8_t tag,const struct virusresult * msg)964 evtag_marshal_virusresult(struct evbuffer *evbuf, u_int8_t tag, const struct virusresult *msg)
965 {
966 struct evbuffer *_buf = evbuffer_new();
967 assert(_buf != NULL);
968 evbuffer_drain(_buf, -1);
969 virusresult_marshal(_buf, msg);
970 evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
971 evbuffer_free(_buf);
972 }
973
974