1/* $NetBSD: lber-int.h,v 1.1.1.3 2010/12/12 15:21:28 adam Exp $ */ 2 3/* OpenLDAP: pkg/ldap/libraries/liblber/lber-int.h,v 1.68.2.7 2010/04/13 20:22:54 kurt Exp */ 4/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 5 * 6 * Copyright 1998-2010 The OpenLDAP Foundation. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted only as authorized by the OpenLDAP 11 * Public License. 12 * 13 * A copy of this license is available in the file LICENSE in the 14 * top-level directory of the distribution or, alternatively, at 15 * <http://www.OpenLDAP.org/license.html>. 16 */ 17/* Portions Copyright (c) 1990 Regents of the University of Michigan. 18 * All rights reserved. 19 * 20 * Redistribution and use in source and binary forms are permitted 21 * provided that this notice is preserved and that due credit is given 22 * to the University of Michigan at Ann Arbor. The name of the University 23 * may not be used to endorse or promote products derived from this 24 * software without specific prior written permission. This software 25 * is provided ``as is'' without express or implied warranty. 26 */ 27 28#ifndef _LBER_INT_H 29#define _LBER_INT_H 30 31#include "lber.h" 32#include "ldap_log.h" 33#include "lber_pvt.h" 34#include "ldap_queue.h" 35 36LDAP_BEGIN_DECL 37 38typedef void (*BER_LOG_FN)(FILE *file, 39 const char *subsys, int level, const char *fmt, ... ); 40 41LBER_V (BER_ERRNO_FN) ber_int_errno_fn; 42 43#ifdef LDAP_MEMORY_TRACE 44# ifndef LDAP_MEMORY_DEBUG 45# define LDAP_MEMORY_DEBUG 1 46# endif 47#endif 48 49#ifdef LDAP_MEMORY_DEBUG 50LBER_V (long) ber_int_meminuse; 51#endif 52#if defined(LDAP_MEMORY_DEBUG) && ((LDAP_MEMORY_DEBUG +0) & 2) 53# define LDAP_MEMORY_DEBUG_ASSERT assert 54#else 55# define LDAP_MEMORY_DEBUG_ASSERT(expr) ((void) 0) 56#endif 57 58struct lber_options { 59 short lbo_valid; 60 unsigned short lbo_options; 61 int lbo_debug; 62}; 63 64LBER_F( int ) ber_pvt_log_output( 65 const char *subsystem, 66 int level, 67 const char *fmt, ... ); 68 69#define LBER_UNINITIALIZED 0x0 70#define LBER_INITIALIZED 0x1 71#define LBER_VALID_BERELEMENT 0x2 72#define LBER_VALID_SOCKBUF 0x3 73 74LBER_V (struct lber_options) ber_int_options; 75#define ber_int_debug ber_int_options.lbo_debug 76 77/* Data encoded in ASN.1 BER format */ 78struct berelement { 79 struct lber_options ber_opts; 80#define ber_valid ber_opts.lbo_valid 81#define ber_options ber_opts.lbo_options 82#define ber_debug ber_opts.lbo_debug 83 84 /* 85 * The members below, when not NULL/LBER_DEFAULT/etc, are: 86 * ber_buf Data buffer. Other pointers normally point into it. 87 * ber_rwptr Read/write cursor for Sockbuf I/O. 88 * ber_memctx Context passed to ber_memalloc() & co. 89 * When decoding data (reading it from the BerElement): 90 * ber_end End of BER data. 91 * ber_ptr Read cursor, except for 1st octet of tags. 92 * ber_tag 1st octet of next tag, saved from *ber_ptr when 93 * ber_ptr may be pointing at a tag and is >ber_buf. 94 * The octet *ber_ptr itself may get overwritten with 95 * a \0, to terminate the preceding element. 96 * When encoding data (writing it to the BerElement): 97 * ber_end End of allocated buffer - 1 (allowing a final \0). 98 * ber_ptr Last complete BER element (normally write cursor). 99 * ber_sos_ptr NULL or write cursor for incomplete sequence or set. 100 * ber_sos_inner offset(seq/set length octets) if ber_sos_ptr!=NULL. 101 * ber_tag Default tag for next ber_printf() element. 102 * ber_usertag Boolean set by ber_printf "!" if it sets ber_tag. 103 * ber_len Reused for ber_sos_inner. 104 * When output to a Sockbuf: 105 * ber_ptr End of encoded data to write. 106 * When input from a Sockbuf: 107 * See ber_get_next(). 108 */ 109 110 /* Do not change the order of these 3 fields! see ber_get_next */ 111 ber_tag_t ber_tag; 112 ber_len_t ber_len; 113 ber_tag_t ber_usertag; 114 115 char *ber_buf; 116 char *ber_ptr; 117 char *ber_end; 118 119 char *ber_sos_ptr; 120# define ber_sos_inner ber_len /* reused for binary compat */ 121 122 char *ber_rwptr; 123 void *ber_memctx; 124}; 125#define LBER_VALID(ber) ((ber)->ber_valid==LBER_VALID_BERELEMENT) 126 127#define ber_pvt_ber_remaining(ber) ((ber)->ber_end - (ber)->ber_ptr) 128#define ber_pvt_ber_total(ber) ((ber)->ber_end - (ber)->ber_buf) 129#define ber_pvt_ber_write(ber) ((ber)->ber_ptr - (ber)->ber_buf) 130 131struct sockbuf { 132 struct lber_options sb_opts; 133 Sockbuf_IO_Desc *sb_iod; /* I/O functions */ 134#define sb_valid sb_opts.lbo_valid 135#define sb_options sb_opts.lbo_options 136#define sb_debug sb_opts.lbo_debug 137 ber_socket_t sb_fd; 138 ber_len_t sb_max_incoming; 139 unsigned int sb_trans_needs_read:1; 140 unsigned int sb_trans_needs_write:1; 141#ifdef LDAP_PF_LOCAL_SENDMSG 142 char sb_ungetlen; 143 char sb_ungetbuf[8]; 144#endif 145}; 146 147#define SOCKBUF_VALID( sb ) ( (sb)->sb_valid == LBER_VALID_SOCKBUF ) 148 149 150/* 151 * decode.c, encode.c 152 */ 153 154/* Simplest OID max-DER-component to implement in both decode and encode */ 155#define LBER_OID_COMPONENT_MAX ((unsigned long)-1 - 128) 156 157 158/* 159 * io.c 160 */ 161LBER_F( int ) 162ber_realloc LDAP_P(( 163 BerElement *ber, 164 ber_len_t len )); 165 166LBER_F (char *) ber_start LDAP_P(( BerElement * )); 167LBER_F (int) ber_len LDAP_P(( BerElement * )); 168LBER_F (int) ber_ptrlen LDAP_P(( BerElement * )); 169LBER_F (void) ber_rewind LDAP_P(( BerElement * )); 170 171/* 172 * bprint.c 173 */ 174#define ber_log_printf ber_pvt_log_printf 175 176LBER_F( int ) 177ber_log_bprint LDAP_P(( 178 int errlvl, 179 int loglvl, 180 const char *data, 181 ber_len_t len )); 182 183LBER_F( int ) 184ber_log_dump LDAP_P(( 185 int errlvl, 186 int loglvl, 187 BerElement *ber, 188 int inout )); 189 190LBER_V (BER_LOG_FN) ber_int_log_proc; 191LBER_V (FILE *) ber_pvt_err_file; 192 193/* memory.c */ 194 /* simple macros to realloc for now */ 195LBER_V (BerMemoryFunctions *) ber_int_memory_fns; 196LBER_F (char *) ber_strndup( LDAP_CONST char *, ber_len_t ); 197LBER_F (char *) ber_strndup_x( LDAP_CONST char *, ber_len_t, void *ctx ); 198 199#define LBER_MALLOC(s) ber_memalloc((s)) 200#define LBER_CALLOC(n,s) ber_memcalloc((n),(s)) 201#define LBER_REALLOC(p,s) ber_memrealloc((p),(s)) 202#define LBER_FREE(p) ber_memfree((p)) 203#define LBER_VFREE(v) ber_memvfree((void**)(v)) 204#define LBER_STRDUP(s) ber_strdup((s)) 205#define LBER_STRNDUP(s,l) ber_strndup((s),(l)) 206 207/* sockbuf.c */ 208 209LBER_F( int ) 210ber_int_sb_init LDAP_P(( Sockbuf *sb )); 211 212LBER_F( int ) 213ber_int_sb_close LDAP_P(( Sockbuf *sb )); 214 215LBER_F( int ) 216ber_int_sb_destroy LDAP_P(( Sockbuf *sb )); 217 218LBER_F( ber_slen_t ) 219ber_int_sb_read LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len )); 220 221LBER_F( ber_slen_t ) 222ber_int_sb_write LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len )); 223 224LDAP_END_DECL 225 226#endif /* _LBER_INT_H */ 227