1/* 2 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6/* 7 * Copyright (c) 1990 Regents of the University of Michigan. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms are permitted 11 * provided that this notice is preserved and that due credit is given 12 * to the University of Michigan at Ann Arbor. The name of the University 13 * may not be used to endorse or promote products derived from this 14 * software without specific prior written permission. This software 15 * is provided ``as is'' without express or implied warranty. 16 */ 17 18#ifndef _LBER_H 19#define _LBER_H 20 21#pragma ident "%Z%%M% %I% %E% SMI" 22 23#ifdef __cplusplus 24extern "C" { 25#endif 26 27#if !defined(NEEDPROTOS) && defined(__STDC__) 28#define NEEDPROTOS 1 29#endif 30 31/* BER classes and mask */ 32#define LBER_CLASS_UNIVERSAL 0x00 33#define LBER_CLASS_APPLICATION 0x40 34#define LBER_CLASS_CONTEXT 0x80 35#define LBER_CLASS_PRIVATE 0xc0 36#define LBER_CLASS_MASK 0xc0 37 38/* BER encoding type and mask */ 39#define LBER_PRIMITIVE 0x00 40#define LBER_CONSTRUCTED 0x20 41#define LBER_ENCODING_MASK 0x20 42 43#define LBER_BIG_TAG_MASK 0x1f 44#define LBER_MORE_TAG_MASK 0x80 45 46/* 47 * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear 48 * as valid BER tags, and so it is safe to use them to report errors. In 49 * fact, any tag for which the following is true is invalid: 50 * (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 ) 51 */ 52#define LBER_ERROR 0xffffffff 53#define LBER_DEFAULT 0xffffffff 54 55/* general BER types we know about */ 56#define LBER_BOOLEAN 0x01 57#define LBER_INTEGER 0x02 58#define LBER_BITSTRING 0x03 59#define LBER_OCTETSTRING 0x04 60#define LBER_NULL 0x05 61#define LBER_ENUMERATED 0x0a 62#define LBER_SEQUENCE 0x30 /* constructed */ 63#define LBER_SET 0x31 /* constructed */ 64 65#define OLD_LBER_SEQUENCE 0x10 /* w/o constructed bit - broken */ 66#define OLD_LBER_SET 0x11 /* w/o constructed bit - broken */ 67 68#ifdef NEEDPROTOS 69typedef int (*BERTranslateProc)(char **bufp, unsigned int *buflenp, 70 int free_input); 71#else /* NEEDPROTOS */ 72typedef int (*BERTranslateProc)(); 73#endif /* NEEDPROTOS */ 74 75typedef struct berelement BerElement; /* Opaque BerElement structure */ 76#define NULLBER ((BerElement *) 0) 77 78#ifdef LDAP_SSL 79#include <security/ssl.h> 80#endif /* LDAP_SSL */ 81 82/* 83 * Structure Sockbuf which used to be defined in this header file, is 84 * removed since the c-api draft does not define the structure and it 85 * is only used internal to the library 86 */ 87 88typedef struct seqorset { 89 BerElement *sos_ber; 90 unsigned int sos_clen; 91 unsigned int sos_tag; 92 char *sos_first; 93 char *sos_ptr; 94 struct seqorset *sos_next; 95} Seqorset; 96#define NULLSEQORSET ((Seqorset *) 0) 97 98typedef unsigned int ber_len_t; /* for BER len */ 99typedef unsigned int ber_tag_t; /* for BER tags */ 100typedef int ber_int_t; /* for BER ints, enums, and Booleans */ 101typedef unsigned int ber_uint_t; /* unsigned equivalent of ber_int_t */ 102typedef int ber_slen_t; /* signed equivalent of ber_len_t */ 103 104/* structure for returning a sequence of octet strings + length */ 105typedef struct berval { 106 ber_len_t bv_len; 107 char *bv_val; 108} BerValue; 109 110#ifndef NEEDPROTOS 111extern BerElement *ber_alloc(); 112extern BerElement *der_alloc(); 113extern BerElement *ber_alloc_t(); 114extern BerElement *ber_dup(); 115extern BerElement *ber_init(); 116extern int lber_debug; 117extern void ber_bvfree(); 118extern void ber_bvecfree(); 119extern struct berval *ber_bvdup(); 120extern void ber_dump(); 121extern void ber_sos_dump(); 122extern void lber_bprint(); 123extern void ber_reset(); 124extern void ber_zero_init(); 125#else /* NEEDPROTOS */ 126 127/* 128 * in bprint.c: 129 */ 130void lber_bprint(char *data, int len); 131 132/* 133 * in decode.c: 134 */ 135ber_tag_t ber_get_tag(BerElement *ber); 136ber_tag_t ber_skip_tag(BerElement *ber, ber_len_t *len); 137ber_tag_t ber_peek_tag(BerElement *ber, ber_len_t *len); 138unsigned int ber_get_int(BerElement *ber, int *num); 139unsigned int ber_get_stringb(BerElement *ber, char *buf, 140 ber_len_t *len); 141unsigned int ber_get_stringa(BerElement *ber, char **buf); 142unsigned int ber_get_stringal(BerElement *ber, struct berval **bv); 143unsigned int ber_get_bitstringa(BerElement *ber, char **buf, 144 ber_len_t *len); 145unsigned int ber_get_null(BerElement *ber); 146unsigned int ber_get_boolean(BerElement *ber, int *boolval); 147ber_tag_t ber_first_element(BerElement *ber, ber_len_t *len, 148 char **last); 149ber_tag_t ber_next_element(BerElement *ber, ber_len_t *len, 150 char *last); 151#if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun) 152ber_tag_t ber_scanf(BerElement *ber, char *fmt, ...); 153#else 154ber_tag_t ber_scanf(); 155#endif 156void ber_bvfree(struct berval *bv); 157void ber_bvecfree(struct berval **bv); 158struct berval *ber_bvdup(struct berval *bv); 159#ifdef STR_TRANSLATION 160void ber_set_string_translators(BerElement *ber, 161 BERTranslateProc encode_proc, BERTranslateProc decode_proc); 162#endif /* STR_TRANSLATION */ 163int ber_flatten(BerElement *ber, struct berval **bvPtr); 164 165/* 166 * in encode.c 167 */ 168int ber_put_enum(BerElement *ber, int num, ber_tag_t tag); 169int ber_put_int(BerElement *ber, int num, ber_tag_t tag); 170int ber_put_ostring(BerElement *ber, char *str, ber_len_t len, ber_tag_t tag); 171int ber_put_string(BerElement *ber, char *str, ber_tag_t tag); 172int ber_put_bitstring(BerElement *ber, char *str, 173 unsigned int bitlen, ber_tag_t tag); 174int ber_put_null(BerElement *ber, ber_tag_t tag); 175int ber_put_boolean(BerElement *ber, int boolval, ber_tag_t tag); 176int ber_start_seq(BerElement *ber, ber_tag_t tag); 177int ber_start_set(BerElement *ber, ber_tag_t tag); 178int ber_put_seq(BerElement *ber); 179int ber_put_set(BerElement *ber); 180#if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun) 181int ber_printf(BerElement *ber, char *fmt, ...); 182#else 183int ber_printf(); 184#endif 185 186/* 187 * in io.c: 188 * 189 * ber_flush() and ber_get_next() functions are obsolete and removed 190 * from this library/header file 191 */ 192int ber_read(BerElement *ber, char *buf, ber_len_t len); 193int ber_write(BerElement *ber, char *buf, ber_len_t len, int nosos); 194void ber_free(BerElement *ber, int freebuf); 195BerElement *ber_alloc(void); 196BerElement *der_alloc(void); 197BerElement *ber_alloc_t(int options); 198BerElement *ber_dup(BerElement *ber); 199BerElement *ber_init(struct berval *bv); 200void ber_dump(BerElement *ber, int inout); 201void ber_sos_dump(Seqorset *sos); 202void ber_zero_init(BerElement *ber, int options); 203void ber_reset(BerElement *ber, int was_writing); 204 205#ifdef NEEDGETOPT 206/* 207 * in getopt.c 208 */ 209int getopt(int nargc, char **nargv, char *ostr); 210#endif /* NEEDGETOPT */ 211#endif /* NEEDPROTOS */ 212 213#define LBER_HTONL(l) htonl(l) 214#define LBER_NTOHL(l) ntohl(l) 215 216/* 217 * SAFEMEMCPY is an overlap-safe copy from s to d of n bytes 218 */ 219#ifdef sunos4 220#define SAFEMEMCPY(d, s, n) bcopy(s, d, n) 221#else /* sunos4 */ 222#define SAFEMEMCPY(d, s, n) memmove(d, s, n) 223#endif /* sunos4 */ 224 225#ifdef SUN 226 227/* I18N support */ 228#include <locale.h> 229#include <nl_types.h> 230 231extern nl_catd slapdcat; /* for I18N support */ 232extern void i18n_catopen(char *); 233 234#endif 235 236#ifdef __cplusplus 237} 238#endif 239 240#endif /* _LBER_H */ 241