static void handle_fd (DskPattern *pattern, const char *prefix_filename, unsigned buffer_size, int fd) { DskBuffer in = DSK_BUFFER_INIT; DskBuffer out = DSK_BUFFER_INIT; for (;;) { int rv = dsk_buffer_readv (&in, fd); if (rv == 0) break; char *line; while ((line = dsk_buffer_read_line (&in)) != NULL) { if (dsk_pattern_match (pattern, line)) { if (prefix_filename) { dsk_buffer_append_string (&out, prefix_filename); dsk_buffer_append_string (&out, ": "); } dsk_buffer_append_string (&out, line); dsk_buffer_append_byte (&out, '\n'); while (out.size > buffer_size) dsk_buffer_writev (&out, STDOUT_FILENO); } dsk_free (line); } } while (out.size > 0) dsk_buffer_writev (&out, STDOUT_FILENO); }
static DskIOResult dsk_client_stream_source_read_buffer (DskOctetSource *source, DskBuffer *read_buffer, DskError **error) { int rv; DskClientStream *stream; if (source->stream == NULL) { dsk_set_error (error, "read from dead stream"); return DSK_IO_RESULT_ERROR; } stream = DSK_CLIENT_STREAM (source->stream); if (stream->fd < 0) { dsk_set_error (error, "read from stream with no file-descriptor"); return DSK_IO_RESULT_ERROR; } rv = dsk_buffer_readv (read_buffer, stream->fd); if (rv < 0) { if (errno == EINTR || errno == EAGAIN) return DSK_IO_RESULT_AGAIN; dsk_set_error (error, "error reading data from fd %u: %s", stream->fd, strerror (errno)); return DSK_IO_RESULT_ERROR; } if (rv == 0) return DSK_IO_RESULT_EOF; ping_idle_disconnect_timer (stream); return DSK_IO_RESULT_SUCCESS; }