xref: /netbsd-src/external/bsd/openldap/dist/libraries/liblber/lber-int.h (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
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