1 2 /* 3 * Automatically generated from /ntpbuild/data/snaps/ntp-stable/sntp/libevent/test/regress.rpc 4 * by event_rpcgen.py/0.1. DO NOT EDIT THIS FILE. 5 */ 6 7 #include <stdlib.h> 8 #include <string.h> 9 #include <assert.h> 10 #include <event2/event-config.h> 11 #include <event2/event.h> 12 #include <event2/buffer.h> 13 #include <event2/tag.h> 14 15 #if defined(EVENT__HAVE___func__) 16 # ifndef __func__ 17 # define __func__ __func__ 18 # endif 19 #elif defined(EVENT__HAVE___FUNCTION__) 20 # define __func__ __FUNCTION__ 21 #else 22 # define __func__ __FILE__ 23 #endif 24 25 26 #include "regress.gen.h" 27 28 void event_warn(const char *fmt, ...); 29 void event_warnx(const char *fmt, ...); 30 31 /* 32 * Implementation of msg 33 */ 34 35 static struct msg_access_ msg_base__ = { 36 msg_from_name_assign, 37 msg_from_name_get, 38 msg_to_name_assign, 39 msg_to_name_get, 40 msg_attack_assign, 41 msg_attack_get, 42 msg_run_assign, 43 msg_run_get, 44 msg_run_add, 45 }; 46 47 struct msg * 48 msg_new(void) 49 { 50 return msg_new_with_arg(NULL); 51 } 52 53 struct msg * 54 msg_new_with_arg(void *unused) 55 { 56 struct msg *tmp; 57 if ((tmp = malloc(sizeof(struct msg))) == NULL) { 58 event_warn("%s: malloc", __func__); 59 return (NULL); 60 } 61 tmp->base = &msg_base__; 62 63 tmp->from_name_data = NULL; 64 tmp->from_name_set = 0; 65 66 tmp->to_name_data = NULL; 67 tmp->to_name_set = 0; 68 69 tmp->attack_data = NULL; 70 tmp->attack_set = 0; 71 72 tmp->run_data = NULL; 73 tmp->run_length = 0; 74 tmp->run_num_allocated = 0; 75 tmp->run_set = 0; 76 77 return (tmp); 78 } 79 80 81 82 83 static int 84 msg_run_expand_to_hold_more(struct msg *msg) 85 { 86 int tobe_allocated = msg->run_num_allocated; 87 struct run** new_data = NULL; 88 tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1; 89 new_data = (struct run**) realloc(msg->run_data, 90 tobe_allocated * sizeof(struct run*)); 91 if (new_data == NULL) 92 return -1; 93 msg->run_data = new_data; 94 msg->run_num_allocated = tobe_allocated; 95 return 0; 96 } 97 98 struct run* 99 msg_run_add(struct msg *msg) 100 { 101 if (++msg->run_length >= msg->run_num_allocated) { 102 if (msg_run_expand_to_hold_more(msg)<0) 103 goto error; 104 } 105 msg->run_data[msg->run_length - 1] = run_new(); 106 if (msg->run_data[msg->run_length - 1] == NULL) 107 goto error; 108 msg->run_set = 1; 109 return (msg->run_data[msg->run_length - 1]); 110 error: 111 --msg->run_length; 112 return (NULL); 113 } 114 115 int 116 msg_from_name_assign(struct msg *msg, 117 const char * value) 118 { 119 if (msg->from_name_data != NULL) 120 free(msg->from_name_data); 121 if ((msg->from_name_data = strdup(value)) == NULL) 122 return (-1); 123 msg->from_name_set = 1; 124 return (0); 125 } 126 127 int 128 msg_to_name_assign(struct msg *msg, 129 const char * value) 130 { 131 if (msg->to_name_data != NULL) 132 free(msg->to_name_data); 133 if ((msg->to_name_data = strdup(value)) == NULL) 134 return (-1); 135 msg->to_name_set = 1; 136 return (0); 137 } 138 139 int 140 msg_attack_assign(struct msg *msg, 141 const struct kill* value) 142 { 143 struct evbuffer *tmp = NULL; 144 if (msg->attack_set) { 145 kill_clear(msg->attack_data); 146 msg->attack_set = 0; 147 } else { 148 msg->attack_data = kill_new(); 149 if (msg->attack_data == NULL) { 150 event_warn("%s: kill_new()", __func__); 151 goto error; 152 } 153 } 154 if ((tmp = evbuffer_new()) == NULL) { 155 event_warn("%s: evbuffer_new()", __func__); 156 goto error; 157 } 158 kill_marshal(tmp, value); 159 if (kill_unmarshal(msg->attack_data, tmp) == -1) { 160 event_warnx("%s: kill_unmarshal", __func__); 161 goto error; 162 } 163 msg->attack_set = 1; 164 evbuffer_free(tmp); 165 return (0); 166 error: 167 if (tmp != NULL) 168 evbuffer_free(tmp); 169 if (msg->attack_data != NULL) { 170 kill_free(msg->attack_data); 171 msg->attack_data = NULL; 172 } 173 return (-1); 174 } 175 176 int 177 msg_run_assign(struct msg *msg, int off, 178 const struct run* value) 179 { 180 if (!msg->run_set || off < 0 || off >= msg->run_length) 181 return (-1); 182 183 { 184 int had_error = 0; 185 struct evbuffer *tmp = NULL; 186 run_clear(msg->run_data[off]); 187 if ((tmp = evbuffer_new()) == NULL) { 188 event_warn("%s: evbuffer_new()", __func__); 189 had_error = 1; 190 goto done; 191 } 192 run_marshal(tmp, value); 193 if (run_unmarshal(msg->run_data[off], tmp) == -1) { 194 event_warnx("%s: run_unmarshal", __func__); 195 had_error = 1; 196 goto done; 197 } 198 done: 199 if (tmp != NULL) 200 evbuffer_free(tmp); 201 if (had_error) { 202 run_clear(msg->run_data[off]); 203 return (-1); 204 } 205 } 206 return (0); 207 } 208 209 int 210 msg_from_name_get(struct msg *msg, char * *value) 211 { 212 if (msg->from_name_set != 1) 213 return (-1); 214 *value = msg->from_name_data; 215 return (0); 216 } 217 218 int 219 msg_to_name_get(struct msg *msg, char * *value) 220 { 221 if (msg->to_name_set != 1) 222 return (-1); 223 *value = msg->to_name_data; 224 return (0); 225 } 226 227 int 228 msg_attack_get(struct msg *msg, struct kill* *value) 229 { 230 if (msg->attack_set != 1) { 231 msg->attack_data = kill_new(); 232 if (msg->attack_data == NULL) 233 return (-1); 234 msg->attack_set = 1; 235 } 236 *value = msg->attack_data; 237 return (0); 238 } 239 240 int 241 msg_run_get(struct msg *msg, int offset, 242 struct run* *value) 243 { 244 if (!msg->run_set || offset < 0 || offset >= msg->run_length) 245 return (-1); 246 *value = msg->run_data[offset]; 247 return (0); 248 } 249 250 void 251 msg_clear(struct msg *tmp) 252 { 253 if (tmp->from_name_set == 1) { 254 free(tmp->from_name_data); 255 tmp->from_name_data = NULL; 256 tmp->from_name_set = 0; 257 } 258 if (tmp->to_name_set == 1) { 259 free(tmp->to_name_data); 260 tmp->to_name_data = NULL; 261 tmp->to_name_set = 0; 262 } 263 if (tmp->attack_set == 1) { 264 kill_free(tmp->attack_data); 265 tmp->attack_data = NULL; 266 tmp->attack_set = 0; 267 } 268 if (tmp->run_set == 1) { 269 int i; 270 for (i = 0; i < tmp->run_length; ++i) { 271 run_free(tmp->run_data[i]); 272 } 273 free(tmp->run_data); 274 tmp->run_data = NULL; 275 tmp->run_set = 0; 276 tmp->run_length = 0; 277 tmp->run_num_allocated = 0; 278 } 279 } 280 281 void 282 msg_free(struct msg *tmp) 283 { 284 if (tmp->from_name_data != NULL) 285 free (tmp->from_name_data); 286 if (tmp->to_name_data != NULL) 287 free (tmp->to_name_data); 288 if (tmp->attack_data != NULL) 289 kill_free(tmp->attack_data); 290 if (tmp->run_set == 1) { 291 int i; 292 for (i = 0; i < tmp->run_length; ++i) { 293 run_free(tmp->run_data[i]); 294 } 295 free(tmp->run_data); 296 tmp->run_data = NULL; 297 tmp->run_set = 0; 298 tmp->run_length = 0; 299 tmp->run_num_allocated = 0; 300 } 301 free(tmp->run_data); 302 free(tmp); 303 } 304 305 void 306 msg_marshal(struct evbuffer *evbuf, const struct msg *tmp) { 307 evtag_marshal_string(evbuf, MSG_FROM_NAME, tmp->from_name_data); 308 evtag_marshal_string(evbuf, MSG_TO_NAME, tmp->to_name_data); 309 if (tmp->attack_set) { 310 evtag_marshal_kill(evbuf, MSG_ATTACK, tmp->attack_data); 311 } 312 if (tmp->run_set) { 313 { 314 int i; 315 for (i = 0; i < tmp->run_length; ++i) { 316 evtag_marshal_run(evbuf, MSG_RUN, tmp->run_data[i]); 317 } 318 } 319 } 320 } 321 322 int 323 msg_unmarshal(struct msg *tmp, struct evbuffer *evbuf) 324 { 325 ev_uint32_t tag; 326 while (evbuffer_get_length(evbuf) > 0) { 327 if (evtag_peek(evbuf, &tag) == -1) 328 return (-1); 329 switch (tag) { 330 331 case MSG_FROM_NAME: 332 if (tmp->from_name_set) 333 return (-1); 334 if (evtag_unmarshal_string(evbuf, MSG_FROM_NAME, &tmp->from_name_data) == -1) { 335 event_warnx("%s: failed to unmarshal from_name", __func__); 336 return (-1); 337 } 338 tmp->from_name_set = 1; 339 break; 340 case MSG_TO_NAME: 341 if (tmp->to_name_set) 342 return (-1); 343 if (evtag_unmarshal_string(evbuf, MSG_TO_NAME, &tmp->to_name_data) == -1) { 344 event_warnx("%s: failed to unmarshal to_name", __func__); 345 return (-1); 346 } 347 tmp->to_name_set = 1; 348 break; 349 case MSG_ATTACK: 350 if (tmp->attack_set) 351 return (-1); 352 tmp->attack_data = kill_new(); 353 if (tmp->attack_data == NULL) 354 return (-1); 355 if (evtag_unmarshal_kill(evbuf, MSG_ATTACK, 356 tmp->attack_data) == -1) { 357 event_warnx("%s: failed to unmarshal attack", __func__); 358 return (-1); 359 } 360 tmp->attack_set = 1; 361 break; 362 case MSG_RUN: 363 if (tmp->run_length >= tmp->run_num_allocated && 364 msg_run_expand_to_hold_more(tmp) < 0) { 365 puts("HEY NOW"); 366 return (-1); 367 } 368 tmp->run_data[tmp->run_length] = run_new(); 369 if (tmp->run_data[tmp->run_length] == NULL) 370 return (-1); 371 if (evtag_unmarshal_run(evbuf, MSG_RUN, 372 tmp->run_data[tmp->run_length]) == -1) { 373 event_warnx("%s: failed to unmarshal run", __func__); 374 return (-1); 375 } 376 ++tmp->run_length; 377 tmp->run_set = 1; 378 break; 379 default: 380 return -1; 381 } 382 } 383 384 if (msg_complete(tmp) == -1) 385 return (-1); 386 return (0); 387 } 388 389 int 390 msg_complete(struct msg *msg) 391 { 392 if (!msg->from_name_set) 393 return (-1); 394 if (!msg->to_name_set) 395 return (-1); 396 if (msg->attack_set && kill_complete(msg->attack_data) == -1) 397 return (-1); 398 { 399 int i; 400 for (i = 0; i < msg->run_length; ++i) { 401 if (msg->run_set && run_complete(msg->run_data[i]) == -1) 402 return (-1); 403 } 404 } 405 return (0); 406 } 407 408 int 409 evtag_unmarshal_msg(struct evbuffer *evbuf, ev_uint32_t need_tag, 410 struct msg *msg) 411 { 412 ev_uint32_t tag; 413 int res = -1; 414 415 struct evbuffer *tmp = evbuffer_new(); 416 417 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag) 418 goto error; 419 420 if (msg_unmarshal(msg, tmp) == -1) 421 goto error; 422 423 res = 0; 424 425 error: 426 evbuffer_free(tmp); 427 return (res); 428 } 429 430 void 431 evtag_marshal_msg(struct evbuffer *evbuf, ev_uint32_t tag, 432 const struct msg *msg) 433 { 434 struct evbuffer *buf_ = evbuffer_new(); 435 assert(buf_ != NULL); 436 msg_marshal(buf_, msg); 437 evtag_marshal_buffer(evbuf, tag, buf_); 438 evbuffer_free(buf_); 439 } 440 441 /* 442 * Implementation of kill 443 */ 444 445 static struct kill_access_ kill_base__ = { 446 kill_weapon_assign, 447 kill_weapon_get, 448 kill_action_assign, 449 kill_action_get, 450 kill_how_often_assign, 451 kill_how_often_get, 452 kill_how_often_add, 453 }; 454 455 struct kill * 456 kill_new(void) 457 { 458 return kill_new_with_arg(NULL); 459 } 460 461 struct kill * 462 kill_new_with_arg(void *unused) 463 { 464 struct kill *tmp; 465 if ((tmp = malloc(sizeof(struct kill))) == NULL) { 466 event_warn("%s: malloc", __func__); 467 return (NULL); 468 } 469 tmp->base = &kill_base__; 470 471 tmp->weapon_data = NULL; 472 tmp->weapon_set = 0; 473 474 tmp->action_data = NULL; 475 tmp->action_set = 0; 476 477 tmp->how_often_data = NULL; 478 tmp->how_often_length = 0; 479 tmp->how_often_num_allocated = 0; 480 tmp->how_often_set = 0; 481 482 return (tmp); 483 } 484 485 486 487 static int 488 kill_how_often_expand_to_hold_more(struct kill *msg) 489 { 490 int tobe_allocated = msg->how_often_num_allocated; 491 ev_uint32_t* new_data = NULL; 492 tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1; 493 new_data = (ev_uint32_t*) realloc(msg->how_often_data, 494 tobe_allocated * sizeof(ev_uint32_t)); 495 if (new_data == NULL) 496 return -1; 497 msg->how_often_data = new_data; 498 msg->how_often_num_allocated = tobe_allocated; 499 return 0; 500 } 501 502 ev_uint32_t * 503 kill_how_often_add(struct kill *msg, const ev_uint32_t value) 504 { 505 if (++msg->how_often_length >= msg->how_often_num_allocated) { 506 if (kill_how_often_expand_to_hold_more(msg)<0) 507 goto error; 508 } 509 msg->how_often_data[msg->how_often_length - 1] = value; 510 msg->how_often_set = 1; 511 return &(msg->how_often_data[msg->how_often_length - 1]); 512 error: 513 --msg->how_often_length; 514 return (NULL); 515 } 516 517 int 518 kill_weapon_assign(struct kill *msg, 519 const char * value) 520 { 521 if (msg->weapon_data != NULL) 522 free(msg->weapon_data); 523 if ((msg->weapon_data = strdup(value)) == NULL) 524 return (-1); 525 msg->weapon_set = 1; 526 return (0); 527 } 528 529 int 530 kill_action_assign(struct kill *msg, 531 const char * value) 532 { 533 if (msg->action_data != NULL) 534 free(msg->action_data); 535 if ((msg->action_data = strdup(value)) == NULL) 536 return (-1); 537 msg->action_set = 1; 538 return (0); 539 } 540 541 int 542 kill_how_often_assign(struct kill *msg, int off, 543 const ev_uint32_t value) 544 { 545 if (!msg->how_often_set || off < 0 || off >= msg->how_often_length) 546 return (-1); 547 548 { 549 msg->how_often_data[off] = value; 550 } 551 return (0); 552 } 553 554 int 555 kill_weapon_get(struct kill *msg, char * *value) 556 { 557 if (msg->weapon_set != 1) 558 return (-1); 559 *value = msg->weapon_data; 560 return (0); 561 } 562 563 int 564 kill_action_get(struct kill *msg, char * *value) 565 { 566 if (msg->action_set != 1) 567 return (-1); 568 *value = msg->action_data; 569 return (0); 570 } 571 572 int 573 kill_how_often_get(struct kill *msg, int offset, 574 ev_uint32_t *value) 575 { 576 if (!msg->how_often_set || offset < 0 || offset >= msg->how_often_length) 577 return (-1); 578 *value = msg->how_often_data[offset]; 579 return (0); 580 } 581 582 void 583 kill_clear(struct kill *tmp) 584 { 585 if (tmp->weapon_set == 1) { 586 free(tmp->weapon_data); 587 tmp->weapon_data = NULL; 588 tmp->weapon_set = 0; 589 } 590 if (tmp->action_set == 1) { 591 free(tmp->action_data); 592 tmp->action_data = NULL; 593 tmp->action_set = 0; 594 } 595 if (tmp->how_often_set == 1) { 596 free(tmp->how_often_data); 597 tmp->how_often_data = NULL; 598 tmp->how_often_set = 0; 599 tmp->how_often_length = 0; 600 tmp->how_often_num_allocated = 0; 601 } 602 } 603 604 void 605 kill_free(struct kill *tmp) 606 { 607 if (tmp->weapon_data != NULL) 608 free (tmp->weapon_data); 609 if (tmp->action_data != NULL) 610 free (tmp->action_data); 611 if (tmp->how_often_set == 1) { 612 free(tmp->how_often_data); 613 tmp->how_often_data = NULL; 614 tmp->how_often_set = 0; 615 tmp->how_often_length = 0; 616 tmp->how_often_num_allocated = 0; 617 } 618 free(tmp->how_often_data); 619 free(tmp); 620 } 621 622 void 623 kill_marshal(struct evbuffer *evbuf, const struct kill *tmp) { 624 evtag_marshal_string(evbuf, KILL_WEAPON, tmp->weapon_data); 625 evtag_marshal_string(evbuf, KILL_ACTION, tmp->action_data); 626 if (tmp->how_often_set) { 627 { 628 int i; 629 for (i = 0; i < tmp->how_often_length; ++i) { 630 evtag_marshal_int(evbuf, KILL_HOW_OFTEN, tmp->how_often_data[i]); 631 } 632 } 633 } 634 } 635 636 int 637 kill_unmarshal(struct kill *tmp, struct evbuffer *evbuf) 638 { 639 ev_uint32_t tag; 640 while (evbuffer_get_length(evbuf) > 0) { 641 if (evtag_peek(evbuf, &tag) == -1) 642 return (-1); 643 switch (tag) { 644 645 case KILL_WEAPON: 646 if (tmp->weapon_set) 647 return (-1); 648 if (evtag_unmarshal_string(evbuf, KILL_WEAPON, &tmp->weapon_data) == -1) { 649 event_warnx("%s: failed to unmarshal weapon", __func__); 650 return (-1); 651 } 652 tmp->weapon_set = 1; 653 break; 654 case KILL_ACTION: 655 if (tmp->action_set) 656 return (-1); 657 if (evtag_unmarshal_string(evbuf, KILL_ACTION, &tmp->action_data) == -1) { 658 event_warnx("%s: failed to unmarshal action", __func__); 659 return (-1); 660 } 661 tmp->action_set = 1; 662 break; 663 case KILL_HOW_OFTEN: 664 if (tmp->how_often_length >= tmp->how_often_num_allocated && 665 kill_how_often_expand_to_hold_more(tmp) < 0) { 666 puts("HEY NOW"); 667 return (-1); 668 } 669 if (evtag_unmarshal_int(evbuf, KILL_HOW_OFTEN, &tmp->how_often_data[tmp->how_often_length]) == -1) { 670 event_warnx("%s: failed to unmarshal how_often", __func__); 671 return (-1); 672 } 673 ++tmp->how_often_length; 674 tmp->how_often_set = 1; 675 break; 676 default: 677 return -1; 678 } 679 } 680 681 if (kill_complete(tmp) == -1) 682 return (-1); 683 return (0); 684 } 685 686 int 687 kill_complete(struct kill *msg) 688 { 689 if (!msg->weapon_set) 690 return (-1); 691 if (!msg->action_set) 692 return (-1); 693 return (0); 694 } 695 696 int 697 evtag_unmarshal_kill(struct evbuffer *evbuf, ev_uint32_t need_tag, 698 struct kill *msg) 699 { 700 ev_uint32_t tag; 701 int res = -1; 702 703 struct evbuffer *tmp = evbuffer_new(); 704 705 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag) 706 goto error; 707 708 if (kill_unmarshal(msg, tmp) == -1) 709 goto error; 710 711 res = 0; 712 713 error: 714 evbuffer_free(tmp); 715 return (res); 716 } 717 718 void 719 evtag_marshal_kill(struct evbuffer *evbuf, ev_uint32_t tag, 720 const struct kill *msg) 721 { 722 struct evbuffer *buf_ = evbuffer_new(); 723 assert(buf_ != NULL); 724 kill_marshal(buf_, msg); 725 evtag_marshal_buffer(evbuf, tag, buf_); 726 evbuffer_free(buf_); 727 } 728 729 /* 730 * Implementation of run 731 */ 732 733 static struct run_access_ run_base__ = { 734 run_how_assign, 735 run_how_get, 736 run_some_bytes_assign, 737 run_some_bytes_get, 738 run_fixed_bytes_assign, 739 run_fixed_bytes_get, 740 run_notes_assign, 741 run_notes_get, 742 run_notes_add, 743 run_large_number_assign, 744 run_large_number_get, 745 run_other_numbers_assign, 746 run_other_numbers_get, 747 run_other_numbers_add, 748 }; 749 750 struct run * 751 run_new(void) 752 { 753 return run_new_with_arg(NULL); 754 } 755 756 struct run * 757 run_new_with_arg(void *unused) 758 { 759 struct run *tmp; 760 if ((tmp = malloc(sizeof(struct run))) == NULL) { 761 event_warn("%s: malloc", __func__); 762 return (NULL); 763 } 764 tmp->base = &run_base__; 765 766 tmp->how_data = NULL; 767 tmp->how_set = 0; 768 769 tmp->some_bytes_data = NULL; 770 tmp->some_bytes_length = 0; 771 tmp->some_bytes_set = 0; 772 773 memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data)); 774 tmp->fixed_bytes_set = 0; 775 776 tmp->notes_data = NULL; 777 tmp->notes_length = 0; 778 tmp->notes_num_allocated = 0; 779 tmp->notes_set = 0; 780 781 tmp->large_number_data = 0; 782 tmp->large_number_set = 0; 783 784 tmp->other_numbers_data = NULL; 785 tmp->other_numbers_length = 0; 786 tmp->other_numbers_num_allocated = 0; 787 tmp->other_numbers_set = 0; 788 789 return (tmp); 790 } 791 792 793 794 795 static int 796 run_notes_expand_to_hold_more(struct run *msg) 797 { 798 int tobe_allocated = msg->notes_num_allocated; 799 char ** new_data = NULL; 800 tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1; 801 new_data = (char **) realloc(msg->notes_data, 802 tobe_allocated * sizeof(char *)); 803 if (new_data == NULL) 804 return -1; 805 msg->notes_data = new_data; 806 msg->notes_num_allocated = tobe_allocated; 807 return 0; 808 } 809 810 char * * 811 run_notes_add(struct run *msg, const char * value) 812 { 813 if (++msg->notes_length >= msg->notes_num_allocated) { 814 if (run_notes_expand_to_hold_more(msg)<0) 815 goto error; 816 } 817 if (value != NULL) { 818 msg->notes_data[msg->notes_length - 1] = strdup(value); 819 if (msg->notes_data[msg->notes_length - 1] == NULL) { 820 goto error; 821 } 822 } else { 823 msg->notes_data[msg->notes_length - 1] = NULL; 824 } 825 msg->notes_set = 1; 826 return &(msg->notes_data[msg->notes_length - 1]); 827 error: 828 --msg->notes_length; 829 return (NULL); 830 } 831 832 833 static int 834 run_other_numbers_expand_to_hold_more(struct run *msg) 835 { 836 int tobe_allocated = msg->other_numbers_num_allocated; 837 ev_uint32_t* new_data = NULL; 838 tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1; 839 new_data = (ev_uint32_t*) realloc(msg->other_numbers_data, 840 tobe_allocated * sizeof(ev_uint32_t)); 841 if (new_data == NULL) 842 return -1; 843 msg->other_numbers_data = new_data; 844 msg->other_numbers_num_allocated = tobe_allocated; 845 return 0; 846 } 847 848 ev_uint32_t * 849 run_other_numbers_add(struct run *msg, const ev_uint32_t value) 850 { 851 if (++msg->other_numbers_length >= msg->other_numbers_num_allocated) { 852 if (run_other_numbers_expand_to_hold_more(msg)<0) 853 goto error; 854 } 855 msg->other_numbers_data[msg->other_numbers_length - 1] = value; 856 msg->other_numbers_set = 1; 857 return &(msg->other_numbers_data[msg->other_numbers_length - 1]); 858 error: 859 --msg->other_numbers_length; 860 return (NULL); 861 } 862 863 int 864 run_how_assign(struct run *msg, 865 const char * value) 866 { 867 if (msg->how_data != NULL) 868 free(msg->how_data); 869 if ((msg->how_data = strdup(value)) == NULL) 870 return (-1); 871 msg->how_set = 1; 872 return (0); 873 } 874 875 int 876 run_some_bytes_assign(struct run *msg, const ev_uint8_t * value, ev_uint32_t len) 877 { 878 if (msg->some_bytes_data != NULL) 879 free (msg->some_bytes_data); 880 msg->some_bytes_data = malloc(len); 881 if (msg->some_bytes_data == NULL) 882 return (-1); 883 msg->some_bytes_set = 1; 884 msg->some_bytes_length = len; 885 memcpy(msg->some_bytes_data, value, len); 886 return (0); 887 } 888 889 int 890 run_fixed_bytes_assign(struct run *msg, const ev_uint8_t *value) 891 { 892 msg->fixed_bytes_set = 1; 893 memcpy(msg->fixed_bytes_data, value, 24); 894 return (0); 895 } 896 897 int 898 run_notes_assign(struct run *msg, int off, 899 const char * value) 900 { 901 if (!msg->notes_set || off < 0 || off >= msg->notes_length) 902 return (-1); 903 904 { 905 if (msg->notes_data[off] != NULL) 906 free(msg->notes_data[off]); 907 msg->notes_data[off] = strdup(value); 908 if (msg->notes_data[off] == NULL) { 909 event_warnx("%s: strdup", __func__); 910 return (-1); 911 } 912 } 913 return (0); 914 } 915 916 int 917 run_large_number_assign(struct run *msg, const ev_uint64_t value) 918 { 919 msg->large_number_set = 1; 920 msg->large_number_data = value; 921 return (0); 922 } 923 924 int 925 run_other_numbers_assign(struct run *msg, int off, 926 const ev_uint32_t value) 927 { 928 if (!msg->other_numbers_set || off < 0 || off >= msg->other_numbers_length) 929 return (-1); 930 931 { 932 msg->other_numbers_data[off] = value; 933 } 934 return (0); 935 } 936 937 int 938 run_how_get(struct run *msg, char * *value) 939 { 940 if (msg->how_set != 1) 941 return (-1); 942 *value = msg->how_data; 943 return (0); 944 } 945 946 int 947 run_some_bytes_get(struct run *msg, ev_uint8_t * *value, ev_uint32_t *plen) 948 { 949 if (msg->some_bytes_set != 1) 950 return (-1); 951 *value = msg->some_bytes_data; 952 *plen = msg->some_bytes_length; 953 return (0); 954 } 955 956 int 957 run_fixed_bytes_get(struct run *msg, ev_uint8_t **value) 958 { 959 if (msg->fixed_bytes_set != 1) 960 return (-1); 961 *value = msg->fixed_bytes_data; 962 return (0); 963 } 964 965 int 966 run_notes_get(struct run *msg, int offset, 967 char * *value) 968 { 969 if (!msg->notes_set || offset < 0 || offset >= msg->notes_length) 970 return (-1); 971 *value = msg->notes_data[offset]; 972 return (0); 973 } 974 975 int 976 run_large_number_get(struct run *msg, ev_uint64_t *value) 977 { 978 if (msg->large_number_set != 1) 979 return (-1); 980 *value = msg->large_number_data; 981 return (0); 982 } 983 984 int 985 run_other_numbers_get(struct run *msg, int offset, 986 ev_uint32_t *value) 987 { 988 if (!msg->other_numbers_set || offset < 0 || offset >= msg->other_numbers_length) 989 return (-1); 990 *value = msg->other_numbers_data[offset]; 991 return (0); 992 } 993 994 void 995 run_clear(struct run *tmp) 996 { 997 if (tmp->how_set == 1) { 998 free(tmp->how_data); 999 tmp->how_data = NULL; 1000 tmp->how_set = 0; 1001 } 1002 if (tmp->some_bytes_set == 1) { 1003 free (tmp->some_bytes_data); 1004 tmp->some_bytes_data = NULL; 1005 tmp->some_bytes_length = 0; 1006 tmp->some_bytes_set = 0; 1007 } 1008 tmp->fixed_bytes_set = 0; 1009 memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data)); 1010 if (tmp->notes_set == 1) { 1011 int i; 1012 for (i = 0; i < tmp->notes_length; ++i) { 1013 if (tmp->notes_data[i] != NULL) free(tmp->notes_data[i]); 1014 } 1015 free(tmp->notes_data); 1016 tmp->notes_data = NULL; 1017 tmp->notes_set = 0; 1018 tmp->notes_length = 0; 1019 tmp->notes_num_allocated = 0; 1020 } 1021 tmp->large_number_set = 0; 1022 if (tmp->other_numbers_set == 1) { 1023 free(tmp->other_numbers_data); 1024 tmp->other_numbers_data = NULL; 1025 tmp->other_numbers_set = 0; 1026 tmp->other_numbers_length = 0; 1027 tmp->other_numbers_num_allocated = 0; 1028 } 1029 } 1030 1031 void 1032 run_free(struct run *tmp) 1033 { 1034 if (tmp->how_data != NULL) 1035 free (tmp->how_data); 1036 if (tmp->some_bytes_data != NULL) 1037 free(tmp->some_bytes_data); 1038 if (tmp->notes_set == 1) { 1039 int i; 1040 for (i = 0; i < tmp->notes_length; ++i) { 1041 if (tmp->notes_data[i] != NULL) free(tmp->notes_data[i]); 1042 } 1043 free(tmp->notes_data); 1044 tmp->notes_data = NULL; 1045 tmp->notes_set = 0; 1046 tmp->notes_length = 0; 1047 tmp->notes_num_allocated = 0; 1048 } 1049 free(tmp->notes_data); 1050 if (tmp->other_numbers_set == 1) { 1051 free(tmp->other_numbers_data); 1052 tmp->other_numbers_data = NULL; 1053 tmp->other_numbers_set = 0; 1054 tmp->other_numbers_length = 0; 1055 tmp->other_numbers_num_allocated = 0; 1056 } 1057 free(tmp->other_numbers_data); 1058 free(tmp); 1059 } 1060 1061 void 1062 run_marshal(struct evbuffer *evbuf, const struct run *tmp) { 1063 evtag_marshal_string(evbuf, RUN_HOW, tmp->how_data); 1064 if (tmp->some_bytes_set) { 1065 evtag_marshal(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length); 1066 } 1067 evtag_marshal(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, (24)); 1068 if (tmp->notes_set) { 1069 { 1070 int i; 1071 for (i = 0; i < tmp->notes_length; ++i) { 1072 evtag_marshal_string(evbuf, RUN_NOTES, tmp->notes_data[i]); 1073 } 1074 } 1075 } 1076 if (tmp->large_number_set) { 1077 evtag_marshal_int64(evbuf, RUN_LARGE_NUMBER, tmp->large_number_data); 1078 } 1079 if (tmp->other_numbers_set) { 1080 { 1081 int i; 1082 for (i = 0; i < tmp->other_numbers_length; ++i) { 1083 evtag_marshal_int(evbuf, RUN_OTHER_NUMBERS, tmp->other_numbers_data[i]); 1084 } 1085 } 1086 } 1087 } 1088 1089 int 1090 run_unmarshal(struct run *tmp, struct evbuffer *evbuf) 1091 { 1092 ev_uint32_t tag; 1093 while (evbuffer_get_length(evbuf) > 0) { 1094 if (evtag_peek(evbuf, &tag) == -1) 1095 return (-1); 1096 switch (tag) { 1097 1098 case RUN_HOW: 1099 if (tmp->how_set) 1100 return (-1); 1101 if (evtag_unmarshal_string(evbuf, RUN_HOW, &tmp->how_data) == -1) { 1102 event_warnx("%s: failed to unmarshal how", __func__); 1103 return (-1); 1104 } 1105 tmp->how_set = 1; 1106 break; 1107 case RUN_SOME_BYTES: 1108 if (tmp->some_bytes_set) 1109 return (-1); 1110 if (evtag_payload_length(evbuf, &tmp->some_bytes_length) == -1) 1111 return (-1); 1112 if (tmp->some_bytes_length > evbuffer_get_length(evbuf)) 1113 return (-1); 1114 if ((tmp->some_bytes_data = malloc(tmp->some_bytes_length)) == NULL) 1115 return (-1); 1116 if (evtag_unmarshal_fixed(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length) == -1) { 1117 event_warnx("%s: failed to unmarshal some_bytes", __func__); 1118 return (-1); 1119 } 1120 tmp->some_bytes_set = 1; 1121 break; 1122 case RUN_FIXED_BYTES: 1123 if (tmp->fixed_bytes_set) 1124 return (-1); 1125 if (evtag_unmarshal_fixed(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, (24)) == -1) { 1126 event_warnx("%s: failed to unmarshal fixed_bytes", __func__); 1127 return (-1); 1128 } 1129 tmp->fixed_bytes_set = 1; 1130 break; 1131 case RUN_NOTES: 1132 if (tmp->notes_length >= tmp->notes_num_allocated && 1133 run_notes_expand_to_hold_more(tmp) < 0) { 1134 puts("HEY NOW"); 1135 return (-1); 1136 } 1137 if (evtag_unmarshal_string(evbuf, RUN_NOTES, &tmp->notes_data[tmp->notes_length]) == -1) { 1138 event_warnx("%s: failed to unmarshal notes", __func__); 1139 return (-1); 1140 } 1141 ++tmp->notes_length; 1142 tmp->notes_set = 1; 1143 break; 1144 case RUN_LARGE_NUMBER: 1145 if (tmp->large_number_set) 1146 return (-1); 1147 if (evtag_unmarshal_int64(evbuf, RUN_LARGE_NUMBER, &tmp->large_number_data) == -1) { 1148 event_warnx("%s: failed to unmarshal large_number", __func__); 1149 return (-1); 1150 } 1151 tmp->large_number_set = 1; 1152 break; 1153 case RUN_OTHER_NUMBERS: 1154 if (tmp->other_numbers_length >= tmp->other_numbers_num_allocated && 1155 run_other_numbers_expand_to_hold_more(tmp) < 0) { 1156 puts("HEY NOW"); 1157 return (-1); 1158 } 1159 if (evtag_unmarshal_int(evbuf, RUN_OTHER_NUMBERS, &tmp->other_numbers_data[tmp->other_numbers_length]) == -1) { 1160 event_warnx("%s: failed to unmarshal other_numbers", __func__); 1161 return (-1); 1162 } 1163 ++tmp->other_numbers_length; 1164 tmp->other_numbers_set = 1; 1165 break; 1166 default: 1167 return -1; 1168 } 1169 } 1170 1171 if (run_complete(tmp) == -1) 1172 return (-1); 1173 return (0); 1174 } 1175 1176 int 1177 run_complete(struct run *msg) 1178 { 1179 if (!msg->how_set) 1180 return (-1); 1181 if (!msg->fixed_bytes_set) 1182 return (-1); 1183 return (0); 1184 } 1185 1186 int 1187 evtag_unmarshal_run(struct evbuffer *evbuf, ev_uint32_t need_tag, 1188 struct run *msg) 1189 { 1190 ev_uint32_t tag; 1191 int res = -1; 1192 1193 struct evbuffer *tmp = evbuffer_new(); 1194 1195 if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag) 1196 goto error; 1197 1198 if (run_unmarshal(msg, tmp) == -1) 1199 goto error; 1200 1201 res = 0; 1202 1203 error: 1204 evbuffer_free(tmp); 1205 return (res); 1206 } 1207 1208 void 1209 evtag_marshal_run(struct evbuffer *evbuf, ev_uint32_t tag, 1210 const struct run *msg) 1211 { 1212 struct evbuffer *buf_ = evbuffer_new(); 1213 assert(buf_ != NULL); 1214 run_marshal(buf_, msg); 1215 evtag_marshal_buffer(evbuf, tag, buf_); 1216 evbuffer_free(buf_); 1217 } 1218 1219