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); }
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); } }
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; }