static void fd_close(struct stream *stream) { struct stream_fd *s = stream_fd_cast(stream); close(s->fd); free(s); }
static ssize_t fd_recv(struct stream *stream, void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); ssize_t retval; retval = read(s->fd, buffer, n); return retval >= 0 ? retval : -errno; }
static ssize_t fd_send(struct stream *stream, const void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); ssize_t retval; retval = write(s->fd, buffer, n); return (retval > 0 ? retval : retval == 0 ? -EAGAIN : -errno); }
static ssize_t fd_recv(struct stream *stream, void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); ssize_t retval; if (STRESS(stream_flaky_recv)) { return -EIO; } retval = read(s->fd, buffer, n); return retval >= 0 ? retval : -errno; }
static void fd_wait(struct stream *stream, enum stream_wait_type wait) { struct stream_fd *s = stream_fd_cast(stream); switch (wait) { case STREAM_CONNECT: case STREAM_SEND: poll_fd_wait(s->fd, POLLOUT); break; case STREAM_RECV: poll_fd_wait(s->fd, POLLIN); break; default: NOT_REACHED(); } }
static int fd_connect(struct stream *stream) { struct stream_fd *s = stream_fd_cast(stream); return check_connection_completion(s->fd); }