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 * 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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 * 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 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 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 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 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 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 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 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 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 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 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 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 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 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