Ejemplo n.º 1
0
Archivo: tcp4.c Proyecto: fd/telehash-c
// 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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
  }
}