Пример #1
0
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);
}
Пример #2
0
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;
}