| 213 | } |
| 214 | |
| 215 | static |
| 216 | enum mad_flow receive(int fd, void **message, unsigned int *size) |
| 217 | { |
| 218 | enum mad_flow result; |
| 219 | unsigned int actual; |
| 220 | |
| 221 | if (*message == 0) |
| 222 | *size = 0; |
| 223 | |
| 224 | /* receive size */ |
| 225 | |
| 226 | result = receive_io(fd, &actual, sizeof(actual)); |
| 227 | |
| 228 | /* receive message */ |
| 229 | |
| 230 | if (result == MAD_FLOW_CONTINUE) { |
| 231 | if (actual > *size) |
| 232 | actual -= *size; |
| 233 | else { |
| 234 | *size = actual; |
| 235 | actual = 0; |
| 236 | } |
| 237 | |
| 238 | if (*size > 0) { |
| 239 | if (*message == 0) { |
| 240 | *message = malloc(*size); |
| 241 | if (*message == 0) |
| 242 | return MAD_FLOW_BREAK; |
| 243 | } |
| 244 | |
| 245 | result = receive_io_blocking(fd, *message, *size); |
| 246 | } |
| 247 | |
| 248 | /* throw away remainder of message */ |
| 249 | |
| 250 | while (actual && result == MAD_FLOW_CONTINUE) { |
| 251 | char sink[256]; |
| 252 | unsigned int len; |
| 253 | |
| 254 | len = actual > sizeof(sink) ? sizeof(sink) : actual; |
| 255 | |
| 256 | result = receive_io_blocking(fd, sink, len); |
| 257 | |
| 258 | actual -= len; |
| 259 | } |
| 260 | } |
| 261 | |
| 262 | return result; |
| 263 | } |
| 264 | |
| 265 | static |
| 266 | enum mad_flow check_message(struct mad_decoder *decoder) |
no test coverage detected