7 marshal_int32 (int32_t value, void (*out) (uint8_t, void *aux), void *aux)
9 out ((value >> 24) & 0xff, aux);
10 out ((value >> 16) & 0xff, aux);
11 out ((value >> 8) & 0xff, aux);
12 out (value & 0xff, aux);
16 marshal_bytes (const void *buffer, size_t cnt,
17 void (*out) (uint8_t, void *aux), void *aux)
19 const uint8_t *p = buffer;
22 for (i = 0; i < cnt; i++)
27 backdoor_vmarshal (const char *types, va_list args,
28 void (*out) (uint8_t, void *aux), void *aux)
30 const char *p = types;
34 /* Find next type character. */
46 const char *end = strchr (++p, '\'');
47 marshal_int32 (end - p, out, aux);
48 marshal_bytes (p, end - p, out, aux);
53 const char *s = va_arg (args, const char *);
54 marshal_int32 (strlen (s), out, aux);
55 marshal_bytes (s, strlen (s), out, aux);
60 marshal_int32 (va_arg (args, int32_t), out, aux);
65 const void *buffer = va_arg (args, const void *);
66 size_t size = va_arg (args, size_t);
67 marshal_int32 (size, out, aux);
68 marshal_bytes (buffer, size, out, aux);
73 marshal_int32 (va_arg (args, int), out, aux);
77 return BACKDOOR_BAD_TYPE;
83 unmarshal_int32 (int32_t *value,
84 bool (*in) (uint8_t *, void *aux), void *aux)
90 for (i = 0; i < 4; i++)
103 unmarshal_bytes (void *buffer, size_t cnt,
104 bool (*in) (uint8_t *, void *aux), void *aux)
109 for (i = 0; i < cnt; i++)
110 if (!in (&p[i], aux))
116 backdoor_vunmarshal (const char *types, va_list args,
117 bool (*in) (uint8_t *, void *aux), void *aux)
119 const char *p = types;
125 /* Find next type character. */
131 /* Check type character in input. */
133 return BACKDOOR_UNEXPECTED_EOF;
135 return BACKDOOR_TYPE_MISMATCH;
143 if (!unmarshal_int32 (&length, in, aux))
144 return BACKDOOR_UNEXPECTED_EOF;
146 return BACKDOOR_NEGATIVE_SIZE;
149 const char *end = strchr (++p, '\'');
150 if (length != end - p)
151 return BACKDOOR_STRING_MISMATCH;
156 return BACKDOOR_UNEXPECTED_EOF;
158 return BACKDOOR_STRING_MISMATCH;
164 char *s = malloc (length + 1);
166 return BACKDOOR_NOMEM;
167 if (!unmarshal_bytes (s, length, in, aux))
170 return BACKDOOR_UNEXPECTED_EOF;
173 *va_arg (args, char **) = s;
179 if (!unmarshal_int32 (va_arg (args, int32_t *), in, aux))
180 return BACKDOOR_UNEXPECTED_EOF;
188 if (!unmarshal_int32 (&size, in, aux))
189 return BACKDOOR_UNEXPECTED_EOF;
191 return BACKDOOR_NEGATIVE_SIZE;
192 buffer = malloc (size);
193 if (size > 0 && buffer == NULL)
194 return BACKDOOR_NOMEM;
195 if (!unmarshal_bytes (buffer, size, in, aux))
198 return BACKDOOR_UNEXPECTED_EOF;
200 *va_arg (args, size_t *) = size;
201 *va_arg (args, void **) = buffer;
208 if (!unmarshal_int32 (&b, in, aux))
209 return BACKDOOR_UNEXPECTED_EOF;
210 *va_arg (args, bool *) = b;
215 return BACKDOOR_BAD_TYPE;