Tor
0.4.7.0-alpha-dev
|
Implements a generic buffer interface. More...
#include "orconfig.h"
#include <stddef.h>
#include "lib/buf/buffers.h"
#include "lib/cc/torint.h"
#include "lib/log/log.h"
#include "lib/log/util_bug.h"
#include "lib/ctime/di_ops.h"
#include "lib/malloc/malloc.h"
#include "lib/string/printf.h"
#include "lib/time/compat_time.h"
#include <stdlib.h>
#include <string.h>
Go to the source code of this file.
Data Structures | |
struct | buf_pos_t |
Macros | |
#define | BUFFERS_PRIVATE |
#define | check() STMT_NIL |
#define | CHUNK_HEADER_LEN offsetof(chunk_t, mem[0]) |
#define | SENTINEL_LEN 4 |
#define | CHUNK_OVERHEAD (CHUNK_HEADER_LEN + SENTINEL_LEN) |
#define | CHUNK_ALLOC_SIZE(memlen) (CHUNK_OVERHEAD + (memlen)) |
#define | CHUNK_SIZE_WITH_ALLOC(memlen) ((memlen) - CHUNK_OVERHEAD) |
#define | DEBUG_SENTINEL |
#define | DBG_S(s) s |
#define | CHUNK_SET_SENTINEL(chunk, alloclen) |
#define | MIN_CHUNK_ALLOC 256 |
#define | MAX_CHUNK_ALLOC 65536 |
Functions | |
static void | chunk_repack (chunk_t *chunk) |
static void | buf_chunk_free_unchecked (chunk_t *chunk) |
static chunk_t * | chunk_new_with_alloc_size (size_t alloc) |
static chunk_t * | chunk_grow (chunk_t *chunk, size_t sz) |
size_t | buf_preferred_chunk_size (size_t target) |
void | buf_pullup (buf_t *buf, size_t bytes, const char **head_out, size_t *len_out) |
void | buf_drain (buf_t *buf, size_t n) |
buf_t * | buf_new_with_capacity (size_t size) |
buf_t * | buf_new (void) |
size_t | buf_get_default_chunk_size (const buf_t *buf) |
void | buf_clear (buf_t *buf) |
size_t | buf_datalen (const buf_t *buf) |
size_t | buf_allocation (const buf_t *buf) |
size_t | buf_slack (const buf_t *buf) |
void | buf_free_ (buf_t *buf) |
static chunk_t * | chunk_copy (const chunk_t *in_chunk) |
buf_t * | buf_copy (const buf_t *buf) |
chunk_t * | buf_add_chunk_with_capacity (buf_t *buf, size_t capacity, int capped) |
uint32_t | buf_get_oldest_chunk_timestamp (const buf_t *buf, uint32_t now) |
size_t | buf_get_total_allocation (void) |
int | buf_add (buf_t *buf, const char *string, size_t string_len) |
void | buf_add_string (buf_t *buf, const char *string) |
void | buf_add_printf (buf_t *buf, const char *format,...) |
void | buf_add_vprintf (buf_t *buf, const char *format, va_list args) |
char * | buf_extract (buf_t *buf, size_t *sz_out) |
void | buf_peek (const buf_t *buf, char *string, size_t string_len) |
int | buf_get_bytes (buf_t *buf, char *string, size_t string_len) |
int | buf_move_to_buf (buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen) |
size_t | buf_move_all (buf_t *buf_out, buf_t *buf_in) |
static void | buf_pos_init (const buf_t *buf, buf_pos_t *out) |
static ptrdiff_t | buf_find_pos_of_char (char ch, buf_pos_t *out) |
static int | buf_pos_inc (buf_pos_t *pos) |
static int | buf_matches_at_pos (const buf_pos_t *pos, const char *s, size_t n) |
int | buf_find_string_offset (const buf_t *buf, const char *s, size_t n) |
int | buf_peek_startswith (const buf_t *buf, const char *cmd) |
static ptrdiff_t | buf_find_offset_of_char (buf_t *buf, char ch) |
int | buf_get_line (buf_t *buf, char *data_out, size_t *data_len) |
int | buf_set_to_copy (buf_t **output, const buf_t *input) |
void | buf_assert_ok (buf_t *buf) |
Variables | |
static size_t | total_bytes_allocated_in_chunks = 0 |
Implements a generic buffer interface.
A buf_t is a (fairly) opaque byte-oriented FIFO that can read to or flush from memory, sockets, file descriptors, TLS connections, or another buf_t. Buffers are implemented as linked lists of memory chunks.
All socket-backed and TLS-based connection_t objects have a pair of buffers: one for incoming data, and one for outcoming data. These are fed and drained from functions in connection.c, triggered by events that are monitored in main.c.
This module only handles the buffer implementation itself. To use a buffer with the network, a compressor, or a TLS connection, see the other buffer_* modules.
Definition in file buffers.c.
#define CHUNK_ALLOC_SIZE | ( | memlen | ) | (CHUNK_OVERHEAD + (memlen)) |
#define CHUNK_SET_SENTINEL | ( | chunk, | |
alloclen | |||
) |
#define CHUNK_SIZE_WITH_ALLOC | ( | memlen | ) | ((memlen) - CHUNK_OVERHEAD) |
#define MAX_CHUNK_ALLOC 65536 |
#define MIN_CHUNK_ALLOC 256 |
int buf_add | ( | buf_t * | buf, |
const char * | string, | ||
size_t | string_len | ||
) |
Append string_len bytes from string to the end of buf.
Return the new length of the buffer on success, -1 on failure.
Definition at line 527 of file buffers.c.
Referenced by buf_add_string(), buf_add_vprintf(), connection_write_to_buf_impl_(), and process_write().
chunk_t* buf_add_chunk_with_capacity | ( | buf_t * | buf, |
size_t | capacity, | ||
int | capped | ||
) |
Append a new chunk with enough capacity to hold capacity bytes to the tail of buf. If capped, don't allocate a chunk bigger than MAX_CHUNK_ALLOC.
Definition at line 475 of file buffers.c.
Referenced by buf_add_compress().
void buf_add_printf | ( | buf_t * | buf, |
const char * | format, | ||
... | |||
) |
As tor_snprintf, but write the results into a buf_t
Definition at line 568 of file buffers.c.
Referenced by prometheus_format_store_entry().
void buf_add_string | ( | buf_t * | buf, |
const char * | string | ||
) |
void buf_add_vprintf | ( | buf_t * | buf, |
const char * | format, | ||
va_list | args | ||
) |
As tor_vsnprintf, but write the results into a buf_t.
Definition at line 578 of file buffers.c.
Referenced by buf_add_printf().
size_t buf_allocation | ( | const buf_t * | buf | ) |
void buf_assert_ok | ( | buf_t * | buf | ) |
void buf_clear | ( | buf_t * | buf | ) |
Remove all data from buf.
Definition at line 381 of file buffers.c.
Referenced by buf_free_(), and fetch_from_buf_socks_client().
buf_t* buf_copy | ( | const buf_t * | buf | ) |
size_t buf_datalen | ( | const buf_t * | buf | ) |
Return the number of bytes stored in buf
Definition at line 394 of file buffers.c.
Referenced by buf_extract(), buf_move_all(), connection_bucket_write_limit(), connection_buf_add_buf(), connection_buf_read_from_socket(), connection_handle_read_impl(), connection_should_read_from_linked_conn(), fetch_ext_or_command_from_buf(), fetch_from_buf_http(), fetch_from_buf_socks(), fetch_from_buf_socks_client(), peek_buf_has_control0_command(), and process_unix_write().
void buf_drain | ( | buf_t * | buf, |
size_t | n | ||
) |
Remove the first n bytes from buf.
Definition at line 330 of file buffers.c.
Referenced by fetch_ext_or_command_from_buf(), fetch_from_buf_socks_client(), and flush_chunk_tls().
char* buf_extract | ( | buf_t * | buf, |
size_t * | sz_out | ||
) |
Return a heap-allocated string containing the contents of buf, plus a NUL byte. If sz_out is provided, set *sz_out to the length of the returned string, not including the terminating NUL.
Definition at line 592 of file buffers.c.
Referenced by bwhist_get_bandwidth_lines().
|
static |
Return the index within buf at which ch first appears, or -1 if ch does not appear on buf.
Definition at line 851 of file buffers.c.
Referenced by buf_get_line().
|
static |
Advance out to the first appearance of ch at the current position of out, or later. Return -1 if no instances are found; otherwise returns the absolute position of the character.
Definition at line 741 of file buffers.c.
Referenced by buf_find_string_offset().
int buf_find_string_offset | ( | const buf_t * | buf, |
const char * | s, | ||
size_t | n | ||
) |
Return the first position in buf at which the n-character string s occurs, or -1 if it does not occur.
Definition at line 815 of file buffers.c.
Referenced by fetch_from_buf_http().
void buf_free_ | ( | buf_t * | buf | ) |
int buf_get_bytes | ( | buf_t * | buf, |
char * | string, | ||
size_t | string_len | ||
) |
Remove string_len bytes from the front of buf, and store them into string. Return the new buffer size. string_len must be <= the number of bytes on the buffer.
Definition at line 637 of file buffers.c.
Referenced by buf_get_line(), connection_buf_get_bytes(), and fetch_ext_or_command_from_buf().
int buf_get_line | ( | buf_t * | buf, |
char * | data_out, | ||
size_t * | data_len | ||
) |
Try to read a single LF-terminated line from buf, and write it (including the LF), NUL-terminated, into the *data_len byte buffer at data_out. Set *data_len to the number of bytes in the line, not counting the terminating NUL. Return 1 if we read a whole line, return 0 if we don't have a whole line yet, and return -1 if the line length exceeds *data_len.
Definition at line 874 of file buffers.c.
Referenced by connection_buf_get_line().
uint32_t buf_get_oldest_chunk_timestamp | ( | const buf_t * | buf, |
uint32_t | now | ||
) |
Return the age of the oldest chunk in the buffer buf, in timestamp units. Requires the current monotonic timestamp as its input now.
Definition at line 506 of file buffers.c.
Referenced by conn_get_buffer_age().
|
static |
Return true iff the n-character string in s appears (verbatim) at pos.
Definition at line 789 of file buffers.c.
Referenced by buf_find_string_offset().
size_t buf_move_all | ( | buf_t * | buf_out, |
buf_t * | buf_in | ||
) |
Moves all data from buf_in to buf_out, without copying. Return the number of bytes that were moved.
Definition at line 691 of file buffers.c.
Referenced by connection_buf_add_buf().
int buf_move_to_buf | ( | buf_t * | buf_out, |
buf_t * | buf_in, | ||
size_t * | buf_flushlen | ||
) |
buf_t* buf_new | ( | void | ) |
Allocate and return a new buffer with default capacity.
Definition at line 365 of file buffers.c.
Referenced by buf_copy(), buf_new_with_capacity(), bwhist_get_bandwidth_lines(), and metrics_get_output().
buf_t* buf_new_with_capacity | ( | size_t | size | ) |
void buf_peek | ( | const buf_t * | buf, |
char * | string, | ||
size_t | string_len | ||
) |
Helper: copy the first string_len bytes from buf onto string.
Definition at line 610 of file buffers.c.
Referenced by fetch_ext_or_command_from_buf(), and peek_buf_has_control0_command().
int buf_peek_startswith | ( | const buf_t * | buf, |
const char * | cmd | ||
) |
Return 1 iff buf starts with cmd. cmd must be a null terminated string, of no more than PEEK_BUF_STARTSWITH_MAX bytes.
Definition at line 834 of file buffers.c.
Referenced by peek_buf_has_http_command().
|
inlinestatic |
Advance pos by a single character, if there are any more characters in the buffer. Returns 0 on success, -1 on failure.
Definition at line 772 of file buffers.c.
Referenced by buf_find_string_offset(), and buf_matches_at_pos().
|
static |
Initialize out to point to the first character of buf.
Definition at line 730 of file buffers.c.
Referenced by buf_find_string_offset().
size_t buf_preferred_chunk_size | ( | size_t | target | ) |
Return the allocation size we'd like to use to hold target bytes.
Definition at line 189 of file buffers.c.
Referenced by buf_new_with_capacity().
void buf_pullup | ( | buf_t * | buf, |
size_t | bytes, | ||
const char ** | head_out, | ||
size_t * | len_out | ||
) |
Collapse data from the first N chunks from buf into buf->head, growing it as necessary, until buf->head has the first bytes bytes of data from the buffer, or until buf->head has all the data in buf.
Set *head_out to point to the first byte of available data, and *len_out to the number of bytes of data available at *head_out. Note that *len_out may be more or less than bytes, depending on the number of bytes available.
Definition at line 211 of file buffers.c.
Referenced by fetch_from_buf_socks_client().
int buf_set_to_copy | ( | buf_t ** | output, |
const buf_t * | input | ||
) |
size_t buf_slack | ( | const buf_t * | buf | ) |
Return the number of bytes that can be added to buf without performing any additional allocation.
Definition at line 414 of file buffers.c.
Referenced by connection_buf_read_from_socket().
|
static |
|
inlinestatic |
|
inlinestatic |