123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /*
- Copyright (c) 2007 - 2010 RIPE NCC - All Rights Reserved
-
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted, provided
- that the above copyright notice appear in all copies and that both that
- copyright notice and this permission notice appear in supporting
- documentation, and that the name of the author not be used in advertising or
- publicity pertaining to distribution of the software without specific,
- written prior permission.
-
- THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
- AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
- DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
- Parts of this code have been engineered after analiyzing GNU Zebra's
- source code and therefore might contain declarations/code from GNU
- Zebra, Copyright (C) 1999 Kunihiro Ishiguro. Zebra is a free routing
- software, distributed under the GNU General Public License. A copy of
- this license is included with libbgpdump.
- Original Author: Dan Ardelean (dan@ripe.net)
- */
- #include "bgpdump-config.h"
- #include "bgpdump_mstream.h"
- #include <stdio.h>
- #include <string.h>
- #include <netinet/in.h>
- void mstream_init(struct mstream *s, u_char *buffer, u_int32_t len) {
- s->start=buffer;
- s->position=0;
- s->len=len;
- }
- u_char mstream_getc(struct mstream *s, u_char *d) {
- u_char data;
- mstream_get(s, &data, sizeof(data));
- if(d!=NULL) memcpy(d,&data,sizeof(data));
- return data;
- }
- u_int16_t mstream_getw(struct mstream *s, u_int16_t *d) {
- u_int16_t data;
- mstream_get(s, &data, sizeof(data));
- data=ntohs(data);
- if(d!=NULL) memcpy(d,&data,sizeof(data));
- return data;
- }
- u_int32_t mstream_getl(struct mstream *s, u_int32_t *d) {
- u_int32_t data;
- mstream_get(s, &data, sizeof(data));
- data=ntohl(data);
- if(d!=NULL) memcpy(d,&data,sizeof(data));
- return data;
- }
- struct in_addr mstream_get_ipv4(struct mstream *s) {
- struct in_addr addr;
- mstream_get(s, &addr.s_addr, 4);
- return addr;
- }
- u_int32_t mstream_can_read(struct mstream *s) {
- return s->len - s->position;
- }
- // construct a partial mstream
- mstream_t mstream_copy(mstream_t *s, int len) {
- mstream_t copy = {0};
- copy.start = s->start + s->position;
- copy.len = mstream_get(s, NULL, len);
- return copy;
- }
- u_int32_t mstream_get (struct mstream *s, void *d, u_int32_t len) {
- int room = mstream_can_read(s);
- if(room >= len) {
- if(d) memcpy(d, s->start + s->position, len);
- s->position += len;
- return len;
- } else {
- /* Reading past end of buffer!
- Zero out extra bytes and set position to end of buffer */
- if(d) {
- memcpy(d, s->start + s->position, room);
- memset((char *)d + room, 0, len - room);
- }
- s->position = s->len;
- return room;
- }
- }
|