Coverage Report

Created: 2026-08-08 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib/istream-data.c
Line
Count
Source
1
/* Copyright (c) Dovecot authors, see top-level COPYING file */
2
3
#include "lib.h"
4
#include "istream-private.h"
5
6
static ssize_t i_stream_data_read(struct istream_private *stream)
7
0
{
8
0
  stream->istream.eof = TRUE;
9
0
  return -1;
10
0
}
11
12
static void i_stream_data_seek(struct istream_private *stream, uoff_t v_offset,
13
             bool mark ATTR_UNUSED)
14
0
{
15
0
  stream->skip = v_offset;
16
0
  stream->istream.v_offset = v_offset;
17
0
}
18
19
struct istream *i_stream_create_from_data(const void *data, size_t size)
20
0
{
21
0
  struct istream_private *stream;
22
23
0
  stream = i_new(struct istream_private, 1);
24
0
  stream->buffer = data;
25
0
  stream->pos = size;
26
0
  stream->max_buffer_size = SIZE_MAX;
27
28
0
  stream->read = i_stream_data_read;
29
0
  stream->seek = i_stream_data_seek;
30
31
0
  stream->istream.readable_fd = FALSE;
32
0
  stream->istream.blocking = TRUE;
33
0
  stream->istream.seekable = TRUE;
34
0
  i_stream_create(stream, NULL, -1,
35
0
      ISTREAM_HIDDEN_INPUTS_NONE, ISTREAM_CREATE_FLAG_NOOP_SNAPSHOT);
36
0
  stream->statbuf.st_size = size;
37
0
  i_stream_set_name(&stream->istream, "(buffer)");
38
0
  return &stream->istream;
39
0
}
40
41
static void i_stream_copied_data_free(void *data)
42
0
{
43
0
  i_free(data);
44
0
}
45
struct istream *
46
i_stream_create_copy_from_data(const void *data, size_t size)
47
0
{
48
0
  struct istream *stream;
49
0
  void *buffer;
50
51
0
  if (size == 0) {
52
0
    buffer = "";
53
0
  } else {
54
0
    buffer = i_malloc(size);
55
0
    memcpy(buffer, data, size);
56
0
  }
57
0
  stream = i_stream_create_from_data(buffer, size);
58
0
  if (size > 0) {
59
0
    i_stream_add_destroy_callback
60
0
      (stream, i_stream_copied_data_free, buffer);
61
0
  }
62
0
  return stream;
63
0
}