#include "postgres.h"#include "px.h"#include "mbuf.h"
Go to the source code of this file.
Data Structures | |
| struct | MBuf |
| struct | PullFilter |
| struct | PushFilter |
Defines | |
| #define | STEP (16*1024) |
Functions | |
| int | mbuf_avail (MBuf *mbuf) |
| int | mbuf_size (MBuf *mbuf) |
| int | mbuf_tell (MBuf *mbuf) |
| int | mbuf_free (MBuf *mbuf) |
| static void | prepare_room (MBuf *mbuf, int block_len) |
| int | mbuf_append (MBuf *dst, const uint8 *buf, int len) |
| MBuf * | mbuf_create (int len) |
| MBuf * | mbuf_create_from_data (uint8 *data, int len) |
| int | mbuf_grab (MBuf *mbuf, int len, uint8 **data_p) |
| int | mbuf_rewind (MBuf *mbuf) |
| int | mbuf_steal_data (MBuf *mbuf, uint8 **data_p) |
| int | pullf_create (PullFilter **pf_p, const PullFilterOps *op, void *init_arg, PullFilter *src) |
| void | pullf_free (PullFilter *pf) |
| int | pullf_read (PullFilter *pf, int len, uint8 **data_p) |
| int | pullf_read_max (PullFilter *pf, int len, uint8 **data_p, uint8 *tmpbuf) |
| int | pullf_read_fixed (PullFilter *src, int len, uint8 *dst) |
| static int | pull_from_mbuf (void *arg, PullFilter *src, int len, uint8 **data_p, uint8 *buf, int buflen) |
| int | pullf_create_mbuf_reader (PullFilter **mp_p, MBuf *src) |
| int | pushf_create (PushFilter **mp_p, const PushFilterOps *op, void *init_arg, PushFilter *next) |
| void | pushf_free (PushFilter *mp) |
| void | pushf_free_all (PushFilter *mp) |
| static int | wrap_process (PushFilter *mp, const uint8 *data, int len) |
| int | pushf_write (PushFilter *mp, const uint8 *data, int len) |
| int | pushf_flush (PushFilter *mp) |
| static int | push_into_mbuf (PushFilter *next, void *arg, const uint8 *data, int len) |
| int | pushf_create_mbuf_writer (PushFilter **res, MBuf *dst) |
Variables | |
| static struct PullFilterOps | mbuf_reader |
| static struct PushFilterOps | mbuf_filter |
| #define STEP (16*1024) |
Definition at line 37 of file mbuf.c.
Referenced by prepare_room().
Definition at line 102 of file mbuf.c.
References MBuf::data_end, MBuf::no_write, prepare_room(), and px_debug().
Referenced by copy_crlf(), decrypt_internal(), encrypt_internal(), parse_literal_data(), and push_into_mbuf().
| int mbuf_avail | ( | MBuf * | mbuf | ) |
Definition at line 50 of file mbuf.c.
References MBuf::data_end, and MBuf::read_pos.
Referenced by mbuf_grab(), and pgp_encrypt().
| MBuf* mbuf_create | ( | int | len | ) |
Definition at line 119 of file mbuf.c.
References MBuf::buf_end, MBuf::data, MBuf::data_end, MBuf::no_write, MBuf::own_data, px_alloc, and MBuf::read_pos.
Referenced by decrypt_internal(), and encrypt_internal().
Definition at line 139 of file mbuf.c.
References MBuf::buf_end, MBuf::data, MBuf::data_end, MBuf::no_write, MBuf::own_data, px_alloc, and MBuf::read_pos.
Referenced by create_mbuf_from_vardata(), and decrypt_internal().
| int mbuf_free | ( | MBuf * | mbuf | ) |
Definition at line 68 of file mbuf.c.
References MBuf::buf_end, MBuf::data, MBuf::own_data, and px_free.
Referenced by decrypt_internal(), encrypt_internal(), and pgp_key_id_w().
Definition at line 157 of file mbuf.c.
References mbuf_avail(), MBuf::no_write, and MBuf::read_pos.
Referenced by pgp_encrypt(), and pull_from_mbuf().
{
if (len > mbuf_avail(mbuf))
len = mbuf_avail(mbuf);
mbuf->no_write = true;
*data_p = mbuf->read_pos;
mbuf->read_pos += len;
return len;
}
| int mbuf_rewind | ( | MBuf * | mbuf | ) |
Definition at line 170 of file mbuf.c.
References MBuf::data, and MBuf::read_pos.
| int mbuf_size | ( | MBuf * | mbuf | ) |
Definition at line 56 of file mbuf.c.
References MBuf::data, and MBuf::data_end.
Referenced by mbuf_steal_data().
Definition at line 177 of file mbuf.c.
References MBuf::buf_end, MBuf::data, MBuf::data_end, mbuf_size(), MBuf::no_write, MBuf::own_data, and MBuf::read_pos.
Referenced by decrypt_internal(), and encrypt_internal().
| int mbuf_tell | ( | MBuf * | mbuf | ) |
Definition at line 62 of file mbuf.c.
References MBuf::data, and MBuf::read_pos.
| static void prepare_room | ( | MBuf * | mbuf, | |
| int | block_len | |||
| ) | [static] |
Definition at line 80 of file mbuf.c.
References MBuf::buf_end, MBuf::data, MBuf::data_end, px_realloc, MBuf::read_pos, and STEP.
Referenced by mbuf_append().
{
uint8 *newbuf;
unsigned newlen;
if (mbuf->data_end + block_len <= mbuf->buf_end)
return;
newlen = (mbuf->buf_end - mbuf->data)
+ ((block_len + STEP + STEP - 1) & -STEP);
newbuf = px_realloc(mbuf->data, newlen);
mbuf->buf_end = newbuf + newlen;
mbuf->data_end = newbuf + (mbuf->data_end - mbuf->data);
mbuf->read_pos = newbuf + (mbuf->read_pos - mbuf->data);
mbuf->data = newbuf;
return;
}
| static int pull_from_mbuf | ( | void * | arg, | |
| PullFilter * | src, | |||
| int | len, | |||
| uint8 ** | data_p, | |||
| uint8 * | buf, | |||
| int | buflen | |||
| ) | [static] |
| int pullf_create | ( | PullFilter ** | pf_p, | |
| const PullFilterOps * | op, | |||
| void * | init_arg, | |||
| PullFilter * | src | |||
| ) |
Definition at line 206 of file mbuf.c.
References PullFilter::buf, PullFilter::buflen, PullFilterOps::init, NULL, PullFilter::op, PullFilter::pos, PullFilter::priv, px_alloc, and PullFilter::src.
Referenced by parse_symenc_data(), parse_symenc_mdc_data(), pgp_create_pkt_reader(), process_data_packets(), process_secret_key(), and pullf_create_mbuf_reader().
{
PullFilter *pf;
void *priv;
int res;
if (op->init != NULL)
{
res = op->init(&priv, init_arg, src);
if (res < 0)
return res;
}
else
{
priv = init_arg;
res = 0;
}
pf = px_alloc(sizeof(*pf));
memset(pf, 0, sizeof(*pf));
pf->buflen = res;
pf->op = op;
pf->priv = priv;
pf->src = src;
if (pf->buflen > 0)
{
pf->buf = px_alloc(pf->buflen);
pf->pos = 0;
}
else
{
pf->buf = NULL;
pf->pos = 0;
}
*pf_p = pf;
return 0;
}
| int pullf_create_mbuf_reader | ( | PullFilter ** | mp_p, | |
| MBuf * | src | |||
| ) |
Definition at line 351 of file mbuf.c.
References NULL, and pullf_create().
Referenced by pgp_decrypt(), pgp_get_keyid(), and pgp_set_pubkey().
{
return pullf_create(mp_p, &mbuf_reader, src, NULL);
}
| void pullf_free | ( | PullFilter * | pf | ) |
Definition at line 245 of file mbuf.c.
References PullFilter::buf, PullFilter::buflen, PullFilterOps::free, PullFilter::op, PullFilter::priv, and px_free.
Referenced by internal_read_key(), parse_compressed_data(), parse_symenc_data(), parse_symenc_mdc_data(), pgp_decrypt(), pgp_get_keyid(), pgp_set_pubkey(), process_data_packets(), and process_secret_key().
| int pullf_read | ( | PullFilter * | pf, | |
| int | len, | |||
| uint8 ** | data_p | |||
| ) |
Definition at line 262 of file mbuf.c.
References PullFilter::buf, PullFilter::buflen, PullFilter::op, PullFilter::priv, PullFilterOps::pull, pullf_read(), and PullFilter::src.
Referenced by decrypt_read(), mdc_read(), mdcbuf_refill(), parse_literal_data(), pgp_expect_packet_end(), pgp_parse_pkt_hdr(), pgp_skip_packet(), pktreader_pull(), process_data_packets(), pullf_read(), and pullf_read_max().
| int pullf_read_fixed | ( | PullFilter * | src, | |
| int | len, | |||
| uint8 * | dst | |||
| ) |
Definition at line 316 of file mbuf.c.
References pullf_read_max(), and px_debug().
Referenced by _pgp_read_public_key(), check_key_cksum(), check_key_sha1(), pgp_mpi_read(), pgp_parse_pubenc_sesskey(), pgp_s2k_read(), process_secret_key(), and read_pubenc_keyid().
{
int res;
uint8 *p;
res = pullf_read_max(src, len, &p, dst);
if (res < 0)
return res;
if (res != len)
{
px_debug("pullf_read_fixed: need=%d got=%d", len, res);
return PXE_MBUF_SHORT_READ;
}
if (p != dst)
memcpy(dst, p, len);
return 0;
}
| int pullf_read_max | ( | PullFilter * | pf, | |
| int | len, | |||
| uint8 ** | data_p, | |||
| uint8 * | tmpbuf | |||
| ) |
Definition at line 279 of file mbuf.c.
References pullf_read().
Referenced by mdc_finish(), parse_literal_data(), parse_symenc_sesskey(), prefix_init(), and pullf_read_fixed().
{
int res,
total;
uint8 *tmp;
res = pullf_read(pf, len, data_p);
if (res <= 0 || res == len)
return res;
/* read was shorter, use tmpbuf */
memcpy(tmpbuf, *data_p, res);
*data_p = tmpbuf;
len -= res;
total = res;
while (len > 0)
{
res = pullf_read(pf, len, &tmp);
if (res < 0)
{
/* so the caller must clear only on success */
memset(tmpbuf, 0, total);
return res;
}
if (res == 0)
break;
memcpy(tmpbuf + total, tmp, res);
total += res;
}
return total;
}
| static int push_into_mbuf | ( | PushFilter * | next, | |
| void * | arg, | |||
| const uint8 * | data, | |||
| int | len | |||
| ) | [static] |
Definition at line 545 of file mbuf.c.
References mbuf_append().
{
int res = 0;
MBuf *mbuf = arg;
if (len > 0)
res = mbuf_append(mbuf, data, len);
return res < 0 ? res : 0;
}
| int pushf_create | ( | PushFilter ** | mp_p, | |
| const PushFilterOps * | op, | |||
| void * | init_arg, | |||
| PushFilter * | next | |||
| ) |
Definition at line 372 of file mbuf.c.
References PushFilter::block_size, PushFilter::buf, PushFilterOps::init, PushFilter::next, NULL, PushFilter::op, PushFilter::pos, PushFilter::priv, and px_alloc.
Referenced by init_compress(), init_encdata_packet(), init_litdata_packet(), pgp_create_pkt_writer(), pgp_encrypt(), and pushf_create_mbuf_writer().
{
PushFilter *mp;
void *priv;
int res;
if (op->init != NULL)
{
res = op->init(next, init_arg, &priv);
if (res < 0)
return res;
}
else
{
priv = init_arg;
res = 0;
}
mp = px_alloc(sizeof(*mp));
memset(mp, 0, sizeof(*mp));
mp->block_size = res;
mp->op = op;
mp->priv = priv;
mp->next = next;
if (mp->block_size > 0)
{
mp->buf = px_alloc(mp->block_size);
mp->pos = 0;
}
else
{
mp->buf = NULL;
mp->pos = 0;
}
*mp_p = mp;
return 0;
}
| int pushf_create_mbuf_writer | ( | PushFilter ** | res, | |
| MBuf * | dst | |||
| ) |
Definition at line 560 of file mbuf.c.
References NULL, and pushf_create().
Referenced by pgp_encrypt().
{
return pushf_create(res, &mbuf_filter, dst, NULL);
}
| int pushf_flush | ( | PushFilter * | mp | ) |
Definition at line 515 of file mbuf.c.
References PushFilter::block_size, PushFilter::buf, PushFilterOps::flush, PushFilter::next, PushFilter::op, PushFilter::pos, PushFilter::priv, and wrap_process().
Referenced by pgp_encrypt(), and pgp_write_pubenc_sesskey().
| void pushf_free | ( | PushFilter * | mp | ) |
Definition at line 411 of file mbuf.c.
References PushFilter::block_size, PushFilter::buf, PushFilterOps::free, PushFilter::op, PushFilter::priv, and px_free.
Referenced by init_compress(), init_litdata_packet(), pgp_write_pubenc_sesskey(), and pushf_free_all().
| void pushf_free_all | ( | PushFilter * | mp | ) |
Definition at line 427 of file mbuf.c.
References PushFilter::next, and pushf_free().
Referenced by pgp_encrypt().
{
PushFilter *tmp;
while (mp)
{
tmp = mp->next;
pushf_free(mp);
mp = tmp;
}
}
| int pushf_write | ( | PushFilter * | mp, | |
| const uint8 * | data, | |||
| int | len | |||
| ) |
Definition at line 455 of file mbuf.c.
References PushFilter::block_size, PushFilter::buf, PushFilter::pos, and wrap_process().
Referenced by crlf_process(), encrypt_init(), encrypt_process(), init_compress(), init_litdata_packet(), mdc_flush(), mdc_write(), pgp_encrypt(), pgp_mpi_write(), pgp_write_pubenc_sesskey(), pkt_stream_flush(), pkt_stream_process(), wrap_process(), write_normal_header(), write_prefix(), write_symenc_sesskey(), and write_tag_only().
{
int need,
res;
/*
* no buffering
*/
if (mp->block_size <= 0)
return wrap_process(mp, data, len);
/*
* try to empty buffer
*/
need = mp->block_size - mp->pos;
if (need > 0)
{
if (len < need)
{
memcpy(mp->buf + mp->pos, data, len);
mp->pos += len;
return 0;
}
memcpy(mp->buf + mp->pos, data, need);
len -= need;
data += need;
}
/*
* buffer full, process
*/
res = wrap_process(mp, mp->buf, mp->block_size);
if (res < 0)
return res;
mp->pos = 0;
/*
* now process directly from data
*/
while (len > 0)
{
if (len > mp->block_size)
{
res = wrap_process(mp, data, mp->block_size);
if (res < 0)
return res;
data += mp->block_size;
len -= mp->block_size;
}
else
{
memcpy(mp->buf, data, len);
mp->pos += len;
break;
}
}
return 0;
}
| static int wrap_process | ( | PushFilter * | mp, | |
| const uint8 * | data, | |||
| int | len | |||
| ) | [static] |
Definition at line 440 of file mbuf.c.
References PushFilter::next, NULL, PushFilter::op, PushFilter::priv, PushFilterOps::push, and pushf_write().
Referenced by pushf_flush(), and pushf_write().
struct PushFilterOps mbuf_filter [static] |
struct PullFilterOps mbuf_reader [static] |
1.7.1