/* 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_none.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
* *in_len bytes from *in, and write up to *out_len bytes
* to *out, adjusting the values as we go. If finish 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 out.
* 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;
}
}