1*549b59edSchristos /* $NetBSD: lber-int.h,v 1.3 2021/08/14 16:14:55 christos Exp $ */ 24e6df137Slukem 3d11b170bStron /* $OpenLDAP$ */ 42de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 52de962bdSlukem * 6*549b59edSchristos * Copyright 1998-2021 The OpenLDAP Foundation. 72de962bdSlukem * All rights reserved. 82de962bdSlukem * 92de962bdSlukem * Redistribution and use in source and binary forms, with or without 102de962bdSlukem * modification, are permitted only as authorized by the OpenLDAP 112de962bdSlukem * Public License. 122de962bdSlukem * 132de962bdSlukem * A copy of this license is available in the file LICENSE in the 142de962bdSlukem * top-level directory of the distribution or, alternatively, at 152de962bdSlukem * <http://www.OpenLDAP.org/license.html>. 162de962bdSlukem */ 172de962bdSlukem /* Portions Copyright (c) 1990 Regents of the University of Michigan. 182de962bdSlukem * All rights reserved. 192de962bdSlukem * 202de962bdSlukem * Redistribution and use in source and binary forms are permitted 212de962bdSlukem * provided that this notice is preserved and that due credit is given 222de962bdSlukem * to the University of Michigan at Ann Arbor. The name of the University 232de962bdSlukem * may not be used to endorse or promote products derived from this 242de962bdSlukem * software without specific prior written permission. This software 252de962bdSlukem * is provided ``as is'' without express or implied warranty. 262de962bdSlukem */ 272de962bdSlukem 282de962bdSlukem #ifndef _LBER_INT_H 292de962bdSlukem #define _LBER_INT_H 302de962bdSlukem 312de962bdSlukem #include "lber.h" 32*549b59edSchristos #define LDAP_INT_DEBUG 332de962bdSlukem #include "ldap_log.h" 342de962bdSlukem #include "lber_pvt.h" 352de962bdSlukem #include "ldap_queue.h" 362de962bdSlukem 372de962bdSlukem LDAP_BEGIN_DECL 382de962bdSlukem 392de962bdSlukem typedef void (*BER_LOG_FN)(FILE *file, 402de962bdSlukem const char *subsys, int level, const char *fmt, ... ); 412de962bdSlukem 422de962bdSlukem LBER_V (BER_ERRNO_FN) ber_int_errno_fn; 432de962bdSlukem 442de962bdSlukem #ifdef LDAP_MEMORY_TRACE 452de962bdSlukem # ifndef LDAP_MEMORY_DEBUG 462de962bdSlukem # define LDAP_MEMORY_DEBUG 1 472de962bdSlukem # endif 482de962bdSlukem #endif 492de962bdSlukem 502de962bdSlukem #ifdef LDAP_MEMORY_DEBUG 512de962bdSlukem LBER_V (long) ber_int_meminuse; 522de962bdSlukem #endif 532de962bdSlukem #if defined(LDAP_MEMORY_DEBUG) && ((LDAP_MEMORY_DEBUG +0) & 2) 542de962bdSlukem # define LDAP_MEMORY_DEBUG_ASSERT assert 552de962bdSlukem #else 562de962bdSlukem # define LDAP_MEMORY_DEBUG_ASSERT(expr) ((void) 0) 572de962bdSlukem #endif 582de962bdSlukem 592de962bdSlukem struct lber_options { 602de962bdSlukem short lbo_valid; 612de962bdSlukem unsigned short lbo_options; 622de962bdSlukem int lbo_debug; 632de962bdSlukem }; 642de962bdSlukem 652de962bdSlukem LBER_F( int ) ber_pvt_log_output( 662de962bdSlukem const char *subsystem, 672de962bdSlukem int level, 682de962bdSlukem const char *fmt, ... ); 692de962bdSlukem 702de962bdSlukem #define LBER_UNINITIALIZED 0x0 712de962bdSlukem #define LBER_INITIALIZED 0x1 722de962bdSlukem #define LBER_VALID_BERELEMENT 0x2 732de962bdSlukem #define LBER_VALID_SOCKBUF 0x3 742de962bdSlukem 752de962bdSlukem LBER_V (struct lber_options) ber_int_options; 762de962bdSlukem #define ber_int_debug ber_int_options.lbo_debug 772de962bdSlukem 784e6df137Slukem /* Data encoded in ASN.1 BER format */ 792de962bdSlukem struct berelement { 802de962bdSlukem struct lber_options ber_opts; 812de962bdSlukem #define ber_valid ber_opts.lbo_valid 822de962bdSlukem #define ber_options ber_opts.lbo_options 832de962bdSlukem #define ber_debug ber_opts.lbo_debug 842de962bdSlukem 854e6df137Slukem /* 864e6df137Slukem * The members below, when not NULL/LBER_DEFAULT/etc, are: 874e6df137Slukem * ber_buf Data buffer. Other pointers normally point into it. 884e6df137Slukem * ber_rwptr Read/write cursor for Sockbuf I/O. 894e6df137Slukem * ber_memctx Context passed to ber_memalloc() & co. 904e6df137Slukem * When decoding data (reading it from the BerElement): 914e6df137Slukem * ber_end End of BER data. 924e6df137Slukem * ber_ptr Read cursor, except for 1st octet of tags. 934e6df137Slukem * ber_tag 1st octet of next tag, saved from *ber_ptr when 944e6df137Slukem * ber_ptr may be pointing at a tag and is >ber_buf. 954e6df137Slukem * The octet *ber_ptr itself may get overwritten with 964e6df137Slukem * a \0, to terminate the preceding element. 974e6df137Slukem * When encoding data (writing it to the BerElement): 984e6df137Slukem * ber_end End of allocated buffer - 1 (allowing a final \0). 994e6df137Slukem * ber_ptr Last complete BER element (normally write cursor). 1004e6df137Slukem * ber_sos_ptr NULL or write cursor for incomplete sequence or set. 1014e6df137Slukem * ber_sos_inner offset(seq/set length octets) if ber_sos_ptr!=NULL. 1024e6df137Slukem * ber_tag Default tag for next ber_printf() element. 1034e6df137Slukem * ber_usertag Boolean set by ber_printf "!" if it sets ber_tag. 1044e6df137Slukem * ber_len Reused for ber_sos_inner. 1054e6df137Slukem * When output to a Sockbuf: 1064e6df137Slukem * ber_ptr End of encoded data to write. 1074e6df137Slukem * When input from a Sockbuf: 1084e6df137Slukem * See ber_get_next(). 1094e6df137Slukem */ 1104e6df137Slukem 1112de962bdSlukem /* Do not change the order of these 3 fields! see ber_get_next */ 1122de962bdSlukem ber_tag_t ber_tag; 1132de962bdSlukem ber_len_t ber_len; 1142de962bdSlukem ber_tag_t ber_usertag; 1152de962bdSlukem 1162de962bdSlukem char *ber_buf; 1172de962bdSlukem char *ber_ptr; 1182de962bdSlukem char *ber_end; 1192de962bdSlukem 1204e6df137Slukem char *ber_sos_ptr; 1214e6df137Slukem # define ber_sos_inner ber_len /* reused for binary compat */ 1224e6df137Slukem 1232de962bdSlukem char *ber_rwptr; 1242de962bdSlukem void *ber_memctx; 1252de962bdSlukem }; 1262de962bdSlukem #define LBER_VALID(ber) ((ber)->ber_valid==LBER_VALID_BERELEMENT) 1272de962bdSlukem 1282de962bdSlukem #define ber_pvt_ber_remaining(ber) ((ber)->ber_end - (ber)->ber_ptr) 1292de962bdSlukem #define ber_pvt_ber_total(ber) ((ber)->ber_end - (ber)->ber_buf) 1302de962bdSlukem #define ber_pvt_ber_write(ber) ((ber)->ber_ptr - (ber)->ber_buf) 1312de962bdSlukem 1322de962bdSlukem struct sockbuf { 1332de962bdSlukem struct lber_options sb_opts; 1342de962bdSlukem Sockbuf_IO_Desc *sb_iod; /* I/O functions */ 1352de962bdSlukem #define sb_valid sb_opts.lbo_valid 1362de962bdSlukem #define sb_options sb_opts.lbo_options 1372de962bdSlukem #define sb_debug sb_opts.lbo_debug 1382de962bdSlukem ber_socket_t sb_fd; 1392de962bdSlukem ber_len_t sb_max_incoming; 1402de962bdSlukem unsigned int sb_trans_needs_read:1; 1412de962bdSlukem unsigned int sb_trans_needs_write:1; 1422de962bdSlukem #ifdef LDAP_PF_LOCAL_SENDMSG 1432de962bdSlukem char sb_ungetlen; 1442de962bdSlukem char sb_ungetbuf[8]; 1452de962bdSlukem #endif 1462de962bdSlukem }; 1472de962bdSlukem 1482de962bdSlukem #define SOCKBUF_VALID( sb ) ( (sb)->sb_valid == LBER_VALID_SOCKBUF ) 1492de962bdSlukem 1502de962bdSlukem 1512de962bdSlukem /* 1522de962bdSlukem * decode.c, encode.c 1532de962bdSlukem */ 1542de962bdSlukem 1552de962bdSlukem /* Simplest OID max-DER-component to implement in both decode and encode */ 1562de962bdSlukem #define LBER_OID_COMPONENT_MAX ((unsigned long)-1 - 128) 1572de962bdSlukem 1582de962bdSlukem 1592de962bdSlukem /* 1602de962bdSlukem * io.c 1612de962bdSlukem */ 1622de962bdSlukem LBER_F( int ) 1632de962bdSlukem ber_realloc LDAP_P(( 1642de962bdSlukem BerElement *ber, 1652de962bdSlukem ber_len_t len )); 1662de962bdSlukem 1672de962bdSlukem LBER_F (char *) ber_start LDAP_P(( BerElement * )); 1682de962bdSlukem LBER_F (int) ber_len LDAP_P(( BerElement * )); 1692de962bdSlukem LBER_F (int) ber_ptrlen LDAP_P(( BerElement * )); 1702de962bdSlukem LBER_F (void) ber_rewind LDAP_P(( BerElement * )); 1712de962bdSlukem 1722de962bdSlukem /* 1732de962bdSlukem * bprint.c 1742de962bdSlukem */ 1752de962bdSlukem #define ber_log_printf ber_pvt_log_printf 1762de962bdSlukem 1772de962bdSlukem LBER_F( int ) 1782de962bdSlukem ber_log_bprint LDAP_P(( 1792de962bdSlukem int errlvl, 1802de962bdSlukem int loglvl, 1812de962bdSlukem const char *data, 1822de962bdSlukem ber_len_t len )); 1832de962bdSlukem 1842de962bdSlukem LBER_F( int ) 1852de962bdSlukem ber_log_dump LDAP_P(( 1862de962bdSlukem int errlvl, 1872de962bdSlukem int loglvl, 1882de962bdSlukem BerElement *ber, 1892de962bdSlukem int inout )); 1902de962bdSlukem 1912de962bdSlukem LBER_V (BER_LOG_FN) ber_int_log_proc; 1922de962bdSlukem LBER_V (FILE *) ber_pvt_err_file; 1932de962bdSlukem 1942de962bdSlukem /* memory.c */ 1952de962bdSlukem /* simple macros to realloc for now */ 1962de962bdSlukem LBER_V (BerMemoryFunctions *) ber_int_memory_fns; 1972de962bdSlukem LBER_F (char *) ber_strndup( LDAP_CONST char *, ber_len_t ); 1982de962bdSlukem LBER_F (char *) ber_strndup_x( LDAP_CONST char *, ber_len_t, void *ctx ); 1992de962bdSlukem 2002de962bdSlukem #define LBER_MALLOC(s) ber_memalloc((s)) 2012de962bdSlukem #define LBER_CALLOC(n,s) ber_memcalloc((n),(s)) 2022de962bdSlukem #define LBER_REALLOC(p,s) ber_memrealloc((p),(s)) 2032de962bdSlukem #define LBER_FREE(p) ber_memfree((p)) 2042de962bdSlukem #define LBER_VFREE(v) ber_memvfree((void**)(v)) 2052de962bdSlukem #define LBER_STRDUP(s) ber_strdup((s)) 2062de962bdSlukem #define LBER_STRNDUP(s,l) ber_strndup((s),(l)) 2072de962bdSlukem 2082de962bdSlukem /* sockbuf.c */ 2092de962bdSlukem 2102de962bdSlukem LBER_F( int ) 2112de962bdSlukem ber_int_sb_init LDAP_P(( Sockbuf *sb )); 2122de962bdSlukem 2132de962bdSlukem LBER_F( int ) 2142de962bdSlukem ber_int_sb_close LDAP_P(( Sockbuf *sb )); 2152de962bdSlukem 2162de962bdSlukem LBER_F( int ) 2172de962bdSlukem ber_int_sb_destroy LDAP_P(( Sockbuf *sb )); 2182de962bdSlukem 2192de962bdSlukem LBER_F( ber_slen_t ) 2202de962bdSlukem ber_int_sb_read LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len )); 2212de962bdSlukem 2222de962bdSlukem LBER_F( ber_slen_t ) 2232de962bdSlukem ber_int_sb_write LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len )); 2242de962bdSlukem 2252de962bdSlukem LDAP_END_DECL 2262de962bdSlukem 2272de962bdSlukem #endif /* _LBER_INT_H */ 228