Beispiel #1
0
static void
dsk_ssl_stream_update_traps (DskSslStream *stream)
{
  dsk_boolean read_trap = DSK_FALSE, write_trap = DSK_FALSE;
  if (stream->base_instance.sink == NULL
   || stream->base_instance.source == NULL)
    return;
  if (stream->underlying_sink == NULL
   || stream->underlying_source == NULL)
    return;
  if (stream->handshaking)
    {
      if (stream->read_needed_to_handshake)
        read_trap = DSK_TRUE;
      else if (stream->write_needed_to_handshake)
        write_trap = DSK_TRUE;
    }
  else
    {
      dsk_boolean w = dsk_hook_is_trapped (&stream->base_instance.sink->writable_hook);
      dsk_boolean r = dsk_hook_is_trapped (&stream->base_instance.source->readable_hook);
      if (w)
        {
          if (stream->read_needed_to_write)
            read_trap = DSK_TRUE;
          else
            write_trap = DSK_TRUE;
        }
      if (r)
        {
          if (stream->write_needed_to_read)
            write_trap = DSK_TRUE;
          else
            read_trap = DSK_TRUE;
        }
    }
  if (read_trap && stream->underlying_read == NULL)
    stream->underlying_read = dsk_hook_trap (&stream->base_instance.source->readable_hook,
                                             (DskHookFunc) handle_underlying_readable,
                                             stream,
                                             (DskHookDestroy) handle_underlying_read_destroy);
  else if (!read_trap && stream->underlying_read != NULL)
    {
      dsk_hook_trap_free (stream->underlying_read);
      stream->underlying_read = NULL;
    }
  if (write_trap && stream->underlying_write == NULL)
    stream->underlying_write = dsk_hook_trap (&stream->base_instance.sink->writable_hook,
                                              (DskHookFunc) handle_underlying_writable,
                                              stream,
                                              (DskHookDestroy) handle_underlying_write_destroy);
  else if (!write_trap && stream->underlying_write != NULL)
    {
      /* NOTE: dsk_hook_trap_free is intended to NOT call destroy() */
      dsk_hook_trap_free (stream->underlying_write);
      stream->underlying_write = NULL;
    }
}
Beispiel #2
0
static void
stream_do_watch_fd (DskClientStream *stream)
{
  if (stream->is_connected)
    {
      int events = 0;
      if (stream->base_instance.source != NULL
       && dsk_hook_is_trapped (&stream->base_instance.source->readable_hook))
        events |= DSK_EVENT_READABLE;
      if (stream->base_instance.sink != NULL
       && dsk_hook_is_trapped (&stream->base_instance.sink->writable_hook))
        events |= DSK_EVENT_WRITABLE;
      dsk_dispatch_watch_fd (dsk_dispatch_default (), stream->fd, events,
                             handle_fd_events, stream);
    }
}
Beispiel #3
0
static void
dsk_ssl_source_set_poll (void *object,
                       dsk_boolean is_trapped)
{
  DskOctetSource *source = DSK_OCTET_SOURCE (object);
  dsk_assert (dsk_hook_is_trapped (&source->readable_hook) == is_trapped);
  dsk_ssl_stream_update_traps (DSK_SSL_STREAM (source->stream));
}
Beispiel #4
0
static void
dsk_ssl_sink_set_poll (void *object,
                       dsk_boolean is_trapped)
{
  DskOctetSink *sink = DSK_OCTET_SINK (object);
  dsk_assert (dsk_hook_is_trapped (&sink->writable_hook) == is_trapped);
  dsk_ssl_stream_update_traps (DSK_SSL_STREAM (sink->stream));
}