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