• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Automatically generated from ./regress.rpc
3  * by event_rpcgen.py/0.1.  DO NOT EDIT THIS FILE.
4  */
5 
6 #include <sys/types.h>
7 #ifdef _EVENT_HAVE_SYS_TIME_H
8 #include <sys/time.h>
9 #endif
10 #include <stdlib.h>
11 #include <string.h>
12 #include <assert.h>
13 #define EVENT_NO_STRUCT
14 #include <event.h>
15 
16 #ifdef _EVENT___func__
17 #define __func__ _EVENT___func__
18 #endif
19 
20 #include "./regress.gen.h"
21 
22 void event_err(int eval, const char *fmt, ...);
23 void event_warn(const char *fmt, ...);
24 void event_errx(int eval, const char *fmt, ...);
25 void event_warnx(const char *fmt, ...);
26 
27 
28 /*
29  * Implementation of msg
30  */
31 
32 static struct msg_access_ __msg_base = {
33   msg_from_name_assign,
34   msg_from_name_get,
35   msg_to_name_assign,
36   msg_to_name_get,
37   msg_attack_assign,
38   msg_attack_get,
39   msg_run_assign,
40   msg_run_get,
41   msg_run_add,
42 };
43 
44 struct msg *
msg_new(void)45 msg_new(void)
46 {
47   struct msg *tmp;
48   if ((tmp = malloc(sizeof(struct msg))) == NULL) {
49     event_warn("%s: malloc", __func__);
50     return (NULL);
51   }
52   tmp->base = &__msg_base;
53 
54   tmp->from_name_data = NULL;
55   tmp->from_name_set = 0;
56 
57   tmp->to_name_data = NULL;
58   tmp->to_name_set = 0;
59 
60   tmp->attack_data = NULL;
61   tmp->attack_set = 0;
62 
63   tmp->run_data = NULL;
64   tmp->run_length = 0;
65   tmp->run_num_allocated = 0;
66   tmp->run_set = 0;
67 
68   return (tmp);
69 }
70 
71 
72 
73 
74 struct run *
msg_run_add(struct msg * msg)75 msg_run_add(struct msg *msg)
76 {
77   if (++msg->run_length >= msg->run_num_allocated) {
78     int tobe_allocated = msg->run_num_allocated;
79     struct run ** new_data = NULL;
80     tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;
81     new_data = (struct run **) realloc(msg->run_data,
82         tobe_allocated * sizeof(struct run *));
83     if (new_data == NULL)
84       goto error;
85     msg->run_data = new_data;
86     msg->run_num_allocated = tobe_allocated;
87   }
88   msg->run_data[msg->run_length - 1] = run_new();
89   if (msg->run_data[msg->run_length - 1] == NULL)
90     goto error;
91   msg->run_set = 1;
92   return (msg->run_data[msg->run_length - 1]);
93 error:
94   --msg->run_length;
95   return (NULL);
96 }
97 
98 
99 int
msg_from_name_assign(struct msg * msg,const char * value)100 msg_from_name_assign(struct msg *msg,
101     const char * value)
102 {
103   if (msg->from_name_data != NULL)
104     free(msg->from_name_data);
105   if ((msg->from_name_data = strdup(value)) == NULL)
106     return (-1);
107   msg->from_name_set = 1;
108   return (0);
109 }
110 
111 int
msg_to_name_assign(struct msg * msg,const char * value)112 msg_to_name_assign(struct msg *msg,
113     const char * value)
114 {
115   if (msg->to_name_data != NULL)
116     free(msg->to_name_data);
117   if ((msg->to_name_data = strdup(value)) == NULL)
118     return (-1);
119   msg->to_name_set = 1;
120   return (0);
121 }
122 
123 int
msg_attack_assign(struct msg * msg,const struct kill * value)124 msg_attack_assign(struct msg *msg,
125     const struct kill* value)
126 {
127    struct evbuffer *tmp = NULL;
128    if (msg->attack_set) {
129      kill_clear(msg->attack_data);
130      msg->attack_set = 0;
131    } else {
132      msg->attack_data = kill_new();
133      if (msg->attack_data == NULL) {
134        event_warn("%s: kill_new()", __func__);
135        goto error;
136      }
137    }
138    if ((tmp = evbuffer_new()) == NULL) {
139      event_warn("%s: evbuffer_new()", __func__);
140      goto error;
141    }
142    kill_marshal(tmp, value);
143    if (kill_unmarshal(msg->attack_data, tmp) == -1) {
144      event_warnx("%s: kill_unmarshal", __func__);
145      goto error;
146    }
147    msg->attack_set = 1;
148    evbuffer_free(tmp);
149    return (0);
150  error:
151    if (tmp != NULL)
152      evbuffer_free(tmp);
153    if (msg->attack_data != NULL) {
154      kill_free(msg->attack_data);
155      msg->attack_data = NULL;
156    }
157    return (-1);
158 }
159 
160 int
msg_run_assign(struct msg * msg,int off,const struct run * value)161 msg_run_assign(struct msg *msg, int off,
162     const struct run * value)
163 {
164   struct evbuffer *tmp = NULL;
165   if (!msg->run_set || off < 0 || off >= msg->run_length)
166     return (-1);
167   run_clear(msg->run_data[off]);
168   if ((tmp = evbuffer_new()) == NULL) {
169     event_warn("%s: evbuffer_new()", __func__);
170     goto error;
171   }
172   run_marshal(tmp, value);
173   if (run_unmarshal(msg->run_data[off], tmp) == -1) {
174     event_warnx("%s: run_unmarshal", __func__);
175     goto error;
176   }
177   evbuffer_free(tmp);
178   return (0);
179 error:
180   if (tmp != NULL)
181     evbuffer_free(tmp);
182   run_clear(msg->run_data[off]);
183   return (-1);
184 }
185 
186 int
msg_from_name_get(struct msg * msg,char ** value)187 msg_from_name_get(struct msg *msg, char * *value)
188 {
189   if (msg->from_name_set != 1)
190     return (-1);
191   *value = msg->from_name_data;
192   return (0);
193 }
194 
195 int
msg_to_name_get(struct msg * msg,char ** value)196 msg_to_name_get(struct msg *msg, char * *value)
197 {
198   if (msg->to_name_set != 1)
199     return (-1);
200   *value = msg->to_name_data;
201   return (0);
202 }
203 
204 int
msg_attack_get(struct msg * msg,struct kill ** value)205 msg_attack_get(struct msg *msg, struct kill* *value)
206 {
207   if (msg->attack_set != 1) {
208     msg->attack_data = kill_new();
209     if (msg->attack_data == NULL)
210       return (-1);
211     msg->attack_set = 1;
212   }
213   *value = msg->attack_data;
214   return (0);
215 }
216 
217 int
msg_run_get(struct msg * msg,int offset,struct run ** value)218 msg_run_get(struct msg *msg, int offset,
219     struct run * *value)
220 {
221   if (!msg->run_set || offset < 0 || offset >= msg->run_length)
222     return (-1);
223   *value = msg->run_data[offset];
224   return (0);
225 }
226 
227 void
msg_clear(struct msg * tmp)228 msg_clear(struct msg *tmp)
229 {
230   if (tmp->from_name_set == 1) {
231     free (tmp->from_name_data);
232     tmp->from_name_data = NULL;
233     tmp->from_name_set = 0;
234   }
235   if (tmp->to_name_set == 1) {
236     free (tmp->to_name_data);
237     tmp->to_name_data = NULL;
238     tmp->to_name_set = 0;
239   }
240   if (tmp->attack_set == 1) {
241     kill_free(tmp->attack_data);
242     tmp->attack_data = NULL;
243     tmp->attack_set = 0;
244   }
245   if (tmp->run_set == 1) {
246     int i;
247     for (i = 0; i < tmp->run_length; ++i) {
248       run_free(tmp->run_data[i]);
249     }
250     free(tmp->run_data);
251     tmp->run_data = NULL;
252     tmp->run_set = 0;
253     tmp->run_length = 0;
254     tmp->run_num_allocated = 0;
255   }
256 }
257 
258 void
msg_free(struct msg * tmp)259 msg_free(struct msg *tmp)
260 {
261   if (tmp->from_name_data != NULL)
262       free (tmp->from_name_data);
263   if (tmp->to_name_data != NULL)
264       free (tmp->to_name_data);
265   if (tmp->attack_data != NULL)
266       kill_free(tmp->attack_data);
267   if (tmp->run_data != NULL) {
268     int i;
269     for (i = 0; i < tmp->run_length; ++i) {
270       run_free(tmp->run_data[i]);
271       tmp->run_data[i] = NULL;
272     }
273     free(tmp->run_data);
274     tmp->run_data = NULL;
275     tmp->run_length = 0;
276     tmp->run_num_allocated = 0;
277   }
278   free(tmp);
279 }
280 
281 void
msg_marshal(struct evbuffer * evbuf,const struct msg * tmp)282 msg_marshal(struct evbuffer *evbuf, const struct msg *tmp){
283   evtag_marshal_string(evbuf, MSG_FROM_NAME, tmp->from_name_data);
284   evtag_marshal_string(evbuf, MSG_TO_NAME, tmp->to_name_data);
285   if (tmp->attack_set) {
286     evtag_marshal_kill(evbuf, MSG_ATTACK, tmp->attack_data);
287   }
288   {
289     int i;
290     for (i = 0; i < tmp->run_length; ++i) {
291       evtag_marshal_run(evbuf, MSG_RUN, tmp->run_data[i]);
292     }
293   }
294 }
295 
296 int
msg_unmarshal(struct msg * tmp,struct evbuffer * evbuf)297 msg_unmarshal(struct msg *tmp,  struct evbuffer *evbuf)
298 {
299   ev_uint32_t tag;
300   while (EVBUFFER_LENGTH(evbuf) > 0) {
301     if (evtag_peek(evbuf, &tag) == -1)
302       return (-1);
303     switch (tag) {
304 
305       case MSG_FROM_NAME:
306 
307         if (tmp->from_name_set)
308           return (-1);
309         if (evtag_unmarshal_string(evbuf, MSG_FROM_NAME, &tmp->from_name_data) == -1) {
310           event_warnx("%s: failed to unmarshal from_name", __func__);
311           return (-1);
312         }
313         tmp->from_name_set = 1;
314         break;
315 
316       case MSG_TO_NAME:
317 
318         if (tmp->to_name_set)
319           return (-1);
320         if (evtag_unmarshal_string(evbuf, MSG_TO_NAME, &tmp->to_name_data) == -1) {
321           event_warnx("%s: failed to unmarshal to_name", __func__);
322           return (-1);
323         }
324         tmp->to_name_set = 1;
325         break;
326 
327       case MSG_ATTACK:
328 
329         if (tmp->attack_set)
330           return (-1);
331         tmp->attack_data = kill_new();
332         if (tmp->attack_data == NULL)
333           return (-1);
334         if (evtag_unmarshal_kill(evbuf, MSG_ATTACK, tmp->attack_data) == -1) {
335           event_warnx("%s: failed to unmarshal attack", __func__);
336           return (-1);
337         }
338         tmp->attack_set = 1;
339         break;
340 
341       case MSG_RUN:
342 
343         if (msg_run_add(tmp) == NULL)
344           return (-1);
345         if (evtag_unmarshal_run(evbuf, MSG_RUN,
346           tmp->run_data[tmp->run_length - 1]) == -1) {
347           --tmp->run_length;
348           event_warnx("%s: failed to unmarshal run", __func__);
349           return (-1);
350         }
351         tmp->run_set = 1;
352         break;
353 
354       default:
355         return -1;
356     }
357   }
358 
359   if (msg_complete(tmp) == -1)
360     return (-1);
361   return (0);
362 }
363 
364 int
msg_complete(struct msg * msg)365 msg_complete(struct msg *msg)
366 {
367   if (!msg->from_name_set)
368     return (-1);
369   if (!msg->to_name_set)
370     return (-1);
371   if (msg->attack_set && kill_complete(msg->attack_data) == -1)
372     return (-1);
373   {
374     int i;
375     for (i = 0; i < msg->run_length; ++i) {
376       if (run_complete(msg->run_data[i]) == -1)
377         return (-1);
378     }
379   }
380   return (0);
381 }
382 
383 int
evtag_unmarshal_msg(struct evbuffer * evbuf,ev_uint32_t need_tag,struct msg * msg)384 evtag_unmarshal_msg(struct evbuffer *evbuf, ev_uint32_t need_tag, struct msg *msg)
385 {
386   ev_uint32_t tag;
387   int res = -1;
388 
389   struct evbuffer *tmp = evbuffer_new();
390 
391   if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
392     goto error;
393 
394   if (msg_unmarshal(msg, tmp) == -1)
395     goto error;
396 
397   res = 0;
398 
399  error:
400   evbuffer_free(tmp);
401   return (res);
402 }
403 
404 void
evtag_marshal_msg(struct evbuffer * evbuf,ev_uint32_t tag,const struct msg * msg)405 evtag_marshal_msg(struct evbuffer *evbuf, ev_uint32_t tag, const struct msg *msg)
406 {
407   struct evbuffer *_buf = evbuffer_new();
408   assert(_buf != NULL);
409   evbuffer_drain(_buf, -1);
410   msg_marshal(_buf, msg);
411   evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
412   evbuffer_free(_buf);
413 }
414 
415 /*
416  * Implementation of kill
417  */
418 
419 static struct kill_access_ __kill_base = {
420   kill_weapon_assign,
421   kill_weapon_get,
422   kill_action_assign,
423   kill_action_get,
424   kill_how_often_assign,
425   kill_how_often_get,
426 };
427 
428 struct kill *
kill_new(void)429 kill_new(void)
430 {
431   struct kill *tmp;
432   if ((tmp = malloc(sizeof(struct kill))) == NULL) {
433     event_warn("%s: malloc", __func__);
434     return (NULL);
435   }
436   tmp->base = &__kill_base;
437 
438   tmp->weapon_data = NULL;
439   tmp->weapon_set = 0;
440 
441   tmp->action_data = NULL;
442   tmp->action_set = 0;
443 
444   tmp->how_often_data = 0;
445   tmp->how_often_set = 0;
446 
447   return (tmp);
448 }
449 
450 
451 
452 
453 int
kill_weapon_assign(struct kill * msg,const char * value)454 kill_weapon_assign(struct kill *msg,
455     const char * value)
456 {
457   if (msg->weapon_data != NULL)
458     free(msg->weapon_data);
459   if ((msg->weapon_data = strdup(value)) == NULL)
460     return (-1);
461   msg->weapon_set = 1;
462   return (0);
463 }
464 
465 int
kill_action_assign(struct kill * msg,const char * value)466 kill_action_assign(struct kill *msg,
467     const char * value)
468 {
469   if (msg->action_data != NULL)
470     free(msg->action_data);
471   if ((msg->action_data = strdup(value)) == NULL)
472     return (-1);
473   msg->action_set = 1;
474   return (0);
475 }
476 
477 int
kill_how_often_assign(struct kill * msg,const ev_uint32_t value)478 kill_how_often_assign(struct kill *msg, const ev_uint32_t value)
479 {
480   msg->how_often_set = 1;
481   msg->how_often_data = value;
482   return (0);
483 }
484 
485 int
kill_weapon_get(struct kill * msg,char ** value)486 kill_weapon_get(struct kill *msg, char * *value)
487 {
488   if (msg->weapon_set != 1)
489     return (-1);
490   *value = msg->weapon_data;
491   return (0);
492 }
493 
494 int
kill_action_get(struct kill * msg,char ** value)495 kill_action_get(struct kill *msg, char * *value)
496 {
497   if (msg->action_set != 1)
498     return (-1);
499   *value = msg->action_data;
500   return (0);
501 }
502 
503 int
kill_how_often_get(struct kill * msg,ev_uint32_t * value)504 kill_how_often_get(struct kill *msg, ev_uint32_t *value)
505 {
506   if (msg->how_often_set != 1)
507     return (-1);
508   *value = msg->how_often_data;
509   return (0);
510 }
511 
512 void
kill_clear(struct kill * tmp)513 kill_clear(struct kill *tmp)
514 {
515   if (tmp->weapon_set == 1) {
516     free (tmp->weapon_data);
517     tmp->weapon_data = NULL;
518     tmp->weapon_set = 0;
519   }
520   if (tmp->action_set == 1) {
521     free (tmp->action_data);
522     tmp->action_data = NULL;
523     tmp->action_set = 0;
524   }
525   tmp->how_often_set = 0;
526 }
527 
528 void
kill_free(struct kill * tmp)529 kill_free(struct kill *tmp)
530 {
531   if (tmp->weapon_data != NULL)
532       free (tmp->weapon_data);
533   if (tmp->action_data != NULL)
534       free (tmp->action_data);
535   free(tmp);
536 }
537 
538 void
kill_marshal(struct evbuffer * evbuf,const struct kill * tmp)539 kill_marshal(struct evbuffer *evbuf, const struct kill *tmp){
540   evtag_marshal_string(evbuf, KILL_WEAPON, tmp->weapon_data);
541   evtag_marshal_string(evbuf, KILL_ACTION, tmp->action_data);
542   if (tmp->how_often_set) {
543     evtag_marshal_int(evbuf, KILL_HOW_OFTEN, tmp->how_often_data);
544   }
545 }
546 
547 int
kill_unmarshal(struct kill * tmp,struct evbuffer * evbuf)548 kill_unmarshal(struct kill *tmp,  struct evbuffer *evbuf)
549 {
550   ev_uint32_t tag;
551   while (EVBUFFER_LENGTH(evbuf) > 0) {
552     if (evtag_peek(evbuf, &tag) == -1)
553       return (-1);
554     switch (tag) {
555 
556       case KILL_WEAPON:
557 
558         if (tmp->weapon_set)
559           return (-1);
560         if (evtag_unmarshal_string(evbuf, KILL_WEAPON, &tmp->weapon_data) == -1) {
561           event_warnx("%s: failed to unmarshal weapon", __func__);
562           return (-1);
563         }
564         tmp->weapon_set = 1;
565         break;
566 
567       case KILL_ACTION:
568 
569         if (tmp->action_set)
570           return (-1);
571         if (evtag_unmarshal_string(evbuf, KILL_ACTION, &tmp->action_data) == -1) {
572           event_warnx("%s: failed to unmarshal action", __func__);
573           return (-1);
574         }
575         tmp->action_set = 1;
576         break;
577 
578       case KILL_HOW_OFTEN:
579 
580         if (tmp->how_often_set)
581           return (-1);
582         if (evtag_unmarshal_int(evbuf, KILL_HOW_OFTEN, &tmp->how_often_data) == -1) {
583           event_warnx("%s: failed to unmarshal how_often", __func__);
584           return (-1);
585         }
586         tmp->how_often_set = 1;
587         break;
588 
589       default:
590         return -1;
591     }
592   }
593 
594   if (kill_complete(tmp) == -1)
595     return (-1);
596   return (0);
597 }
598 
599 int
kill_complete(struct kill * msg)600 kill_complete(struct kill *msg)
601 {
602   if (!msg->weapon_set)
603     return (-1);
604   if (!msg->action_set)
605     return (-1);
606   return (0);
607 }
608 
609 int
evtag_unmarshal_kill(struct evbuffer * evbuf,ev_uint32_t need_tag,struct kill * msg)610 evtag_unmarshal_kill(struct evbuffer *evbuf, ev_uint32_t need_tag, struct kill *msg)
611 {
612   ev_uint32_t tag;
613   int res = -1;
614 
615   struct evbuffer *tmp = evbuffer_new();
616 
617   if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
618     goto error;
619 
620   if (kill_unmarshal(msg, tmp) == -1)
621     goto error;
622 
623   res = 0;
624 
625  error:
626   evbuffer_free(tmp);
627   return (res);
628 }
629 
630 void
evtag_marshal_kill(struct evbuffer * evbuf,ev_uint32_t tag,const struct kill * msg)631 evtag_marshal_kill(struct evbuffer *evbuf, ev_uint32_t tag, const struct kill *msg)
632 {
633   struct evbuffer *_buf = evbuffer_new();
634   assert(_buf != NULL);
635   evbuffer_drain(_buf, -1);
636   kill_marshal(_buf, msg);
637   evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
638   evbuffer_free(_buf);
639 }
640 
641 /*
642  * Implementation of run
643  */
644 
645 static struct run_access_ __run_base = {
646   run_how_assign,
647   run_how_get,
648   run_some_bytes_assign,
649   run_some_bytes_get,
650   run_fixed_bytes_assign,
651   run_fixed_bytes_get,
652 };
653 
654 struct run *
run_new(void)655 run_new(void)
656 {
657   struct run *tmp;
658   if ((tmp = malloc(sizeof(struct run))) == NULL) {
659     event_warn("%s: malloc", __func__);
660     return (NULL);
661   }
662   tmp->base = &__run_base;
663 
664   tmp->how_data = NULL;
665   tmp->how_set = 0;
666 
667   tmp->some_bytes_data = NULL;
668   tmp->some_bytes_length = 0;
669   tmp->some_bytes_set = 0;
670 
671   memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data));
672   tmp->fixed_bytes_set = 0;
673 
674   return (tmp);
675 }
676 
677 
678 
679 
680 int
run_how_assign(struct run * msg,const char * value)681 run_how_assign(struct run *msg,
682     const char * value)
683 {
684   if (msg->how_data != NULL)
685     free(msg->how_data);
686   if ((msg->how_data = strdup(value)) == NULL)
687     return (-1);
688   msg->how_set = 1;
689   return (0);
690 }
691 
692 int
run_some_bytes_assign(struct run * msg,const ev_uint8_t * value,ev_uint32_t len)693 run_some_bytes_assign(struct run *msg, const ev_uint8_t * value, ev_uint32_t len)
694 {
695   if (msg->some_bytes_data != NULL)
696     free (msg->some_bytes_data);
697   msg->some_bytes_data = malloc(len);
698   if (msg->some_bytes_data == NULL)
699     return (-1);
700   msg->some_bytes_set = 1;
701   msg->some_bytes_length = len;
702   memcpy(msg->some_bytes_data, value, len);
703   return (0);
704 }
705 
706 int
run_fixed_bytes_assign(struct run * msg,const ev_uint8_t * value)707 run_fixed_bytes_assign(struct run *msg, const ev_uint8_t *value)
708 {
709   msg->fixed_bytes_set = 1;
710   memcpy(msg->fixed_bytes_data, value, 24);
711   return (0);
712 }
713 
714 int
run_how_get(struct run * msg,char ** value)715 run_how_get(struct run *msg, char * *value)
716 {
717   if (msg->how_set != 1)
718     return (-1);
719   *value = msg->how_data;
720   return (0);
721 }
722 
723 int
run_some_bytes_get(struct run * msg,ev_uint8_t ** value,ev_uint32_t * plen)724 run_some_bytes_get(struct run *msg, ev_uint8_t * *value, ev_uint32_t *plen)
725 {
726   if (msg->some_bytes_set != 1)
727     return (-1);
728   *value = msg->some_bytes_data;
729   *plen = msg->some_bytes_length;
730   return (0);
731 }
732 
733 int
run_fixed_bytes_get(struct run * msg,ev_uint8_t ** value)734 run_fixed_bytes_get(struct run *msg, ev_uint8_t **value)
735 {
736   if (msg->fixed_bytes_set != 1)
737     return (-1);
738   *value = msg->fixed_bytes_data;
739   return (0);
740 }
741 
742 void
run_clear(struct run * tmp)743 run_clear(struct run *tmp)
744 {
745   if (tmp->how_set == 1) {
746     free (tmp->how_data);
747     tmp->how_data = NULL;
748     tmp->how_set = 0;
749   }
750   if (tmp->some_bytes_set == 1) {
751     free (tmp->some_bytes_data);
752     tmp->some_bytes_data = NULL;
753     tmp->some_bytes_length = 0;
754     tmp->some_bytes_set = 0;
755   }
756   tmp->fixed_bytes_set = 0;
757   memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data));
758 }
759 
760 void
run_free(struct run * tmp)761 run_free(struct run *tmp)
762 {
763   if (tmp->how_data != NULL)
764       free (tmp->how_data);
765   if (tmp->some_bytes_data != NULL)
766       free (tmp->some_bytes_data);
767   free(tmp);
768 }
769 
770 void
run_marshal(struct evbuffer * evbuf,const struct run * tmp)771 run_marshal(struct evbuffer *evbuf, const struct run *tmp){
772   evtag_marshal_string(evbuf, RUN_HOW, tmp->how_data);
773   if (tmp->some_bytes_set) {
774     evtag_marshal(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length);
775   }
776   evtag_marshal(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, sizeof(tmp->fixed_bytes_data));
777 }
778 
779 int
run_unmarshal(struct run * tmp,struct evbuffer * evbuf)780 run_unmarshal(struct run *tmp,  struct evbuffer *evbuf)
781 {
782   ev_uint32_t tag;
783   while (EVBUFFER_LENGTH(evbuf) > 0) {
784     if (evtag_peek(evbuf, &tag) == -1)
785       return (-1);
786     switch (tag) {
787 
788       case RUN_HOW:
789 
790         if (tmp->how_set)
791           return (-1);
792         if (evtag_unmarshal_string(evbuf, RUN_HOW, &tmp->how_data) == -1) {
793           event_warnx("%s: failed to unmarshal how", __func__);
794           return (-1);
795         }
796         tmp->how_set = 1;
797         break;
798 
799       case RUN_SOME_BYTES:
800 
801         if (tmp->some_bytes_set)
802           return (-1);
803         if (evtag_payload_length(evbuf, &tmp->some_bytes_length) == -1)
804           return (-1);
805         if (tmp->some_bytes_length > EVBUFFER_LENGTH(evbuf))
806           return (-1);
807         if ((tmp->some_bytes_data = malloc(tmp->some_bytes_length)) == NULL)
808           return (-1);
809         if (evtag_unmarshal_fixed(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length) == -1) {
810           event_warnx("%s: failed to unmarshal some_bytes", __func__);
811           return (-1);
812         }
813         tmp->some_bytes_set = 1;
814         break;
815 
816       case RUN_FIXED_BYTES:
817 
818         if (tmp->fixed_bytes_set)
819           return (-1);
820         if (evtag_unmarshal_fixed(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, sizeof(tmp->fixed_bytes_data)) == -1) {
821           event_warnx("%s: failed to unmarshal fixed_bytes", __func__);
822           return (-1);
823         }
824         tmp->fixed_bytes_set = 1;
825         break;
826 
827       default:
828         return -1;
829     }
830   }
831 
832   if (run_complete(tmp) == -1)
833     return (-1);
834   return (0);
835 }
836 
837 int
run_complete(struct run * msg)838 run_complete(struct run *msg)
839 {
840   if (!msg->how_set)
841     return (-1);
842   if (!msg->fixed_bytes_set)
843     return (-1);
844   return (0);
845 }
846 
847 int
evtag_unmarshal_run(struct evbuffer * evbuf,ev_uint32_t need_tag,struct run * msg)848 evtag_unmarshal_run(struct evbuffer *evbuf, ev_uint32_t need_tag, struct run *msg)
849 {
850   ev_uint32_t tag;
851   int res = -1;
852 
853   struct evbuffer *tmp = evbuffer_new();
854 
855   if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
856     goto error;
857 
858   if (run_unmarshal(msg, tmp) == -1)
859     goto error;
860 
861   res = 0;
862 
863  error:
864   evbuffer_free(tmp);
865   return (res);
866 }
867 
868 void
evtag_marshal_run(struct evbuffer * evbuf,ev_uint32_t tag,const struct run * msg)869 evtag_marshal_run(struct evbuffer *evbuf, ev_uint32_t tag, const struct run *msg)
870 {
871   struct evbuffer *_buf = evbuffer_new();
872   assert(_buf != NULL);
873   evbuffer_drain(_buf, -1);
874   run_marshal(_buf, msg);
875   evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
876   evbuffer_free(_buf);
877 }
878 
879