// do all chunk/socket stuff pipe_t tcp4_flush(pipe_t pipe) { int len; lob_t packet; uint8_t buf[256]; pipe_tcp4_t to = tcp4_to(pipe); if(!to) return NULL; if(chunks_len(to->chunks)) { while((len = write(to->client, chunks_write(to->chunks), chunks_len(to->chunks))) > 0) { chunks_written(to->chunks, len); LOG("wrote %d bytes to %s",len,pipe->id); } } while((len = read(to->client, buf, 256)) > 0) { LOG("reading %d bytes from %s",len,pipe->id); chunks_read(to->chunks, buf, len); } // any incoming full packets can be received while((packet = chunks_receive(to->chunks))) mesh_receive(to->net->mesh, packet, pipe); if(len < 0 && errno != EWOULDBLOCK && errno != EINPROGRESS) { LOG("socket error to %s: %s",pipe->id,strerror(errno)); close(to->client); to->client = 0; } return pipe; }
bool chunks_get(ChunkInfoBlock *chunkInfoBlock) { uint64 offset; ChunkHeader chunkHeader; assert(chunkInfoBlock != NULL); /* get current offset */ if (!chunkInfoBlock->tellFile(chunkInfoBlock->userData,&offset)) { return FALSE; } /* read chunk header */ if (!chunks_read(chunkInfoBlock,&chunkHeader,CHUNK_HEADER_DEFINITION)) { return FALSE; } /* init */ chunkInfoBlock->containerChunkInfoBlock = NULL; chunkInfoBlock->mode = CHUNK_MODE_READ; chunkInfoBlock->offset = offset; chunkInfoBlock->id = chunkHeader.id; chunkInfoBlock->size = chunkHeader.size; chunkInfoBlock->index = 0; return TRUE; }
bool chunks_getSub(ChunkInfoBlock *chunkInfoBlock, ChunkInfoBlock *containerChunkInfoBlock) { uint64 offset; ChunkHeader chunkHeader; assert(chunkInfoBlock != NULL); assert(containerChunkInfoBlock != NULL); assert(containerChunkInfoBlock->mode == CHUNK_MODE_READ); if ((containerChunkInfoBlock->index + sizeof(ChunkHeader)) <= containerChunkInfoBlock->size) { /* get current offset */ if (!chunkInfoBlock->tellFile(chunkInfoBlock->userData,&offset)) { return FALSE; } /* read chunk header */ if (!chunks_read(chunkInfoBlock,&chunkHeader,CHUNK_HEADER_DEFINITION)) { return FALSE; } containerChunkInfoBlock->index += sizeof(ChunkHeader); /* valida chunk */ if (chunkHeader.size > (containerChunkInfoBlock->size-containerChunkInfoBlock->index)) { return FALSE; } /* init */ chunkInfoBlock->containerChunkInfoBlock = containerChunkInfoBlock; chunkInfoBlock->mode = CHUNK_MODE_READ; chunkInfoBlock->offset = offset; chunkInfoBlock->id = chunkHeader.id; chunkInfoBlock->size = chunkHeader.size; chunkInfoBlock->index = 0; return TRUE; } else { return FALSE; } }