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