Home | History | Annotate | Download | only in test
      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