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