示例#1
0
文件: dsk-main.c 项目: davebenson/dsk
void              dsk_main_watch_fd        (DskFileDescriptor   fd,
                                            unsigned            events,
                                            DskFDFunc           callback,
                                            void               *callback_data)
{
  dsk_assert (fd >= 0);
  dsk_dispatch_watch_fd (dsk_dispatch_default (),
                         fd, events, callback, callback_data);
}
示例#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);
    }
}
示例#3
0
static void
begin_connecting_sockaddr (DskClientStream *stream,
                           unsigned          addr_len,
                           struct sockaddr   *addr)
{
  int fd;
  dsk_assert (stream->fd == -1);
  dsk_assert (!stream->is_connecting);
  dsk_assert (!stream->is_connected);
retry_sys_socket:
  fd = socket (addr->sa_family, SOCK_STREAM, 0);
  if (fd < 0)
    {
      int e = errno;
      if (e == EINTR)
        goto retry_sys_socket;
      if (dsk_fd_creation_failed (e))
        goto retry_sys_socket;

      /* set error */
      dsk_octet_stream_set_last_error (&stream->base_instance,
                                       "error invoking socket(2) system-call: %s",
                                       strerror (e));

      goto handle_error;
    }

  /* set non-blocking */
  dsk_fd_set_nonblocking (fd);
  dsk_fd_set_close_on_exec (fd);

  /* call connect() */
retry_sys_connect:
  if (connect (fd, addr, addr_len) < 0)
    {
      int e = errno;
      if (e == EINTR)
        goto retry_sys_connect;
      
      if (e == EAGAIN || e == EINPROGRESS)
        {
          stream->is_connecting = DSK_TRUE;
          stream->fd = fd;
          dsk_dispatch_watch_fd (dsk_dispatch_default (), fd,
                                 DSK_EVENT_WRITABLE|DSK_EVENT_READABLE,
                                 handle_fd_connecting, stream);
          return;
        }

      /* set error */
      close (fd);
      dsk_octet_stream_set_last_error (&stream->base_instance,
                                       "error connecting to %s: %s",
                                       stream->name, strerror (e));
      goto handle_error;
    }

  stream->is_connected = DSK_TRUE;
  stream->fd = fd;
  handle_fd_connected (stream);
  return;

handle_error:
  maybe_set_autoreconnect_timer (stream);
  return;
}