diff options
author | Nick Mathewson <nickm@torproject.org> | 2017-04-27 10:00:41 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2017-05-02 08:31:32 -0400 |
commit | 1bc21111d82579b6472357d43f07a85142b6614a (patch) | |
tree | 5a88e50435ae01a87947535267e9a0d80b25cb44 /src/common/compress_none.c | |
parent | 49deb1e1b810e348bfa9fb27a0f0ef54f3694cc9 (diff) | |
download | tor-1bc21111d82579b6472357d43f07a85142b6614a.tar.gz tor-1bc21111d82579b6472357d43f07a85142b6614a.zip |
Treat the identity transformation as another kind of compression.
This will allow us to treat NO_METHOD as a real compression method,
and to simplify code that currently does
if (compressing) {
compress
} else {
copy
}
Diffstat (limited to 'src/common/compress_none.c')
-rw-r--r-- | src/common/compress_none.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/common/compress_none.c b/src/common/compress_none.c new file mode 100644 index 0000000000..b76e6010ec --- /dev/null +++ b/src/common/compress_none.c @@ -0,0 +1,53 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.c + * \brief Compression backend for identity compression. + * + * We actually define this backend so that we can treat the identity transform + * as another case of compression. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_none.h" + +/** Transfer some bytes using the identity transformation. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_cnone_compress_process(char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + size_t n_to_copy = MIN(*in_len, *out_len); + + memcpy(*out, *in, n_to_copy); + *out += n_to_copy; + *in += n_to_copy; + *out_len -= n_to_copy; + *in_len -= n_to_copy; + if (*in_len == 0) { + return finish ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK; + } else { + return TOR_COMPRESS_BUFFER_FULL; + } +} + |