tor  master
buffers.h
Go to the documentation of this file.
1 /* Copyright (c) 2001 Matej Pfajfar.
2  * Copyright (c) 2001-2004, Roger Dingledine.
3  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4  * Copyright (c) 2007-2017, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
6 
12 #ifndef TOR_BUFFERS_H
13 #define TOR_BUFFERS_H
14 
15 #include "compat.h"
16 #include "torint.h"
17 #include "testsupport.h"
18 
19 typedef struct buf_t buf_t;
20 
22 
23 buf_t *buf_new(void);
24 buf_t *buf_new_with_capacity(size_t size);
25 size_t buf_get_default_chunk_size(const buf_t *buf);
26 void buf_free_(buf_t *buf);
27 #define buf_free(b) FREE_AND_NULL(buf_t, buf_free_, (b))
28 void buf_clear(buf_t *buf);
29 buf_t *buf_copy(const buf_t *buf);
30 
31 MOCK_DECL(size_t, buf_datalen, (const buf_t *buf));
32 size_t buf_allocation(const buf_t *buf);
33 size_t buf_slack(const buf_t *buf);
34 
35 uint32_t buf_get_oldest_chunk_timestamp(const buf_t *buf, uint32_t now);
36 size_t buf_get_total_allocation(void);
37 
38 int buf_read_from_socket(buf_t *buf, tor_socket_t s, size_t at_most,
39  int *reached_eof,
40  int *socket_error);
41 
42 int buf_flush_to_socket(buf_t *buf, tor_socket_t s, size_t sz,
43  size_t *buf_flushlen);
44 
45 int buf_add(buf_t *buf, const char *string, size_t string_len);
46 void buf_add_string(buf_t *buf, const char *string);
47 void buf_add_printf(buf_t *buf, const char *format, ...)
48  CHECK_PRINTF(2, 3);
49 void buf_add_vprintf(buf_t *buf, const char *format, va_list args)
50  CHECK_PRINTF(2, 0);
51 int buf_add_compress(buf_t *buf, struct tor_compress_state_t *state,
52  const char *data, size_t data_len, int done);
53 int buf_move_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen);
54 void buf_move_all(buf_t *buf_out, buf_t *buf_in);
55 void buf_peek(const buf_t *buf, char *string, size_t string_len);
56 void buf_drain(buf_t *buf, size_t n);
57 int buf_get_bytes(buf_t *buf, char *string, size_t string_len);
58 int buf_get_line(buf_t *buf, char *data_out, size_t *data_len);
59 
60 #define PEEK_BUF_STARTSWITH_MAX 16
61 int buf_peek_startswith(const buf_t *buf, const char *cmd);
62 
63 int buf_set_to_copy(buf_t **output,
64  const buf_t *input);
65 
66 void buf_assert_ok(buf_t *buf);
67 
68 int buf_find_string_offset(const buf_t *buf, const char *s, size_t n);
69 void buf_pullup(buf_t *buf, size_t bytes,
70  const char **head_out, size_t *len_out);
71 char *buf_extract(buf_t *buf, size_t *sz_out);
72 
73 #ifdef BUFFERS_PRIVATE
74 #ifdef TOR_UNIT_TESTS
75 buf_t *buf_new_with_data(const char *cp, size_t sz);
76 #endif
77 size_t buf_preferred_chunk_size(size_t target);
78 
79 #define DEBUG_CHUNK_ALLOC
80 
81 typedef struct chunk_t {
82  struct chunk_t *next;
83  size_t datalen;
84  size_t memlen;
85 #ifdef DEBUG_CHUNK_ALLOC
86  size_t DBG_alloc;
87 #endif
88  char *data;
89  uint32_t inserted_time;
90  char mem[FLEXIBLE_ARRAY_MEMBER];
92 } chunk_t;
93 
95 #define BUFFER_MAGIC 0xB0FFF312u
96 
97 struct buf_t {
98  uint32_t magic;
100  size_t datalen;
101  size_t default_chunk_size;
103  chunk_t *head;
104  chunk_t *tail;
105 };
106 
107 chunk_t *buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped);
110 #define MIN_READ_LEN 8
111 
114 static inline size_t
115 CHUNK_REMAINING_CAPACITY(const chunk_t *chunk)
116 {
117  return (chunk->mem + chunk->memlen) - (chunk->data + chunk->datalen);
118 }
119 
122 static inline char *
123 CHUNK_WRITE_PTR(chunk_t *chunk)
124 {
125  return chunk->data + chunk->datalen;
126 }
127 
128 #endif /* defined(BUFFERS_PRIVATE) */
129 
130 #endif /* !defined(TOR_BUFFERS_H) */
131 
void buf_clear(buf_t *buf)
Definition: buffers.c:369
size_t buf_slack(const buf_t *buf)
Definition: buffers.c:402
chunk_t * buf_add_chunk_with_capacity(buf_t *buf, size_t capacity, int capped)
Definition: buffers.c:463
buf_t * buf_new(void)
Definition: buffers.c:353
void buf_peek(const buf_t *buf, char *string, size_t string_len)
Definition: buffers.c:768
MOCK_DECL(int, router_have_minimum_dir_info,(void))
Header file to define uint32_t and friends.
int buf_move_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen)
Definition: buffers.c:815
void buf_free_(buf_t *buf)
Definition: buffers.c:412
Definition: compress.c:459
int buf_flush_to_socket(buf_t *buf, tor_socket_t s, size_t sz, size_t *buf_flushlen)
Definition: buffers.c:641
void buf_drain(buf_t *buf, size_t n)
Definition: buffers.c:318
buf_t * buf_new_with_capacity(size_t size)
Definition: buffers.c:344
void buf_add_vprintf(buf_t *buf, const char *format, va_list args)
Definition: buffers.c:737
int buf_peek_startswith(const buf_t *buf, const char *cmd)
Definition: buffers.c:979
void void int buf_add_compress(buf_t *buf, struct tor_compress_state_t *state, const char *data, size_t data_len, int done)
Definition: buffers.c:1045
buf_t * buf_copy(const buf_t *buf)
Definition: buffers.c:441
void buf_move_all(buf_t *buf_out, buf_t *buf_in)
Definition: buffers.c:848
int buf_get_line(buf_t *buf, char *data_out, size_t *data_len)
Definition: buffers.c:1018
void buf_pullup(buf_t *buf, size_t bytes, const char **head_out, size_t *len_out)
Definition: buffers.c:199
void buf_add_string(buf_t *buf, const char *string)
Definition: buffers.c:720
int buf_find_string_offset(const buf_t *buf, const char *s, size_t n)
Definition: buffers.c:960
int buf_add(buf_t *buf, const char *string, size_t string_len)
Definition: buffers.c:686
uint32_t buf_get_oldest_chunk_timestamp(const buf_t *buf, uint32_t now)
Definition: buffers.c:494
void buf_add_printf(buf_t *buf, const char *format,...)
Definition: buffers.c:727
int buf_get_bytes(buf_t *buf, char *string, size_t string_len)
Definition: buffers.c:795
char * buf_extract(buf_t *buf, size_t *sz_out)
Definition: buffers.c:750
size_t buf_allocation(const buf_t *buf)
Definition: buffers.c:389
int buf_read_from_socket(buf_t *buf, tor_socket_t s, size_t at_most, int *reached_eof, int *socket_error)
Definition: buffers.c:554
void buf_assert_ok(buf_t *buf)
Definition: buffers.c:1113
int buf_set_to_copy(buf_t **output, const buf_t *input)
Definition: buffers.c:1101
size_t buf_preferred_chunk_size(size_t target)
Definition: buffers.c:177