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