| 301 | } |
| 302 | |
| 303 | void xs_tcp_read(xsMachine *the) |
| 304 | { |
| 305 | TCP tcp = xsmcGetHostDataValidate(xsThis, (void *)&xsTCPHooks); |
| 306 | TCPBuffer buffer; |
| 307 | int requested; |
| 308 | uint8_t *out, value; |
| 309 | |
| 310 | if (!tcp->buffers) |
| 311 | return; |
| 312 | |
| 313 | if (kIOFormatBuffer == tcp->format) { |
| 314 | int available = 0; |
| 315 | uint8_t allocate = 1; |
| 316 | xsUnsignedValue byteLength; |
| 317 | |
| 318 | for (buffer = tcp->buffers; NULL != buffer; buffer = buffer->next) |
| 319 | available += buffer->bytes; |
| 320 | |
| 321 | if (0 == xsmcArgc) |
| 322 | requested = available; |
| 323 | else if (xsReferenceType == xsmcTypeOf(xsArg(0))) { |
| 324 | xsResult = xsArg(0); |
| 325 | xsmcGetBufferWritable(xsResult, (void **)&out, &byteLength); |
| 326 | requested = (int)byteLength; |
| 327 | allocate = 0; |
| 328 | xsmcSetInteger(xsResult, requested); |
| 329 | } |
| 330 | else |
| 331 | requested = xsmcToInteger(xsArg(0)); |
| 332 | |
| 333 | if ((requested <= 0) || (requested > available)) |
| 334 | xsUnknownError("invalid"); |
| 335 | |
| 336 | if (allocate) |
| 337 | out = xsmcSetArrayBuffer(xsResult, NULL, requested); |
| 338 | } |
| 339 | else { |
| 340 | requested = 1; |
| 341 | out = &value; |
| 342 | } |
| 343 | |
| 344 | //@@ not sure we need a loop... that was mostly about lwip fragments |
| 345 | while (requested) { |
| 346 | int use = requested; |
| 347 | TCPBuffer buffer = tcp->buffers; |
| 348 | |
| 349 | if (use > buffer->bytes) |
| 350 | use = buffer->bytes; |
| 351 | |
| 352 | if (0 != net_pkt_read(buffer->pkt, out, use)) |
| 353 | xsUnknownError("net_pkt_read failed"); |
| 354 | |
| 355 | out += use; |
| 356 | requested -= use; |
| 357 | buffer->bytes -= use; |
| 358 | |
| 359 | if (0 == buffer->bytes) { |
| 360 | tcp->buffers = buffer->next; |
nothing calls this directly
no test coverage detected