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
22void event_err(int eval, const char *fmt, ...);
23void event_warn(const char *fmt, ...);
24void event_errx(int eval, const char *fmt, ...);
25void event_warnx(const char *fmt, ...);
26
27
28/*
29 * Implementation of msg
30 */
31
32static 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
44struct msg *
45msg_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
74struct run *
75msg_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]);
93error:
94  --msg->run_length;
95  return (NULL);
96}
97
98
99int
100msg_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
111int
112msg_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
123int
124msg_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
160int
161msg_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);
179error:
180  if (tmp != NULL)
181    evbuffer_free(tmp);
182  run_clear(msg->run_data[off]);
183  return (-1);
184}
185
186int
187msg_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
195int
196msg_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
204int
205msg_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
217int
218msg_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
227void
228msg_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
258void
259msg_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
281void
282msg_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
296int
297msg_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
364int
365msg_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
383int
384evtag_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
404void
405evtag_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
419static 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
428struct kill *
429kill_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
453int
454kill_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
465int
466kill_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
477int
478kill_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
485int
486kill_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
494int
495kill_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
503int
504kill_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
512void
513kill_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
528void
529kill_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
538void
539kill_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
547int
548kill_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
599int
600kill_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
609int
610evtag_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
630void
631evtag_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
645static 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
654struct run *
655run_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
680int
681run_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
692int
693run_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
706int
707run_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
714int
715run_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
723int
724run_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
733int
734run_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
742void
743run_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
760void
761run_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
770void
771run_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
779int
780run_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
837int
838run_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
847int
848evtag_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
868void
869evtag_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