Annotation of embedaddon/libevent/test/regress.gen.c, revision 1.1
1.1 ! misho 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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>