1/* $NetBSD: tag.h,v 1.1.1.3 2017/01/31 21:14:53 christos Exp $ */ 2/* 3 * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu> 4 * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28#ifndef EVENT2_TAG_H_INCLUDED_ 29#define EVENT2_TAG_H_INCLUDED_ 30 31/** @file event2/tag.h 32 33 Helper functions for reading and writing tagged data onto buffers. 34 35 */ 36 37#include <event2/visibility.h> 38 39#ifdef __cplusplus 40extern "C" { 41#endif 42 43#include <event2/event-config.h> 44#ifdef EVENT__HAVE_SYS_TYPES_H 45#include <sys/types.h> 46#endif 47#ifdef EVENT__HAVE_SYS_TIME_H 48#include <sys/time.h> 49#endif 50 51/* For int types. */ 52#include <event2/util.h> 53 54struct evbuffer; 55 56/* 57 * Marshaling tagged data - We assume that all tags are inserted in their 58 * numeric order - so that unknown tags will always be higher than the 59 * known ones - and we can just ignore the end of an event buffer. 60 */ 61 62EVENT2_EXPORT_SYMBOL 63void evtag_init(void); 64 65/** 66 Unmarshals the header and returns the length of the payload 67 68 @param evbuf the buffer from which to unmarshal data 69 @param ptag a pointer in which the tag id is being stored 70 @returns -1 on failure or the number of bytes in the remaining payload. 71*/ 72EVENT2_EXPORT_SYMBOL 73int evtag_unmarshal_header(struct evbuffer *evbuf, ev_uint32_t *ptag); 74 75EVENT2_EXPORT_SYMBOL 76void evtag_marshal(struct evbuffer *evbuf, ev_uint32_t tag, const void *data, 77 ev_uint32_t len); 78EVENT2_EXPORT_SYMBOL 79void evtag_marshal_buffer(struct evbuffer *evbuf, ev_uint32_t tag, 80 struct evbuffer *data); 81 82/** 83 Encode an integer and store it in an evbuffer. 84 85 We encode integers by nybbles; the first nibble contains the number 86 of significant nibbles - 1; this allows us to encode up to 64-bit 87 integers. This function is byte-order independent. 88 89 @param evbuf evbuffer to store the encoded number 90 @param number a 32-bit integer 91 */ 92EVENT2_EXPORT_SYMBOL 93void evtag_encode_int(struct evbuffer *evbuf, ev_uint32_t number); 94EVENT2_EXPORT_SYMBOL 95void evtag_encode_int64(struct evbuffer *evbuf, ev_uint64_t number); 96 97EVENT2_EXPORT_SYMBOL 98void evtag_marshal_int(struct evbuffer *evbuf, ev_uint32_t tag, 99 ev_uint32_t integer); 100EVENT2_EXPORT_SYMBOL 101void evtag_marshal_int64(struct evbuffer *evbuf, ev_uint32_t tag, 102 ev_uint64_t integer); 103 104EVENT2_EXPORT_SYMBOL 105void evtag_marshal_string(struct evbuffer *buf, ev_uint32_t tag, 106 const char *string); 107 108EVENT2_EXPORT_SYMBOL 109void evtag_marshal_timeval(struct evbuffer *evbuf, ev_uint32_t tag, 110 struct timeval *tv); 111 112EVENT2_EXPORT_SYMBOL 113int evtag_unmarshal(struct evbuffer *src, ev_uint32_t *ptag, 114 struct evbuffer *dst); 115EVENT2_EXPORT_SYMBOL 116int evtag_peek(struct evbuffer *evbuf, ev_uint32_t *ptag); 117EVENT2_EXPORT_SYMBOL 118int evtag_peek_length(struct evbuffer *evbuf, ev_uint32_t *plength); 119EVENT2_EXPORT_SYMBOL 120int evtag_payload_length(struct evbuffer *evbuf, ev_uint32_t *plength); 121EVENT2_EXPORT_SYMBOL 122int evtag_consume(struct evbuffer *evbuf); 123 124EVENT2_EXPORT_SYMBOL 125int evtag_unmarshal_int(struct evbuffer *evbuf, ev_uint32_t need_tag, 126 ev_uint32_t *pinteger); 127EVENT2_EXPORT_SYMBOL 128int evtag_unmarshal_int64(struct evbuffer *evbuf, ev_uint32_t need_tag, 129 ev_uint64_t *pinteger); 130 131EVENT2_EXPORT_SYMBOL 132int evtag_unmarshal_fixed(struct evbuffer *src, ev_uint32_t need_tag, 133 void *data, size_t len); 134 135EVENT2_EXPORT_SYMBOL 136int evtag_unmarshal_string(struct evbuffer *evbuf, ev_uint32_t need_tag, 137 char **pstring); 138 139EVENT2_EXPORT_SYMBOL 140int evtag_unmarshal_timeval(struct evbuffer *evbuf, ev_uint32_t need_tag, 141 struct timeval *ptv); 142 143#ifdef __cplusplus 144} 145#endif 146 147#endif /* EVENT2_TAG_H_INCLUDED_ */ 148