MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / xs_tcp_read

Function xs_tcp_read

modules/io/socket/zephyr/tcp.c:303–374  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

301}
302
303void 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;

Callers

nothing calls this directly

Calls 1

tcpTriggerFunction · 0.70

Tested by

no test coverage detected