]> git.sur5r.net Git - openldap/blob - include/lber.h
b8c24f5c81be4901fa13a7cb5778a6503cac0daf
[openldap] / include / lber.h
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998,1999 The OpenLDAP Foundation, Redwood City, California, USA
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms are permitted only
7  * as authorized by the OpenLDAP Public License.  A copy of this
8  * license is available at http://www.OpenLDAP.org/license.html or
9  * in file LICENSE in the top-level directory of the distribution.
10  */
11 /* Portions
12  * Copyright (c) 1990 Regents of the University of Michigan.
13  * All rights reserved.
14  *
15  * Redistribution and use in source and binary forms are permitted
16  * provided that this notice is preserved and that due credit is given
17  * to the University of Michigan at Ann Arbor. The name of the University
18  * may not be used to endorse or promote products derived from this
19  * software without specific prior written permission. This software
20  * is provided ``as is'' without express or implied warranty.
21  */
22
23 #ifndef _LBER_H
24 #define _LBER_H
25
26 #include <ldap_cdefs.h>
27 #include <lber_types.h>
28
29 LDAP_BEGIN_DECL
30
31 /* booleans, enumerations, and integers */
32 typedef LBER_INT_T ber_int_t;
33
34 /* signed and unsigned versions */
35 typedef signed LBER_INT_T ber_sint_t;
36 typedef unsigned LBER_INT_T ber_uint_t;
37
38 /* tags */
39 typedef unsigned LBER_TAG_T ber_tag_t;
40
41 /* "socket" descriptors */
42 typedef LBER_SOCKET_T ber_socket_t;
43
44 /* lengths */
45 typedef unsigned LBER_LEN_T ber_len_t;
46
47 /* signed lengths */
48 typedef signed LBER_LEN_T ber_slen_t;
49
50
51 /* Overview of LBER tag construction
52  *
53  *      Bits
54  *      ______
55  *      8 7 | CLASS
56  *      0 0 = UNIVERSAL
57  *      0 1 = APPLICATION
58  *      1 0 = CONTEXT-SPECIFIC
59  *      1 1 = PRIVATE
60  *              _____
61  *              | 6 | DATA-TYPE
62  *                0 = PRIMITIVE
63  *                1 = CONSTRUCTED
64  *                      ___________
65  *                      | 5 ... 1 | TAG-NUMBER
66  */
67
68 /* BER classes and mask */
69 #define LBER_CLASS_UNIVERSAL    ((ber_tag_t) 0x00U)
70 #define LBER_CLASS_APPLICATION  ((ber_tag_t) 0x40U)
71 #define LBER_CLASS_CONTEXT              ((ber_tag_t) 0x80U)
72 #define LBER_CLASS_PRIVATE              ((ber_tag_t) 0xc0U)
73 #define LBER_CLASS_MASK                 ((ber_tag_t) 0xc0U)
74
75 /* BER encoding type and mask */
76 #define LBER_PRIMITIVE                  ((ber_tag_t) 0x00U)
77 #define LBER_CONSTRUCTED                ((ber_tag_t) 0x20U)
78 #define LBER_ENCODING_MASK              ((ber_tag_t) 0x20U)
79
80 #define LBER_BIG_TAG_MASK               ((ber_tag_t) 0x1fU)
81 #define LBER_MORE_TAG_MASK              ((ber_tag_t) 0x80U)
82
83 /*
84  * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
85  * as valid BER tags, and so it is safe to use them to report errors.  In
86  * fact, any tag for which the following is true is invalid:
87  */
88 #define LBER_INVALID(t)     (((t) & (ber_tag_t) 0x080) \
89         && (((t) & (ber_tag_t) ~ 0x0FF))
90
91 #define LBER_ERROR                      ((ber_tag_t) -1)
92 #define LBER_DEFAULT            ((ber_tag_t) -1)
93
94 /* general BER types we know about */
95 #define LBER_BOOLEAN            ((ber_tag_t) 0x01UL)
96 #define LBER_INTEGER            ((ber_tag_t) 0x02UL)
97 #define LBER_BITSTRING          ((ber_tag_t) 0x03UL)
98 #define LBER_OCTETSTRING        ((ber_tag_t) 0x04UL)
99 #define LBER_NULL                       ((ber_tag_t) 0x05UL)
100 #define LBER_ENUMERATED         ((ber_tag_t) 0x0aUL)
101 #define LBER_SEQUENCE           ((ber_tag_t) 0x30UL)    /* constructed */
102 #define LBER_SET                        ((ber_tag_t) 0x31UL)    /* constructed */
103
104 typedef int (*BERTranslateProc) LDAP_P((
105         char **bufp,
106         ber_len_t *buflenp,
107         int free_input ));
108
109 /* LBER BerElement options */
110 #define LBER_USE_DER            0x01
111 #define LBER_USE_INDEFINITE_LEN 0x02
112 #define LBER_TRANSLATE_STRINGS  0x04
113
114 /* get/set options for BerElement */
115 #define LBER_OPT_BER_OPTIONS                    0x01
116 #define LBER_OPT_BER_DEBUG                              0x02
117 #define LBER_OPT_BER_REMAINING_BYTES    0x03
118 #define LBER_OPT_BER_TOTAL_BYTES                0x04
119 #define LBER_OPT_BER_BYTES_TO_WRITE             0x05
120
121 #define LBER_OPT_DEBUG_LEVEL    LBER_OPT_BER_DEBUG
122 #define LBER_OPT_REMAINING_BYTES        LBER_OPT_BER_REMAINING_BYTES
123 #define LBER_OPT_TOTAL_BYTES            LBER_OPT_BER_TOTAL_BYTES
124 #define LBER_OPT_BYTES_TO_WRITE         LBER_OPT_BER_BYTES_TO_WRITE
125
126 #define LBER_OPT_LOG_PRINT_FN   0x8001
127 #define LBER_OPT_MEMORY_FNS             0x8002
128 #define LBER_OPT_ERROR_FN               0x8003
129
130 typedef int* (*BER_ERRNO_FN) LDAP_P(( void ));
131
132 typedef void (*BER_LOG_PRINT_FN) LDAP_P(( char *buf ));
133
134 typedef void* (*BER_MEMALLOC_FN)        LDAP_P(( ber_len_t size ));
135 typedef void* (*BER_MEMCALLOC_FN)       LDAP_P(( ber_len_t n, ber_len_t size ));
136 typedef void* (*BER_MEMREALLOC_FN)      LDAP_P(( void *p, ber_len_t size ));
137 typedef void  (*BER_MEMFREE_FN)         LDAP_P(( void *p ));
138
139 typedef struct lber_memory_fns {
140         BER_MEMALLOC_FN bmf_malloc;
141         BER_MEMCALLOC_FN bmf_calloc;
142         BER_MEMREALLOC_FN bmf_realloc;
143         BER_MEMFREE_FN bmf_free;
144 } BerMemoryFunctions;
145
146 /* LBER Sockbuf options */ 
147 #define LBER_TO_FILE           0x01     /* to a file referenced by sb_fd   */
148 #define LBER_TO_FILE_ONLY      0x02     /* only write to file, not network */
149 #define LBER_MAX_INCOMING_SIZE 0x04     /* impose limit on incoming stuff  */
150 #define LBER_NO_READ_AHEAD     0x08     /* read only as much as requested  */
151
152 /* get/set options for Sockbuf */
153 #define LBER_OPT_SOCKBUF_DESC           0x1000
154 #define LBER_OPT_SOCKBUF_OPTIONS        0x1001
155 #define LBER_OPT_SOCKBUF_DEBUG          0x1002
156
157 /* on/off values */
158 #define LBER_OPT_ON             ((void *) 1)
159 #define LBER_OPT_OFF    ((void *) 0)
160
161 #define LBER_OPT_SUCCESS        (0)
162 #define LBER_OPT_ERROR          (-1)
163
164 typedef struct berelement BerElement;
165 typedef struct sockbuf Sockbuf;
166 typedef struct seqorset Seqorset;
167
168 /* structure for returning a sequence of octet strings + length */
169 typedef struct berval {
170         ber_len_t       bv_len;
171         char            *bv_val;
172 } BerValue;
173
174 #ifdef __MINGW32__
175 #   undef LDAP_F_PRE
176 #   ifdef LIBLBER_DECL
177 #       define LDAP_F_PRE       extern __declspec(LIBLBER_DECL)
178 #   else
179 #       define LDAP_F_PRE       extern
180 #   endif
181 #endif
182
183 /*
184  * in bprint.c:
185  */
186 LDAP_F( void )
187 ber_print_error LDAP_P((
188         LDAP_CONST char *data ));
189
190 LDAP_F( void )
191 ber_bprint LDAP_P((
192         LDAP_CONST char *data, ber_len_t len ));
193
194 LDAP_F( void )
195 ber_dump LDAP_P((
196         BerElement *ber, int inout ));
197
198 LDAP_F( void )
199 ber_sos_dump LDAP_P((
200         Seqorset *sos ));
201
202
203 /*
204  * in decode.c:
205  */
206 typedef int (*BERDecodeCallback) LDAP_P((
207         BerElement *ber,
208         void *data,
209         int mode ));
210
211 LDAP_F( ber_tag_t )
212 ber_get_tag LDAP_P((
213         BerElement *ber ));
214
215 LDAP_F( ber_tag_t )
216 ber_skip_tag LDAP_P((
217         BerElement *ber,
218         ber_len_t *len ));
219
220 LDAP_F( ber_tag_t )
221 ber_peek_tag LDAP_P((
222         BerElement *ber,
223         ber_len_t *len ));
224
225 LDAP_F( ber_tag_t )
226 ber_get_int LDAP_P((
227         BerElement *ber,
228         ber_int_t *num ));
229
230 LDAP_F( ber_tag_t )
231 ber_get_stringb LDAP_P((
232         BerElement *ber,
233         char *buf,
234         ber_len_t *len ));
235
236 LDAP_F( ber_tag_t )
237 ber_get_stringa LDAP_P((
238         BerElement *ber,
239         char **buf ));
240
241 LDAP_F( ber_tag_t )
242 ber_get_stringal LDAP_P((
243         BerElement *ber,
244         struct berval **bv ));
245
246 LDAP_F( ber_tag_t )
247 ber_get_bitstringa LDAP_P((
248         BerElement *ber,
249         char **buf,
250         ber_len_t *len ));
251
252 LDAP_F( ber_tag_t )
253 ber_get_null LDAP_P((
254         BerElement *ber ));
255
256 LDAP_F( ber_tag_t )
257 ber_get_boolean LDAP_P((
258         BerElement *ber,
259         ber_int_t *boolval ));
260
261 LDAP_F( ber_tag_t )
262 ber_first_element LDAP_P((
263         BerElement *ber,
264         ber_len_t *len,
265         char **last ));
266
267 LDAP_F( ber_tag_t )
268 ber_next_element LDAP_P((
269         BerElement *ber,
270         ber_len_t *len,
271         LDAP_CONST char *last ));
272
273 LDAP_F( ber_tag_t )
274 ber_scanf LDAP_P((                                                                
275         BerElement *ber,
276         LDAP_CONST char *fmt,
277         ... ));
278
279 LDAP_F( void )
280 ber_set_string_translators LDAP_P((
281         BerElement *ber,
282         BERTranslateProc encode_proc,
283         BERTranslateProc decode_proc ));
284
285 /*
286  * in encode.c
287  */
288 typedef int (*BEREncodeCallback) LDAP_P((
289         BerElement *ber,
290         void *data ));
291
292 LDAP_F( int )
293 ber_put_enum LDAP_P((
294         BerElement *ber,
295         ber_int_t num,
296         ber_tag_t tag ));
297
298 LDAP_F( int )
299 ber_put_int LDAP_P((
300         BerElement *ber,
301         ber_int_t num,
302         ber_tag_t tag ));
303
304 LDAP_F( int )
305 ber_put_ostring LDAP_P((
306         BerElement *ber,
307         LDAP_CONST char *str,
308         ber_len_t len,
309         ber_tag_t tag ));
310
311 LDAP_F( int )
312 ber_put_berval LDAP_P((
313         BerElement *ber,
314         LDAP_CONST struct berval *bv,
315         ber_tag_t tag ));
316
317 LDAP_F( int )
318 ber_put_string LDAP_P((
319         BerElement *ber,
320         LDAP_CONST char *str,
321         ber_tag_t tag ));
322
323 LDAP_F( int )
324 ber_put_bitstring LDAP_P((
325         BerElement *ber,
326         LDAP_CONST char *str,
327         ber_len_t bitlen,
328         ber_tag_t tag ));
329
330 LDAP_F( int )
331 ber_put_null LDAP_P((
332         BerElement *ber,
333         ber_tag_t tag ));
334
335 LDAP_F( int )
336 ber_put_boolean LDAP_P((
337         BerElement *ber,
338         ber_int_t boolval,
339         ber_tag_t tag ));
340
341 LDAP_F( int )
342 ber_start_seq LDAP_P((
343         BerElement *ber,
344         ber_tag_t tag ));
345
346 LDAP_F( int )
347 ber_start_set LDAP_P((
348         BerElement *ber,
349         ber_tag_t tag ));
350
351 LDAP_F( int )
352 ber_put_seq LDAP_P((
353         BerElement *ber ));
354
355 LDAP_F( int )
356 ber_put_set LDAP_P((
357         BerElement *ber ));
358
359 LDAP_F( int )
360 ber_printf LDAP_P((
361         BerElement *ber,
362         LDAP_CONST char *fmt,
363         ... ));
364
365
366 /*
367  * in io.c:
368  */
369
370 LDAP_F( ber_slen_t )
371 ber_read LDAP_P((
372         BerElement *ber,
373         char *buf,
374         ber_len_t len ));
375
376 LDAP_F( ber_slen_t )
377 ber_write LDAP_P((
378         BerElement *ber,
379         LDAP_CONST char *buf,
380         ber_len_t len,
381         int nosos ));
382
383 LDAP_F( void )
384 ber_free LDAP_P((
385         BerElement *ber,
386         int freebuf ));
387
388 LDAP_F( int )
389 ber_flush LDAP_P((
390         Sockbuf *sb,
391         BerElement *ber,
392         int freeit ));
393
394 LDAP_F( BerElement * )
395 ber_alloc LDAP_P(( void )); /* DEPRECATED */
396
397 LDAP_F( BerElement * )
398 der_alloc LDAP_P(( void )); /* DEPRECATED */
399
400 LDAP_F( BerElement * )
401 ber_alloc_t LDAP_P((
402         int beroptions ));
403
404 LDAP_F( BerElement * )
405 ber_dup LDAP_P((
406         BerElement *ber ));
407
408 LDAP_F( ber_tag_t )
409 ber_get_next LDAP_P((
410         Sockbuf *sb,
411         ber_len_t *len,
412         BerElement *ber ));
413
414 LDAP_F( void )
415 ber_init_w_nullc LDAP_P((
416         BerElement *ber,
417         int options ));
418
419 LDAP_F( void )
420 ber_reset LDAP_P((
421         BerElement *ber,
422         int was_writing ));
423
424 LDAP_F( BerElement * )
425 ber_init LDAP_P((
426         struct berval *bv ));
427
428 LDAP_F( int )
429 ber_flatten LDAP_P((
430         BerElement *ber,
431         struct berval **bvPtr ));
432
433 /*
434  * LBER ber accessor functions
435  */
436
437 LDAP_F( int )
438 ber_get_option LDAP_P((
439         void *item,
440         int option,
441         void *outvalue));
442
443 LDAP_F( int )
444 ber_set_option LDAP_P((
445         void *item,
446         int option,
447         LDAP_CONST void *invalue));
448
449 /*
450  * LBER sockbuf.c
451  */
452
453 LDAP_F( Sockbuf * )
454 ber_sockbuf_alloc( void );
455
456 LDAP_F( Sockbuf *  )
457 ber_sockbuf_alloc_fd(
458         ber_socket_t fd );
459
460 LDAP_F( void )
461 ber_sockbuf_free(
462         Sockbuf *sb );
463
464 /*
465  * LBER memory.c
466  */
467 LDAP_F( void * )
468 ber_memalloc LDAP_P((
469         ber_len_t s ));
470
471 LDAP_F( void * )
472 ber_memrealloc LDAP_P((
473         void* p,
474         ber_len_t s ));
475
476 LDAP_F( void * )
477 ber_memcalloc LDAP_P((
478         ber_len_t n,
479         ber_len_t s ));
480
481 LDAP_F( void )
482 ber_memfree LDAP_P((
483         void* p ));
484
485 LDAP_F( void )
486 ber_memvfree LDAP_P((
487         void** vector ));
488
489 LDAP_F( void )
490 ber_bvfree LDAP_P((
491         struct berval *bv ));
492
493 LDAP_F( void )
494 ber_bvecfree LDAP_P((
495         struct berval **bv ));
496
497 LDAP_F( struct berval * )
498 ber_bvdup LDAP_P((
499         LDAP_CONST struct berval *bv ));
500
501 LDAP_F( char * )
502 ber_strdup LDAP_P((
503         LDAP_CONST char * ));
504
505 /*
506  * error.c
507  */
508 LDAP_F( int * ) ber_errno_addr LDAP_P((void));
509 #define ber_errno (*(ber_errno_addr)())
510
511 #define LBER_ERROR_NONE         0
512 #define LBER_ERROR_PARAM        0x1
513 #define LBER_ERROR_MEMORY       0x2
514
515 LDAP_END_DECL
516
517 #endif /* _LBER_H */