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