xref: /onnv-gate/usr/src/lib/libldap4/include/lber.h (revision 0:68f95e015346)
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
24 extern "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
69 typedef int (*BERTranslateProc)(char **bufp, unsigned int *buflenp,
70 	int free_input);
71 #else /* NEEDPROTOS */
72 typedef int (*BERTranslateProc)();
73 #endif /* NEEDPROTOS */
74 
75 typedef 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 
88 typedef 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 
98 typedef unsigned int	ber_len_t;   /* for BER len */
99 typedef unsigned int	ber_tag_t;   /* for BER tags */
100 typedef int		ber_int_t;   /* for BER ints, enums, and Booleans */
101 typedef unsigned int	ber_uint_t; /* unsigned equivalent of ber_int_t */
102 typedef int		ber_slen_t; /* signed equivalent of ber_len_t */
103 
104 /* structure for returning a sequence of octet strings + length */
105 typedef struct berval {
106 	ber_len_t	bv_len;
107 	char		*bv_val;
108 } BerValue;
109 
110 #ifndef NEEDPROTOS
111 extern BerElement *ber_alloc();
112 extern BerElement *der_alloc();
113 extern BerElement *ber_alloc_t();
114 extern BerElement *ber_dup();
115 extern BerElement *ber_init();
116 extern int lber_debug;
117 extern void ber_bvfree();
118 extern void ber_bvecfree();
119 extern struct berval *ber_bvdup();
120 extern void ber_dump();
121 extern void ber_sos_dump();
122 extern void lber_bprint();
123 extern void ber_reset();
124 extern void ber_zero_init();
125 #else /* NEEDPROTOS */
126 
127 /*
128  * in bprint.c:
129  */
130 void lber_bprint(char *data, int len);
131 
132 /*
133  * in decode.c:
134  */
135 ber_tag_t ber_get_tag(BerElement *ber);
136 ber_tag_t ber_skip_tag(BerElement *ber, ber_len_t *len);
137 ber_tag_t ber_peek_tag(BerElement *ber, ber_len_t *len);
138 unsigned int ber_get_int(BerElement *ber, int *num);
139 unsigned int ber_get_stringb(BerElement *ber, char *buf,
140 	ber_len_t *len);
141 unsigned int ber_get_stringa(BerElement *ber, char **buf);
142 unsigned int ber_get_stringal(BerElement *ber, struct berval **bv);
143 unsigned int ber_get_bitstringa(BerElement *ber, char **buf,
144 	ber_len_t *len);
145 unsigned int ber_get_null(BerElement *ber);
146 unsigned int ber_get_boolean(BerElement *ber, int *boolval);
147 ber_tag_t ber_first_element(BerElement *ber, ber_len_t *len,
148 	char **last);
149 ber_tag_t ber_next_element(BerElement *ber, ber_len_t *len,
150 	char *last);
151 #if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun)
152 ber_tag_t ber_scanf(BerElement *ber, char *fmt, ...);
153 #else
154 ber_tag_t ber_scanf();
155 #endif
156 void ber_bvfree(struct berval *bv);
157 void ber_bvecfree(struct berval **bv);
158 struct berval *ber_bvdup(struct berval *bv);
159 #ifdef STR_TRANSLATION
160 void ber_set_string_translators(BerElement *ber,
161 	BERTranslateProc encode_proc, BERTranslateProc decode_proc);
162 #endif /* STR_TRANSLATION */
163 int ber_flatten(BerElement *ber, struct berval **bvPtr);
164 
165 /*
166  * in encode.c
167  */
168 int ber_put_enum(BerElement *ber, int num, ber_tag_t tag);
169 int ber_put_int(BerElement *ber, int num, ber_tag_t tag);
170 int ber_put_ostring(BerElement *ber, char *str, ber_len_t len, ber_tag_t tag);
171 int ber_put_string(BerElement *ber, char *str, ber_tag_t tag);
172 int ber_put_bitstring(BerElement *ber, char *str,
173 	unsigned int bitlen, ber_tag_t tag);
174 int ber_put_null(BerElement *ber, ber_tag_t tag);
175 int ber_put_boolean(BerElement *ber, int boolval, ber_tag_t tag);
176 int ber_start_seq(BerElement *ber, ber_tag_t tag);
177 int ber_start_set(BerElement *ber, ber_tag_t tag);
178 int ber_put_seq(BerElement *ber);
179 int ber_put_set(BerElement *ber);
180 #if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun)
181 int ber_printf(BerElement *ber, char *fmt, ...);
182 #else
183 int 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  */
192 int ber_read(BerElement *ber, char *buf, ber_len_t len);
193 int ber_write(BerElement *ber, char *buf, ber_len_t len, int nosos);
194 void ber_free(BerElement *ber, int freebuf);
195 BerElement *ber_alloc(void);
196 BerElement *der_alloc(void);
197 BerElement *ber_alloc_t(int options);
198 BerElement *ber_dup(BerElement *ber);
199 BerElement *ber_init(struct berval *bv);
200 void ber_dump(BerElement *ber, int inout);
201 void ber_sos_dump(Seqorset *sos);
202 void ber_zero_init(BerElement *ber, int options);
203 void ber_reset(BerElement *ber, int was_writing);
204 
205 #ifdef NEEDGETOPT
206 /*
207  * in getopt.c
208  */
209 int 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 
231 extern	nl_catd	slapdcat;		/* for I18N support */
232 extern void i18n_catopen(char *);
233 
234 #endif
235 
236 #ifdef __cplusplus
237 }
238 #endif
239 
240 #endif /* _LBER_H */
241