879 lines
18 KiB
C
879 lines
18 KiB
C
|
/*
|
||
|
* Automatically generated from ./regress.rpc
|
||
|
* by event_rpcgen.py/0.1. DO NOT EDIT THIS FILE.
|
||
|
*/
|
||
|
|
||
|
#include <sys/types.h>
|
||
|
#ifdef _EVENT_HAVE_SYS_TIME_H
|
||
|
#include <sys/time.h>
|
||
|
#endif
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <assert.h>
|
||
|
#define EVENT_NO_STRUCT
|
||
|
#include <event.h>
|
||
|
|
||
|
#ifdef _EVENT___func__
|
||
|
#define __func__ _EVENT___func__
|
||
|
#endif
|
||
|
|
||
|
#include "./regress.gen.h"
|
||
|
|
||
|
void event_err(int eval, const char *fmt, ...);
|
||
|
void event_warn(const char *fmt, ...);
|
||
|
void event_errx(int eval, const char *fmt, ...);
|
||
|
void event_warnx(const char *fmt, ...);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Implementation of msg
|
||
|
*/
|
||
|
|
||
|
static struct msg_access_ __msg_base = {
|
||
|
msg_from_name_assign,
|
||
|
msg_from_name_get,
|
||
|
msg_to_name_assign,
|
||
|
msg_to_name_get,
|
||
|
msg_attack_assign,
|
||
|
msg_attack_get,
|
||
|
msg_run_assign,
|
||
|
msg_run_get,
|
||
|
msg_run_add,
|
||
|
};
|
||
|
|
||
|
struct msg *
|
||
|
msg_new(void)
|
||
|
{
|
||
|
struct msg *tmp;
|
||
|
if ((tmp = malloc(sizeof(struct msg))) == NULL) {
|
||
|
event_warn("%s: malloc", __func__);
|
||
|
return (NULL);
|
||
|
}
|
||
|
tmp->base = &__msg_base;
|
||
|
|
||
|
tmp->from_name_data = NULL;
|
||
|
tmp->from_name_set = 0;
|
||
|
|
||
|
tmp->to_name_data = NULL;
|
||
|
tmp->to_name_set = 0;
|
||
|
|
||
|
tmp->attack_data = NULL;
|
||
|
tmp->attack_set = 0;
|
||
|
|
||
|
tmp->run_data = NULL;
|
||
|
tmp->run_length = 0;
|
||
|
tmp->run_num_allocated = 0;
|
||
|
tmp->run_set = 0;
|
||
|
|
||
|
return (tmp);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
struct run *
|
||
|
msg_run_add(struct msg *msg)
|
||
|
{
|
||
|
if (++msg->run_length >= msg->run_num_allocated) {
|
||
|
int tobe_allocated = msg->run_num_allocated;
|
||
|
struct run ** new_data = NULL;
|
||
|
tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;
|
||
|
new_data = (struct run **) realloc(msg->run_data,
|
||
|
tobe_allocated * sizeof(struct run *));
|
||
|
if (new_data == NULL)
|
||
|
goto error;
|
||
|
msg->run_data = new_data;
|
||
|
msg->run_num_allocated = tobe_allocated;
|
||
|
}
|
||
|
msg->run_data[msg->run_length - 1] = run_new();
|
||
|
if (msg->run_data[msg->run_length - 1] == NULL)
|
||
|
goto error;
|
||
|
msg->run_set = 1;
|
||
|
return (msg->run_data[msg->run_length - 1]);
|
||
|
error:
|
||
|
--msg->run_length;
|
||
|
return (NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
int
|
||
|
msg_from_name_assign(struct msg *msg,
|
||
|
const char * value)
|
||
|
{
|
||
|
if (msg->from_name_data != NULL)
|
||
|
free(msg->from_name_data);
|
||
|
if ((msg->from_name_data = strdup(value)) == NULL)
|
||
|
return (-1);
|
||
|
msg->from_name_set = 1;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_to_name_assign(struct msg *msg,
|
||
|
const char * value)
|
||
|
{
|
||
|
if (msg->to_name_data != NULL)
|
||
|
free(msg->to_name_data);
|
||
|
if ((msg->to_name_data = strdup(value)) == NULL)
|
||
|
return (-1);
|
||
|
msg->to_name_set = 1;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_attack_assign(struct msg *msg,
|
||
|
const struct kill* value)
|
||
|
{
|
||
|
struct evbuffer *tmp = NULL;
|
||
|
if (msg->attack_set) {
|
||
|
kill_clear(msg->attack_data);
|
||
|
msg->attack_set = 0;
|
||
|
} else {
|
||
|
msg->attack_data = kill_new();
|
||
|
if (msg->attack_data == NULL) {
|
||
|
event_warn("%s: kill_new()", __func__);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
if ((tmp = evbuffer_new()) == NULL) {
|
||
|
event_warn("%s: evbuffer_new()", __func__);
|
||
|
goto error;
|
||
|
}
|
||
|
kill_marshal(tmp, value);
|
||
|
if (kill_unmarshal(msg->attack_data, tmp) == -1) {
|
||
|
event_warnx("%s: kill_unmarshal", __func__);
|
||
|
goto error;
|
||
|
}
|
||
|
msg->attack_set = 1;
|
||
|
evbuffer_free(tmp);
|
||
|
return (0);
|
||
|
error:
|
||
|
if (tmp != NULL)
|
||
|
evbuffer_free(tmp);
|
||
|
if (msg->attack_data != NULL) {
|
||
|
kill_free(msg->attack_data);
|
||
|
msg->attack_data = NULL;
|
||
|
}
|
||
|
return (-1);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_run_assign(struct msg *msg, int off,
|
||
|
const struct run * value)
|
||
|
{
|
||
|
struct evbuffer *tmp = NULL;
|
||
|
if (!msg->run_set || off < 0 || off >= msg->run_length)
|
||
|
return (-1);
|
||
|
run_clear(msg->run_data[off]);
|
||
|
if ((tmp = evbuffer_new()) == NULL) {
|
||
|
event_warn("%s: evbuffer_new()", __func__);
|
||
|
goto error;
|
||
|
}
|
||
|
run_marshal(tmp, value);
|
||
|
if (run_unmarshal(msg->run_data[off], tmp) == -1) {
|
||
|
event_warnx("%s: run_unmarshal", __func__);
|
||
|
goto error;
|
||
|
}
|
||
|
evbuffer_free(tmp);
|
||
|
return (0);
|
||
|
error:
|
||
|
if (tmp != NULL)
|
||
|
evbuffer_free(tmp);
|
||
|
run_clear(msg->run_data[off]);
|
||
|
return (-1);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_from_name_get(struct msg *msg, char * *value)
|
||
|
{
|
||
|
if (msg->from_name_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->from_name_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_to_name_get(struct msg *msg, char * *value)
|
||
|
{
|
||
|
if (msg->to_name_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->to_name_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_attack_get(struct msg *msg, struct kill* *value)
|
||
|
{
|
||
|
if (msg->attack_set != 1) {
|
||
|
msg->attack_data = kill_new();
|
||
|
if (msg->attack_data == NULL)
|
||
|
return (-1);
|
||
|
msg->attack_set = 1;
|
||
|
}
|
||
|
*value = msg->attack_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_run_get(struct msg *msg, int offset,
|
||
|
struct run * *value)
|
||
|
{
|
||
|
if (!msg->run_set || offset < 0 || offset >= msg->run_length)
|
||
|
return (-1);
|
||
|
*value = msg->run_data[offset];
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
msg_clear(struct msg *tmp)
|
||
|
{
|
||
|
if (tmp->from_name_set == 1) {
|
||
|
free (tmp->from_name_data);
|
||
|
tmp->from_name_data = NULL;
|
||
|
tmp->from_name_set = 0;
|
||
|
}
|
||
|
if (tmp->to_name_set == 1) {
|
||
|
free (tmp->to_name_data);
|
||
|
tmp->to_name_data = NULL;
|
||
|
tmp->to_name_set = 0;
|
||
|
}
|
||
|
if (tmp->attack_set == 1) {
|
||
|
kill_free(tmp->attack_data);
|
||
|
tmp->attack_data = NULL;
|
||
|
tmp->attack_set = 0;
|
||
|
}
|
||
|
if (tmp->run_set == 1) {
|
||
|
int i;
|
||
|
for (i = 0; i < tmp->run_length; ++i) {
|
||
|
run_free(tmp->run_data[i]);
|
||
|
}
|
||
|
free(tmp->run_data);
|
||
|
tmp->run_data = NULL;
|
||
|
tmp->run_set = 0;
|
||
|
tmp->run_length = 0;
|
||
|
tmp->run_num_allocated = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
msg_free(struct msg *tmp)
|
||
|
{
|
||
|
if (tmp->from_name_data != NULL)
|
||
|
free (tmp->from_name_data);
|
||
|
if (tmp->to_name_data != NULL)
|
||
|
free (tmp->to_name_data);
|
||
|
if (tmp->attack_data != NULL)
|
||
|
kill_free(tmp->attack_data);
|
||
|
if (tmp->run_data != NULL) {
|
||
|
int i;
|
||
|
for (i = 0; i < tmp->run_length; ++i) {
|
||
|
run_free(tmp->run_data[i]);
|
||
|
tmp->run_data[i] = NULL;
|
||
|
}
|
||
|
free(tmp->run_data);
|
||
|
tmp->run_data = NULL;
|
||
|
tmp->run_length = 0;
|
||
|
tmp->run_num_allocated = 0;
|
||
|
}
|
||
|
free(tmp);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
msg_marshal(struct evbuffer *evbuf, const struct msg *tmp){
|
||
|
evtag_marshal_string(evbuf, MSG_FROM_NAME, tmp->from_name_data);
|
||
|
evtag_marshal_string(evbuf, MSG_TO_NAME, tmp->to_name_data);
|
||
|
if (tmp->attack_set) {
|
||
|
evtag_marshal_kill(evbuf, MSG_ATTACK, tmp->attack_data);
|
||
|
}
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0; i < tmp->run_length; ++i) {
|
||
|
evtag_marshal_run(evbuf, MSG_RUN, tmp->run_data[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_unmarshal(struct msg *tmp, struct evbuffer *evbuf)
|
||
|
{
|
||
|
ev_uint32_t tag;
|
||
|
while (EVBUFFER_LENGTH(evbuf) > 0) {
|
||
|
if (evtag_peek(evbuf, &tag) == -1)
|
||
|
return (-1);
|
||
|
switch (tag) {
|
||
|
|
||
|
case MSG_FROM_NAME:
|
||
|
|
||
|
if (tmp->from_name_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_string(evbuf, MSG_FROM_NAME, &tmp->from_name_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal from_name", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->from_name_set = 1;
|
||
|
break;
|
||
|
|
||
|
case MSG_TO_NAME:
|
||
|
|
||
|
if (tmp->to_name_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_string(evbuf, MSG_TO_NAME, &tmp->to_name_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal to_name", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->to_name_set = 1;
|
||
|
break;
|
||
|
|
||
|
case MSG_ATTACK:
|
||
|
|
||
|
if (tmp->attack_set)
|
||
|
return (-1);
|
||
|
tmp->attack_data = kill_new();
|
||
|
if (tmp->attack_data == NULL)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_kill(evbuf, MSG_ATTACK, tmp->attack_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal attack", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->attack_set = 1;
|
||
|
break;
|
||
|
|
||
|
case MSG_RUN:
|
||
|
|
||
|
if (msg_run_add(tmp) == NULL)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_run(evbuf, MSG_RUN,
|
||
|
tmp->run_data[tmp->run_length - 1]) == -1) {
|
||
|
--tmp->run_length;
|
||
|
event_warnx("%s: failed to unmarshal run", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->run_set = 1;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (msg_complete(tmp) == -1)
|
||
|
return (-1);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
msg_complete(struct msg *msg)
|
||
|
{
|
||
|
if (!msg->from_name_set)
|
||
|
return (-1);
|
||
|
if (!msg->to_name_set)
|
||
|
return (-1);
|
||
|
if (msg->attack_set && kill_complete(msg->attack_data) == -1)
|
||
|
return (-1);
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0; i < msg->run_length; ++i) {
|
||
|
if (run_complete(msg->run_data[i]) == -1)
|
||
|
return (-1);
|
||
|
}
|
||
|
}
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
evtag_unmarshal_msg(struct evbuffer *evbuf, ev_uint32_t need_tag, struct msg *msg)
|
||
|
{
|
||
|
ev_uint32_t tag;
|
||
|
int res = -1;
|
||
|
|
||
|
struct evbuffer *tmp = evbuffer_new();
|
||
|
|
||
|
if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
|
||
|
goto error;
|
||
|
|
||
|
if (msg_unmarshal(msg, tmp) == -1)
|
||
|
goto error;
|
||
|
|
||
|
res = 0;
|
||
|
|
||
|
error:
|
||
|
evbuffer_free(tmp);
|
||
|
return (res);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
evtag_marshal_msg(struct evbuffer *evbuf, ev_uint32_t tag, const struct msg *msg)
|
||
|
{
|
||
|
struct evbuffer *_buf = evbuffer_new();
|
||
|
assert(_buf != NULL);
|
||
|
evbuffer_drain(_buf, -1);
|
||
|
msg_marshal(_buf, msg);
|
||
|
evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
|
||
|
evbuffer_free(_buf);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Implementation of kill
|
||
|
*/
|
||
|
|
||
|
static struct kill_access_ __kill_base = {
|
||
|
kill_weapon_assign,
|
||
|
kill_weapon_get,
|
||
|
kill_action_assign,
|
||
|
kill_action_get,
|
||
|
kill_how_often_assign,
|
||
|
kill_how_often_get,
|
||
|
};
|
||
|
|
||
|
struct kill *
|
||
|
kill_new(void)
|
||
|
{
|
||
|
struct kill *tmp;
|
||
|
if ((tmp = malloc(sizeof(struct kill))) == NULL) {
|
||
|
event_warn("%s: malloc", __func__);
|
||
|
return (NULL);
|
||
|
}
|
||
|
tmp->base = &__kill_base;
|
||
|
|
||
|
tmp->weapon_data = NULL;
|
||
|
tmp->weapon_set = 0;
|
||
|
|
||
|
tmp->action_data = NULL;
|
||
|
tmp->action_set = 0;
|
||
|
|
||
|
tmp->how_often_data = 0;
|
||
|
tmp->how_often_set = 0;
|
||
|
|
||
|
return (tmp);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
int
|
||
|
kill_weapon_assign(struct kill *msg,
|
||
|
const char * value)
|
||
|
{
|
||
|
if (msg->weapon_data != NULL)
|
||
|
free(msg->weapon_data);
|
||
|
if ((msg->weapon_data = strdup(value)) == NULL)
|
||
|
return (-1);
|
||
|
msg->weapon_set = 1;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_action_assign(struct kill *msg,
|
||
|
const char * value)
|
||
|
{
|
||
|
if (msg->action_data != NULL)
|
||
|
free(msg->action_data);
|
||
|
if ((msg->action_data = strdup(value)) == NULL)
|
||
|
return (-1);
|
||
|
msg->action_set = 1;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_how_often_assign(struct kill *msg, const ev_uint32_t value)
|
||
|
{
|
||
|
msg->how_often_set = 1;
|
||
|
msg->how_often_data = value;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_weapon_get(struct kill *msg, char * *value)
|
||
|
{
|
||
|
if (msg->weapon_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->weapon_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_action_get(struct kill *msg, char * *value)
|
||
|
{
|
||
|
if (msg->action_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->action_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_how_often_get(struct kill *msg, ev_uint32_t *value)
|
||
|
{
|
||
|
if (msg->how_often_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->how_often_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
kill_clear(struct kill *tmp)
|
||
|
{
|
||
|
if (tmp->weapon_set == 1) {
|
||
|
free (tmp->weapon_data);
|
||
|
tmp->weapon_data = NULL;
|
||
|
tmp->weapon_set = 0;
|
||
|
}
|
||
|
if (tmp->action_set == 1) {
|
||
|
free (tmp->action_data);
|
||
|
tmp->action_data = NULL;
|
||
|
tmp->action_set = 0;
|
||
|
}
|
||
|
tmp->how_often_set = 0;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
kill_free(struct kill *tmp)
|
||
|
{
|
||
|
if (tmp->weapon_data != NULL)
|
||
|
free (tmp->weapon_data);
|
||
|
if (tmp->action_data != NULL)
|
||
|
free (tmp->action_data);
|
||
|
free(tmp);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
kill_marshal(struct evbuffer *evbuf, const struct kill *tmp){
|
||
|
evtag_marshal_string(evbuf, KILL_WEAPON, tmp->weapon_data);
|
||
|
evtag_marshal_string(evbuf, KILL_ACTION, tmp->action_data);
|
||
|
if (tmp->how_often_set) {
|
||
|
evtag_marshal_int(evbuf, KILL_HOW_OFTEN, tmp->how_often_data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_unmarshal(struct kill *tmp, struct evbuffer *evbuf)
|
||
|
{
|
||
|
ev_uint32_t tag;
|
||
|
while (EVBUFFER_LENGTH(evbuf) > 0) {
|
||
|
if (evtag_peek(evbuf, &tag) == -1)
|
||
|
return (-1);
|
||
|
switch (tag) {
|
||
|
|
||
|
case KILL_WEAPON:
|
||
|
|
||
|
if (tmp->weapon_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_string(evbuf, KILL_WEAPON, &tmp->weapon_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal weapon", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->weapon_set = 1;
|
||
|
break;
|
||
|
|
||
|
case KILL_ACTION:
|
||
|
|
||
|
if (tmp->action_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_string(evbuf, KILL_ACTION, &tmp->action_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal action", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->action_set = 1;
|
||
|
break;
|
||
|
|
||
|
case KILL_HOW_OFTEN:
|
||
|
|
||
|
if (tmp->how_often_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_int(evbuf, KILL_HOW_OFTEN, &tmp->how_often_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal how_often", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->how_often_set = 1;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (kill_complete(tmp) == -1)
|
||
|
return (-1);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
kill_complete(struct kill *msg)
|
||
|
{
|
||
|
if (!msg->weapon_set)
|
||
|
return (-1);
|
||
|
if (!msg->action_set)
|
||
|
return (-1);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
evtag_unmarshal_kill(struct evbuffer *evbuf, ev_uint32_t need_tag, struct kill *msg)
|
||
|
{
|
||
|
ev_uint32_t tag;
|
||
|
int res = -1;
|
||
|
|
||
|
struct evbuffer *tmp = evbuffer_new();
|
||
|
|
||
|
if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
|
||
|
goto error;
|
||
|
|
||
|
if (kill_unmarshal(msg, tmp) == -1)
|
||
|
goto error;
|
||
|
|
||
|
res = 0;
|
||
|
|
||
|
error:
|
||
|
evbuffer_free(tmp);
|
||
|
return (res);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
evtag_marshal_kill(struct evbuffer *evbuf, ev_uint32_t tag, const struct kill *msg)
|
||
|
{
|
||
|
struct evbuffer *_buf = evbuffer_new();
|
||
|
assert(_buf != NULL);
|
||
|
evbuffer_drain(_buf, -1);
|
||
|
kill_marshal(_buf, msg);
|
||
|
evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
|
||
|
evbuffer_free(_buf);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Implementation of run
|
||
|
*/
|
||
|
|
||
|
static struct run_access_ __run_base = {
|
||
|
run_how_assign,
|
||
|
run_how_get,
|
||
|
run_some_bytes_assign,
|
||
|
run_some_bytes_get,
|
||
|
run_fixed_bytes_assign,
|
||
|
run_fixed_bytes_get,
|
||
|
};
|
||
|
|
||
|
struct run *
|
||
|
run_new(void)
|
||
|
{
|
||
|
struct run *tmp;
|
||
|
if ((tmp = malloc(sizeof(struct run))) == NULL) {
|
||
|
event_warn("%s: malloc", __func__);
|
||
|
return (NULL);
|
||
|
}
|
||
|
tmp->base = &__run_base;
|
||
|
|
||
|
tmp->how_data = NULL;
|
||
|
tmp->how_set = 0;
|
||
|
|
||
|
tmp->some_bytes_data = NULL;
|
||
|
tmp->some_bytes_length = 0;
|
||
|
tmp->some_bytes_set = 0;
|
||
|
|
||
|
memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data));
|
||
|
tmp->fixed_bytes_set = 0;
|
||
|
|
||
|
return (tmp);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
int
|
||
|
run_how_assign(struct run *msg,
|
||
|
const char * value)
|
||
|
{
|
||
|
if (msg->how_data != NULL)
|
||
|
free(msg->how_data);
|
||
|
if ((msg->how_data = strdup(value)) == NULL)
|
||
|
return (-1);
|
||
|
msg->how_set = 1;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_some_bytes_assign(struct run *msg, const ev_uint8_t * value, ev_uint32_t len)
|
||
|
{
|
||
|
if (msg->some_bytes_data != NULL)
|
||
|
free (msg->some_bytes_data);
|
||
|
msg->some_bytes_data = malloc(len);
|
||
|
if (msg->some_bytes_data == NULL)
|
||
|
return (-1);
|
||
|
msg->some_bytes_set = 1;
|
||
|
msg->some_bytes_length = len;
|
||
|
memcpy(msg->some_bytes_data, value, len);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_fixed_bytes_assign(struct run *msg, const ev_uint8_t *value)
|
||
|
{
|
||
|
msg->fixed_bytes_set = 1;
|
||
|
memcpy(msg->fixed_bytes_data, value, 24);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_how_get(struct run *msg, char * *value)
|
||
|
{
|
||
|
if (msg->how_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->how_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_some_bytes_get(struct run *msg, ev_uint8_t * *value, ev_uint32_t *plen)
|
||
|
{
|
||
|
if (msg->some_bytes_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->some_bytes_data;
|
||
|
*plen = msg->some_bytes_length;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_fixed_bytes_get(struct run *msg, ev_uint8_t **value)
|
||
|
{
|
||
|
if (msg->fixed_bytes_set != 1)
|
||
|
return (-1);
|
||
|
*value = msg->fixed_bytes_data;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
run_clear(struct run *tmp)
|
||
|
{
|
||
|
if (tmp->how_set == 1) {
|
||
|
free (tmp->how_data);
|
||
|
tmp->how_data = NULL;
|
||
|
tmp->how_set = 0;
|
||
|
}
|
||
|
if (tmp->some_bytes_set == 1) {
|
||
|
free (tmp->some_bytes_data);
|
||
|
tmp->some_bytes_data = NULL;
|
||
|
tmp->some_bytes_length = 0;
|
||
|
tmp->some_bytes_set = 0;
|
||
|
}
|
||
|
tmp->fixed_bytes_set = 0;
|
||
|
memset(tmp->fixed_bytes_data, 0, sizeof(tmp->fixed_bytes_data));
|
||
|
}
|
||
|
|
||
|
void
|
||
|
run_free(struct run *tmp)
|
||
|
{
|
||
|
if (tmp->how_data != NULL)
|
||
|
free (tmp->how_data);
|
||
|
if (tmp->some_bytes_data != NULL)
|
||
|
free (tmp->some_bytes_data);
|
||
|
free(tmp);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
run_marshal(struct evbuffer *evbuf, const struct run *tmp){
|
||
|
evtag_marshal_string(evbuf, RUN_HOW, tmp->how_data);
|
||
|
if (tmp->some_bytes_set) {
|
||
|
evtag_marshal(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length);
|
||
|
}
|
||
|
evtag_marshal(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, sizeof(tmp->fixed_bytes_data));
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_unmarshal(struct run *tmp, struct evbuffer *evbuf)
|
||
|
{
|
||
|
ev_uint32_t tag;
|
||
|
while (EVBUFFER_LENGTH(evbuf) > 0) {
|
||
|
if (evtag_peek(evbuf, &tag) == -1)
|
||
|
return (-1);
|
||
|
switch (tag) {
|
||
|
|
||
|
case RUN_HOW:
|
||
|
|
||
|
if (tmp->how_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_string(evbuf, RUN_HOW, &tmp->how_data) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal how", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->how_set = 1;
|
||
|
break;
|
||
|
|
||
|
case RUN_SOME_BYTES:
|
||
|
|
||
|
if (tmp->some_bytes_set)
|
||
|
return (-1);
|
||
|
if (evtag_payload_length(evbuf, &tmp->some_bytes_length) == -1)
|
||
|
return (-1);
|
||
|
if (tmp->some_bytes_length > EVBUFFER_LENGTH(evbuf))
|
||
|
return (-1);
|
||
|
if ((tmp->some_bytes_data = malloc(tmp->some_bytes_length)) == NULL)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_fixed(evbuf, RUN_SOME_BYTES, tmp->some_bytes_data, tmp->some_bytes_length) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal some_bytes", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->some_bytes_set = 1;
|
||
|
break;
|
||
|
|
||
|
case RUN_FIXED_BYTES:
|
||
|
|
||
|
if (tmp->fixed_bytes_set)
|
||
|
return (-1);
|
||
|
if (evtag_unmarshal_fixed(evbuf, RUN_FIXED_BYTES, tmp->fixed_bytes_data, sizeof(tmp->fixed_bytes_data)) == -1) {
|
||
|
event_warnx("%s: failed to unmarshal fixed_bytes", __func__);
|
||
|
return (-1);
|
||
|
}
|
||
|
tmp->fixed_bytes_set = 1;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (run_complete(tmp) == -1)
|
||
|
return (-1);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
run_complete(struct run *msg)
|
||
|
{
|
||
|
if (!msg->how_set)
|
||
|
return (-1);
|
||
|
if (!msg->fixed_bytes_set)
|
||
|
return (-1);
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
evtag_unmarshal_run(struct evbuffer *evbuf, ev_uint32_t need_tag, struct run *msg)
|
||
|
{
|
||
|
ev_uint32_t tag;
|
||
|
int res = -1;
|
||
|
|
||
|
struct evbuffer *tmp = evbuffer_new();
|
||
|
|
||
|
if (evtag_unmarshal(evbuf, &tag, tmp) == -1 || tag != need_tag)
|
||
|
goto error;
|
||
|
|
||
|
if (run_unmarshal(msg, tmp) == -1)
|
||
|
goto error;
|
||
|
|
||
|
res = 0;
|
||
|
|
||
|
error:
|
||
|
evbuffer_free(tmp);
|
||
|
return (res);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
evtag_marshal_run(struct evbuffer *evbuf, ev_uint32_t tag, const struct run *msg)
|
||
|
{
|
||
|
struct evbuffer *_buf = evbuffer_new();
|
||
|
assert(_buf != NULL);
|
||
|
evbuffer_drain(_buf, -1);
|
||
|
run_marshal(_buf, msg);
|
||
|
evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), EVBUFFER_LENGTH(_buf));
|
||
|
evbuffer_free(_buf);
|
||
|
}
|
||
|
|