(* $OpenLDAP: pkg/ldap/include/lber.h,v 1.83.2.11 2005/01/20 17:00:58 kurt Exp $ *) (* This work is part of OpenLDAP Software . * * Copyright 1998-2005 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted only as authorized by the OpenLDAP * Public License. * * A copy of this license is available in file LICENSE in the * top-level directory of the distribution or, alternatively, at * . *) (* Portions Copyright (c) 1990 Regents of the University of Michigan. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that this notice is preserved and that due credit is given * to the University of Michigan at Ann Arbor. The name of the University * may not be used to endorse or promote products derived from this * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. *) (* Overview of LBER tag construction * * Bits * ______ * 8 7 | CLASS * 0 0 = UNIVERSAL * 0 1 = APPLICATION * 1 0 = CONTEXT-SPECIFIC * 1 1 = PRIVATE * _____ * | 6 | DATA-TYPE * 0 = PRIMITIVE * 1 = CONSTRUCTED * ___________ * | 5 ... 1 | TAG-NUMBER *) const (* BER classes and mask *) LBER_CLASS_UNIVERSAL = ber_tag_t($00); LBER_CLASS_APPLICATION = ber_tag_t($40); LBER_CLASS_CONTEXT = ber_tag_t($80); LBER_CLASS_PRIVATE = ber_tag_t($c0); LBER_CLASS_MASK = ber_tag_t($c0); (* BER encoding type and mask *) LBER_PRIMITIVE = ber_tag_t($00); LBER_CONSTRUCTED = ber_tag_t($20); LBER_ENCODING_MASK = ber_tag_t($20); LBER_BIG_TAG_MASK = ber_tag_t($1f); LBER_MORE_TAG_MASK = ber_tag_t($80); (* * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear * as valid BER tags, and so it is safe to use them to report errors. In * fact, any tag for which the following is true is invalid: *) function LBER_INVALID(t: ber_tag_t): ber_tag_t; const LBER_ERROR = ber_tag_t(-1); LBER_DEFAULT = ber_tag_t(-1); (* general BER types we know about *) LBER_BOOLEAN = ber_tag_t($01); LBER_INTEGER = ber_tag_t($02); LBER_BITSTRING = ber_tag_t($03); LBER_OCTETSTRING = ber_tag_t($04); LBER_NULL = ber_tag_t($05); LBER_ENUMERATED = ber_tag_t($0a); LBER_SEQUENCE = ber_tag_t($30); (* constructed *) LBER_SET = ber_tag_t($31); (* constructed *) (* LBER BerElement options *) LBER_USE_DER = $01; (* get/set options for BerElement *) LBER_OPT_BER_OPTIONS = $01; LBER_OPT_BER_DEBUG = $02; LBER_OPT_BER_REMAINING_BYTES = $03; LBER_OPT_BER_TOTAL_BYTES = $04; LBER_OPT_BER_BYTES_TO_WRITE = $05; LBER_OPT_BER_MEMCTX = $06; LBER_OPT_DEBUG_LEVEL = LBER_OPT_BER_DEBUG; LBER_OPT_REMAINING_BYTES = LBER_OPT_BER_REMAINING_BYTES; LBER_OPT_TOTAL_BYTES = LBER_OPT_BER_TOTAL_BYTES; LBER_OPT_BYTES_TO_WRITE = LBER_OPT_BER_BYTES_TO_WRITE; LBER_OPT_LOG_PRINT_FN = $8001; LBER_OPT_MEMORY_FNS = $8002; LBER_OPT_ERROR_FN = $8003; LBER_OPT_LOG_PRINT_FILE = $8004; (* get/set Memory Debug options *) LBER_OPT_MEMORY_INUSE = $8005; (* for memory debugging *) LBER_OPT_LOG_PROC = $8006; (* for external logging function *) type BER_ERRNO_FN = function: pcint; cdecl; BER_LOG_PRINT_FN = procedure(const buf: pcchar); cdecl; BER_MEMALLOC_FN = function(size: ber_len_t): Pointer; cdecl; BER_MEMCALLOC_FN = function(n: ber_len_t; size: ber_len_t): Pointer; cdecl; BER_MEMREALLOC_FN = function(p: Pointer; size: ber_len_t): Pointer; cdecl; BER_MEMFREE_FN = function(p: Pointer): Pointer; cdecl; plber_memory_fns = ^lber_memory_fns; lber_memory_fns = record bmf_malloc : BER_MEMALLOC_FN; bmf_calloc : BER_MEMCALLOC_FN; bmf_realloc : BER_MEMREALLOC_FN; bmf_free : BER_MEMFREE_FN; end; PBerMemoryFunctions = ^BerMemoryFunctions; BerMemoryFunctions = lber_memory_fns; const (* LBER Sockbuf_IO options *) LBER_SB_OPT_GET_FD = 1; LBER_SB_OPT_SET_FD = 2; LBER_SB_OPT_HAS_IO = 3; LBER_SB_OPT_SET_NONBLOCK = 4; LBER_SB_OPT_GET_SSL = 7; LBER_SB_OPT_DATA_READY = 8; LBER_SB_OPT_SET_READAHEAD = 9; LBER_SB_OPT_DRAIN = 10; LBER_SB_OPT_NEEDS_READ = 11; LBER_SB_OPT_NEEDS_WRITE = 12; LBER_SB_OPT_GET_MAX_INCOMING = 13; LBER_SB_OPT_SET_MAX_INCOMING = 14; (* Largest option used by the library *) LBER_SB_OPT_OPT_MAX = 14; (* LBER IO operations stacking levels *) LBER_SBIOD_LEVEL_PROVIDER = 10; LBER_SBIOD_LEVEL_TRANSPORT = 20; LBER_SBIOD_LEVEL_APPLICATION = 30; (* get/set options for Sockbuf *) LBER_OPT_SOCKBUF_DESC = $1000; LBER_OPT_SOCKBUF_OPTIONS = $1001; LBER_OPT_SOCKBUF_DEBUG = $1002; LBER_OPT_SUCCESS = 0; LBER_OPT_ERROR = -1; (* on/off values *) const LBER_OPT_OFF = Pointer(0); var ber_pvt_opt_on: cchar; cvar; external; function LBER_OPT_ON: Pointer; (* Structure for LBER IO operarion descriptor *) type PBerElement = Pointer; PSockbuf = Pointer; PSeqorset = Pointer; PSockbuf_IO = ^Sockbuf_IO; PSockbuf_IO_Desc = ^Sockbuf_IO_Desc; Sockbuf_IO_Desc = record sbiod_level : cint; sbiod_sb : PSockbuf; sbiod_io : PSockbuf_IO; sbiod_pvt : Pointer; sbiod_next : PSockbuf_IO_Desc; end; (* Structure for LBER IO operation functions *) Sockbuf_IO = record sbi_setup : function(sbiod: PSockbuf_IO_Desc; arg: Pointer): cint; cdecl; sbi_remove : function(sbiod: PSockbuf_IO_Desc): cint; cdecl; sbi_ctrl : function(sbiod: PSockbuf_IO_Desc; opt: cint; arg: Pointer): cint; cdecl; sbi_read : function(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t; cdecl; sbi_write : function(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t; cdecl; sbi_close : function(sbiod: PSockbuf_IO_Desc): cint; cdecl; end; (* Helper macros for LBER IO functions *) function LBER_SBIOD_READ_NEXT(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t; function LBER_SBIOD_WRITE_NEXT(sbiod: PSockbuf_IO_Desc; buf: Pointer; len: ber_len_t): ber_slen_t; function LBER_SBIOD_CTRL_NEXT(sbiod: PSockbuf_IO_Desc; opt: cint; arg: Pointer): cint; (* structure for returning a sequence of octet strings + length *) type PPPBerval = ^PPBerval; PPBerval = ^PBerval; PBerval = ^Berval; Berval = record bv_len : ber_len_t; bv_val : pcchar; end; PBerVarray = ^BerVarray; BerVarray = ^PBerval; (* To distinguish from a single bv *) (* this should be moved to lber-cint.h *) (* * in bprint.c: *) procedure ber_error_print(const data: pcchar); cdecl; external; procedure ber_bprint(const data: pcchar; len: ber_len_t); cdecl; external; procedure ber_dump(ber: PBerElement; inout : cint); cdecl; external; procedure ber_sos_dump(sos: PSeqorset); cdecl; external; (* * in decode.c: *) type BERDecodeCallback = function(ber: PBerElement; data: Pointer; mode: cint): cint; cdecl; function ber_get_tag(ber: PBerElement): ber_tag_t; cdecl; external; function ber_skip_tag(ber: PBerElement; var len: ber_len_t): ber_tag_t; cdecl; external; function ber_peek_tag(ber: PBerElement; var len: ber_len_t): ber_tag_t; cdecl; external; function ber_get_int(ber: PBerElement; var num: ber_int_t): ber_tag_t; cdecl; external; function ber_get_enum(ber: PBerElement; var num: ber_int_t): ber_tag_t; cdecl; external; function ber_get_stringb(ber: PBerElement; buf: pcchar; var len: ber_len_t): ber_tag_t; cdecl; external; function ber_get_stringbv(ber: PBerElement; bv: PBerval; alloc: cbool): ber_tag_t; cdecl; external; function ber_get_stringa(ber: PBerElement; var buf: pcchar): ber_tag_t; cdecl; external; function ber_get_stringal(ber: PBerElement; var bv: PBerval): ber_tag_t; cdecl; external; function ber_get_bitstringa(ber: PBerElement; var buf: pcchar; var len: ber_len_t): ber_tag_t; cdecl; external; function ber_get_null(ber: PBerElement): ber_tag_t; cdecl; external; function ber_get_Boolean(ber: PBerElement; var boolval: ber_int_t): ber_tag_t; cdecl; external; function ber_first_element(ber: PBerElement; var len: ber_len_t; var last: pcchar): ber_tag_t; cdecl; external; function ber_next_element(ber: PBerElement; var len: ber_len_t; const last: pcchar): ber_tag_t; cdecl; external; function ber_scanf(ber: PBerElement;const fmt: pcchar): ber_tag_t; cdecl; varargs; external; (* * in encode.c *) type BEREncodeCallback = function(ber: PBerElement; data: Pointer): cint; function ber_put_enum(ber: PBerElement; num: ber_int_t; tag: ber_tag_t): cint; cdecl; external; function ber_put_int(ber: PBerElement; num: ber_int_t; tag: ber_tag_t): cint; cdecl; external; function ber_put_ostring(ber: PBerElement; const str: pcchar; len: ber_len_t; tag: ber_tag_t): cint; cdecl; external; function ber_put_berval(ber: PBerElement; bv: PBerval; tag: ber_tag_t): cint; cdecl; external; function ber_put_string(ber: PBerElement; const str: pcchar; tag: ber_tag_t): cint; cdecl; external; function ber_put_bitstring(ber: PBerElement; const str: pcchar; bitlen: ber_len_t; tag: ber_tag_t): cint; cdecl; external; function ber_put_null(ber: PBerElement; tag: ber_tag_t): cint; cdecl; external; function ber_put_boolean(ber: PBerElement; boolval: ber_int_t; tag: ber_tag_t): cint; cdecl; external; function ber_start_seq(ber: PBerElement; tag: ber_tag_t): cint; cdecl; external; function ber_start_set(ber: PBerElement; tag: ber_tag_t): cint; cdecl; external; function ber_put_seq(ber: PBerElement): cint; cdecl; external; function ber_put_set(ber: PBerElement): cint; cdecl; external; function ber_printf(ber: PBerElement; const fmt: pcchar): cint; cdecl; varargs; external; (* * in io.c: *) function ber_read(ber: PBerElement; buf: pcchar; len: ber_len_t): ber_slen_t; cdecl; external; function ber_write(ber: PBerElement; const buf: pcchar; len: ber_len_t; nosos: cint): ber_slen_t; cdecl; external; procedure ber_free(ber: PBerElement; freebuf: cbool); cdecl; external; procedure ber_free_buf(ber: PBerElement); cdecl; external; function ber_flush(sb: PSockbuf; ber: PBerElement; freeit: cbool): cint; cdecl; external; function ber_alloc: PBerElement; cdecl; external; deprecated; function der_alloc: PBerElement; cdecl; external; deprecated; function ber_alloc_t(beroptions: cint): PBerElement; cdecl; external; function ber_dup(ber: PBerElement): PBerElement; cdecl; external; function ber_get_next(sb: PSockbuf; var len: ber_len_t; ber: PBerElement): ber_tag_t; cdecl; external; procedure ber_init2(ber: PBerElement; bv: PBerval; options: cint); cdecl; external; procedure ber_init_w_nullc(ber: PBerElement; options: cint); cdecl; external; deprecated; procedure ber_reset(ber: PBerElement; was_writing: cbool); cdecl; external; function ber_init(bv: PBerval): PBerElement; cdecl; external; function ber_flatten(ber: PBerElement; var bvPtr: PBerval): cint; cdecl; external; function ber_flatten2(ber: PBerElement; bv: PBerval; alloc: cbool): cint; cdecl; external; function ber_remaining(ber: PBerElement): cint; cdecl; external; (* * LBER ber accessor functions *) function ber_get_option(item: Pointer; option: cint; outvalue: Pointer): cint; cdecl; external; function ber_set_option(item: Pointer; option: cint; const invalue: Pointer): cint; cdecl; external; (* * LBER sockbuf.c *) function ber_sockbuf_alloc: PSockbuf; cdecl; external; procedure ber_sockbuf_free(sb: PSockbuf); cdecl; external; function ber_sockbuf_add_io(sb: PSockbuf; sbio: PSockbuf_IO; layer: cint; arg: Pointer): cint; cdecl; external; function ber_sockbuf_remove_io(sb: PSockbuf; sbio: PSockbuf_IO; layer: cint): cint; cdecl; external; function ber_sockbuf_ctrl(sb: PSockbuf; opt: cint; arg: Pointer): cint; cdecl; external; var ber_sockbuf_io_tcp : Sockbuf_IO; cvar; external; ber_sockbuf_io_readahead : Sockbuf_IO; cvar; external; ber_sockbuf_io_fd : Sockbuf_IO; cvar; external; ber_sockbuf_io_debug : Sockbuf_IO; cvar; external; {$IFDEF LDAP_CONNECTIONLESS} ber_sockbuf_io_udp : Sockbuf_IO; cvar; external; {$ENDIF} (* * LBER memory.c *) function ber_memalloc(s: ber_len_t): Pointer; cdecl; external; function ber_memrealloc(p: Pointer; s: ber_len_t): Pointer; cdecl; external; function ber_memcalloc(n: ber_len_t; s: ber_len_t): Pointer; cdecl; external; procedure ber_memfree(p: Pointer); cdecl; external; procedure ber_memvfree(vector: PPointer); cdecl; external; procedure ber_bvfree(bv: PBerval); cdecl; external; procedure ber_bvecfree(bv: PPBerval); cdecl; external; function ber_bvecadd(var bvec: PPBerval; bv: PBerval): cint; cdecl; external; function ber_dupbv(dst: PBerval; src: PBerval): PBerval; cdecl; external; function ber_bvdup(src: PBerval): PBerval; cdecl; external; function ber_str2bv(const str: pcchar; len: ber_len_t; duplicate: cbool; bv: PBerval): PBerval; cdecl; external; function ber_mem2bv(const str: pcchar; len: ber_len_t; duplicate: cbool; bv: PBerval): PBerval; cdecl; external; function ber_bvstr(const str: pcchar): PBerval; function ber_bvstrdup(const str: pcchar): PBerval; function ber_strdup(const str: pcchar): pcchar; cdecl; external; procedure ber_bvarray_free(p: BerVarray); cdecl; external; function ber_bvarray_add(p: PBerVarray; bv: PBerval): cint; cdecl; external; function ber_bvcmp(v1, v2: PBerval): cint; (* * error.c *) function ber_errno_addr: pcint; cdecl; external; function ber_errno: cint; const LBER_ERROR_NONE = $0; LBER_ERROR_PARAM = $1; LBER_ERROR_MEMORY = $2;