]> git.sur5r.net Git - openldap/blob - include/lber.h
mark lber_init_w_nullc as deprecated
[openldap] / include / lber.h
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2000 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 <lber_types.h>
27
28 LDAP_BEGIN_DECL
29
30 /* Overview of LBER tag construction
31  *
32  *      Bits
33  *      ______
34  *      8 7 | CLASS
35  *      0 0 = UNIVERSAL
36  *      0 1 = APPLICATION
37  *      1 0 = CONTEXT-SPECIFIC
38  *      1 1 = PRIVATE
39  *              _____
40  *              | 6 | DATA-TYPE
41  *                0 = PRIMITIVE
42  *                1 = CONSTRUCTED
43  *                      ___________
44  *                      | 5 ... 1 | TAG-NUMBER
45  */
46
47 /* BER classes and mask */
48 #define LBER_CLASS_UNIVERSAL    ((ber_tag_t) 0x00U)
49 #define LBER_CLASS_APPLICATION  ((ber_tag_t) 0x40U)
50 #define LBER_CLASS_CONTEXT              ((ber_tag_t) 0x80U)
51 #define LBER_CLASS_PRIVATE              ((ber_tag_t) 0xc0U)
52 #define LBER_CLASS_MASK                 ((ber_tag_t) 0xc0U)
53
54 /* BER encoding type and mask */
55 #define LBER_PRIMITIVE                  ((ber_tag_t) 0x00U)
56 #define LBER_CONSTRUCTED                ((ber_tag_t) 0x20U)
57 #define LBER_ENCODING_MASK              ((ber_tag_t) 0x20U)
58
59 #define LBER_BIG_TAG_MASK               ((ber_tag_t) 0x1fU)
60 #define LBER_MORE_TAG_MASK              ((ber_tag_t) 0x80U)
61
62 /*
63  * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
64  * as valid BER tags, and so it is safe to use them to report errors.  In
65  * fact, any tag for which the following is true is invalid:
66  */
67 #define LBER_INVALID(t)     (((t) & (ber_tag_t) 0x080UL) \
68         && (((t) & (ber_tag_t) ~ 0x0FF))
69
70 #define LBER_ERROR                      ((ber_tag_t) -1)
71 #define LBER_DEFAULT            ((ber_tag_t) -1)
72
73 /* general BER types we know about */
74 #define LBER_BOOLEAN            ((ber_tag_t) 0x01UL)
75 #define LBER_INTEGER            ((ber_tag_t) 0x02UL)
76 #define LBER_BITSTRING          ((ber_tag_t) 0x03UL)
77 #define LBER_OCTETSTRING        ((ber_tag_t) 0x04UL)
78 #define LBER_NULL                       ((ber_tag_t) 0x05UL)
79 #define LBER_ENUMERATED         ((ber_tag_t) 0x0aUL)
80 #define LBER_SEQUENCE           ((ber_tag_t) 0x30UL)    /* constructed */
81 #define LBER_SET                        ((ber_tag_t) 0x31UL)    /* constructed */
82
83 /* LBER BerElement options */
84 #define LBER_USE_DER            0x01
85 #define LBER_USE_INDEFINITE_LEN 0x02
86
87 /* get/set options for BerElement */
88 #define LBER_OPT_BER_OPTIONS                    0x01
89 #define LBER_OPT_BER_DEBUG                              0x02
90 #define LBER_OPT_BER_REMAINING_BYTES    0x03
91 #define LBER_OPT_BER_TOTAL_BYTES                0x04
92 #define LBER_OPT_BER_BYTES_TO_WRITE             0x05
93
94 #define LBER_OPT_DEBUG_LEVEL    LBER_OPT_BER_DEBUG
95 #define LBER_OPT_REMAINING_BYTES        LBER_OPT_BER_REMAINING_BYTES
96 #define LBER_OPT_TOTAL_BYTES            LBER_OPT_BER_TOTAL_BYTES
97 #define LBER_OPT_BYTES_TO_WRITE         LBER_OPT_BER_BYTES_TO_WRITE
98
99 #define LBER_OPT_LOG_PRINT_FN   0x8001
100 #define LBER_OPT_MEMORY_FNS             0x8002
101 #define LBER_OPT_ERROR_FN               0x8003
102 #define LBER_OPT_LOG_PRINT_FILE         0x8004
103
104 /* get/set Memory Debug options */
105 #define LBER_OPT_MEMORY_INUSE           0x8005  /* for memory debugging */
106
107 typedef int* (*BER_ERRNO_FN) LDAP_P(( void ));
108
109 typedef void (*BER_LOG_PRINT_FN) LDAP_P(( LDAP_CONST char *buf ));
110
111 typedef void* (*BER_MEMALLOC_FN)        LDAP_P(( ber_len_t size ));
112 typedef void* (*BER_MEMCALLOC_FN)       LDAP_P(( ber_len_t n, ber_len_t size ));
113 typedef void* (*BER_MEMREALLOC_FN)      LDAP_P(( void *p, ber_len_t size ));
114 typedef void  (*BER_MEMFREE_FN)         LDAP_P(( void *p ));
115
116 typedef struct lber_memory_fns {
117         BER_MEMALLOC_FN bmf_malloc;
118         BER_MEMCALLOC_FN bmf_calloc;
119         BER_MEMREALLOC_FN bmf_realloc;
120         BER_MEMFREE_FN bmf_free;
121 } BerMemoryFunctions;
122
123 /* LBER Sockbuf_IO options */ 
124 #define LBER_SB_OPT_GET_FD              1
125 #define LBER_SB_OPT_SET_FD              2
126 #define LBER_SB_OPT_HAS_IO              3
127 #define LBER_SB_OPT_SET_NONBLOCK        4
128 #define LBER_SB_OPT_GET_SSL             7
129 #define LBER_SB_OPT_DATA_READY          8
130 #define LBER_SB_OPT_SET_READAHEAD       9
131 #define LBER_SB_OPT_DRAIN               10
132 #define LBER_SB_OPT_NEEDS_READ          11
133 #define LBER_SB_OPT_NEEDS_WRITE         12
134 /* Largest option used by the library */
135 #define LBER_SB_OPT_OPT_MAX             12
136
137 /* LBER IO operations stacking levels */
138 #define LBER_SBIOD_LEVEL_PROVIDER       10
139 #define LBER_SBIOD_LEVEL_TRANSPORT      20
140 #define LBER_SBIOD_LEVEL_APPLICATION    30
141
142 /* get/set options for Sockbuf */
143 #define LBER_OPT_SOCKBUF_DESC           0x1000
144 #define LBER_OPT_SOCKBUF_OPTIONS        0x1001
145 #define LBER_OPT_SOCKBUF_DEBUG          0x1002
146
147 /* on/off values */
148 #define LBER_OPT_ON             ((void *) 1)
149 #define LBER_OPT_OFF    ((void *) 0)
150
151 #define LBER_OPT_SUCCESS        (0)
152 #define LBER_OPT_ERROR          (-1)
153
154 typedef struct berelement BerElement;
155 typedef struct sockbuf Sockbuf;
156 typedef struct seqorset Seqorset;
157
158 typedef struct sockbuf_io Sockbuf_IO;
159
160 /* Structure for LBER IO operarion descriptor */
161 typedef struct sockbuf_io_desc {
162         int                     sbiod_level;
163         Sockbuf                 *sbiod_sb;
164         Sockbuf_IO              *sbiod_io;
165         void                    *sbiod_pvt;
166         struct sockbuf_io_desc  *sbiod_next;
167 } Sockbuf_IO_Desc;
168
169 /* Structure for LBER IO operation functions */
170 struct sockbuf_io {
171         int (*sbi_setup)( Sockbuf_IO_Desc *sbiod, void *arg );
172         int (*sbi_remove)( Sockbuf_IO_Desc *sbiod );
173         int (*sbi_ctrl)( Sockbuf_IO_Desc *sbiod, int opt, void *arg);
174         
175         ber_slen_t (*sbi_read)( Sockbuf_IO_Desc *sbiod, void *buf,
176                 ber_len_t len );
177         ber_slen_t (*sbi_write)( Sockbuf_IO_Desc *sbiod, void *buf,
178                 ber_len_t len );
179         
180         int (*sbi_close)( Sockbuf_IO_Desc *sbiod );
181 };
182
183 /* Helper macros for LBER IO functions */
184 #define LBER_SBIOD_READ_NEXT( sbiod, buf, len ) \
185         ( (sbiod)->sbiod_next->sbiod_io->sbi_read( (sbiod)->sbiod_next, \
186                 buf, len ) )
187 #define LBER_SBIOD_WRITE_NEXT( sbiod, buf, len ) \
188         ( (sbiod)->sbiod_next->sbiod_io->sbi_write( (sbiod)->sbiod_next, \
189                 buf, len ) )
190 #define LBER_SBIOD_CTRL_NEXT( sbiod, opt, arg ) \
191         ( (sbiod)->sbiod_next ? \
192                 ( (sbiod)->sbiod_next->sbiod_io->sbi_ctrl( \
193                 (sbiod)->sbiod_next, opt, arg ) ) : 0 )
194
195 /* structure for returning a sequence of octet strings + length */
196 typedef struct berval {
197         ber_len_t       bv_len;
198         char            *bv_val;
199 } BerValue;
200
201 /* this should be moved to lber-int.h */
202
203 /*
204  * in bprint.c:
205  */
206 LBER_F( void )
207 ber_error_print LDAP_P((
208         LDAP_CONST char *data ));
209
210 LBER_F( void )
211 ber_bprint LDAP_P((
212         LDAP_CONST char *data, ber_len_t len ));
213
214 LBER_F( void )
215 ber_dump LDAP_P((
216         BerElement *ber, int inout ));
217
218 LBER_F( void )
219 ber_sos_dump LDAP_P((
220         Seqorset *sos ));
221
222
223 /*
224  * in decode.c:
225  */
226 typedef int (*BERDecodeCallback) LDAP_P((
227         BerElement *ber,
228         void *data,
229         int mode ));
230
231 LBER_F( ber_tag_t )
232 ber_get_tag LDAP_P((
233         BerElement *ber ));
234
235 LBER_F( ber_tag_t )
236 ber_skip_tag LDAP_P((
237         BerElement *ber,
238         ber_len_t *len ));
239
240 LBER_F( ber_tag_t )
241 ber_peek_tag LDAP_P((
242         BerElement *ber,
243         ber_len_t *len ));
244
245 LBER_F( ber_tag_t )
246 ber_get_int LDAP_P((
247         BerElement *ber,
248         ber_int_t *num ));
249
250 LBER_F( ber_tag_t )
251 ber_get_enum LDAP_P((
252         BerElement *ber,
253         ber_int_t *num ));
254
255 LBER_F( ber_tag_t )
256 ber_get_stringb LDAP_P((
257         BerElement *ber,
258         char *buf,
259         ber_len_t *len ));
260
261 LBER_F( ber_tag_t )
262 ber_get_stringa LDAP_P((
263         BerElement *ber,
264         char **buf ));
265
266 LBER_F( ber_tag_t )
267 ber_get_stringal LDAP_P((
268         BerElement *ber,
269         struct berval **bv ));
270
271 LBER_F( ber_tag_t )
272 ber_get_bitstringa LDAP_P((
273         BerElement *ber,
274         char **buf,
275         ber_len_t *len ));
276
277 LBER_F( ber_tag_t )
278 ber_get_null LDAP_P((
279         BerElement *ber ));
280
281 LBER_F( ber_tag_t )
282 ber_get_boolean LDAP_P((
283         BerElement *ber,
284         ber_int_t *boolval ));
285
286 LBER_F( ber_tag_t )
287 ber_first_element LDAP_P((
288         BerElement *ber,
289         ber_len_t *len,
290         char **last ));
291
292 LBER_F( ber_tag_t )
293 ber_next_element LDAP_P((
294         BerElement *ber,
295         ber_len_t *len,
296         LDAP_CONST char *last ));
297
298 LBER_F( ber_tag_t )
299 ber_scanf LDAP_P((                                                                
300         BerElement *ber,
301         LDAP_CONST char *fmt,
302         ... ));
303
304 /*
305  * in encode.c
306  */
307 typedef int (*BEREncodeCallback) LDAP_P((
308         BerElement *ber,
309         void *data ));
310
311 LBER_F( int )
312 ber_put_enum LDAP_P((
313         BerElement *ber,
314         ber_int_t num,
315         ber_tag_t tag ));
316
317 LBER_F( int )
318 ber_put_int LDAP_P((
319         BerElement *ber,
320         ber_int_t num,
321         ber_tag_t tag ));
322
323 LBER_F( int )
324 ber_put_ostring LDAP_P((
325         BerElement *ber,
326         LDAP_CONST char *str,
327         ber_len_t len,
328         ber_tag_t tag ));
329
330 LBER_F( int )
331 ber_put_berval LDAP_P((
332         BerElement *ber,
333         LDAP_CONST struct berval *bv,
334         ber_tag_t tag ));
335
336 LBER_F( int )
337 ber_put_string LDAP_P((
338         BerElement *ber,
339         LDAP_CONST char *str,
340         ber_tag_t tag ));
341
342 LBER_F( int )
343 ber_put_bitstring LDAP_P((
344         BerElement *ber,
345         LDAP_CONST char *str,
346         ber_len_t bitlen,
347         ber_tag_t tag ));
348
349 LBER_F( int )
350 ber_put_null LDAP_P((
351         BerElement *ber,
352         ber_tag_t tag ));
353
354 LBER_F( int )
355 ber_put_boolean LDAP_P((
356         BerElement *ber,
357         ber_int_t boolval,
358         ber_tag_t tag ));
359
360 LBER_F( int )
361 ber_start_seq LDAP_P((
362         BerElement *ber,
363         ber_tag_t tag ));
364
365 LBER_F( int )
366 ber_start_set LDAP_P((
367         BerElement *ber,
368         ber_tag_t tag ));
369
370 LBER_F( int )
371 ber_put_seq LDAP_P((
372         BerElement *ber ));
373
374 LBER_F( int )
375 ber_put_set LDAP_P((
376         BerElement *ber ));
377
378 LBER_F( int )
379 ber_printf LDAP_P((
380         BerElement *ber,
381         LDAP_CONST char *fmt,
382         ... ));
383
384
385 /*
386  * in io.c:
387  */
388
389 LBER_F( ber_slen_t )
390 ber_read LDAP_P((
391         BerElement *ber,
392         char *buf,
393         ber_len_t len ));
394
395 LBER_F( ber_slen_t )
396 ber_write LDAP_P((
397         BerElement *ber,
398         LDAP_CONST char *buf,
399         ber_len_t len,
400         int nosos ));
401
402 LBER_F( void )
403 ber_free LDAP_P((
404         BerElement *ber,
405         int freebuf ));
406
407 LBER_F( int )
408 ber_flush LDAP_P((
409         Sockbuf *sb,
410         BerElement *ber,
411         int freeit ));
412
413 LBER_F( BerElement * )
414 ber_alloc LDAP_P(( void )); /* DEPRECATED */
415
416 LBER_F( BerElement * )
417 der_alloc LDAP_P(( void )); /* DEPRECATED */
418
419 LBER_F( BerElement * )
420 ber_alloc_t LDAP_P((
421         int beroptions ));
422
423 LBER_F( BerElement * )
424 ber_dup LDAP_P((
425         BerElement *ber ));
426
427 LBER_F( ber_tag_t )
428 ber_get_next LDAP_P((
429         Sockbuf *sb,
430         ber_len_t *len,
431         BerElement *ber ));
432
433 LBER_F( void )
434 ber_init_w_nullc LDAP_P((       /* DEPRECATED */
435         BerElement *ber,
436         int options ));
437
438 LBER_F( void )
439 ber_reset LDAP_P((
440         BerElement *ber,
441         int was_writing ));
442
443 LBER_F( BerElement * )
444 ber_init LDAP_P((
445         struct berval *bv ));
446
447 LBER_F( int )
448 ber_flatten LDAP_P((
449         BerElement *ber,
450         struct berval **bvPtr ));
451
452 /*
453  * LBER ber accessor functions
454  */
455
456 LBER_F( int )
457 ber_get_option LDAP_P((
458         void *item,
459         int option,
460         void *outvalue));
461
462 LBER_F( int )
463 ber_set_option LDAP_P((
464         void *item,
465         int option,
466         LDAP_CONST void *invalue));
467
468 /*
469  * LBER sockbuf.c
470  */
471
472 LBER_F( Sockbuf *  )
473 ber_sockbuf_alloc LDAP_P((
474         void ));
475
476 LBER_F( void )
477 ber_sockbuf_free LDAP_P((
478         Sockbuf *sb ));
479
480 LBER_F( int )
481 ber_sockbuf_add_io LDAP_P((
482         Sockbuf *sb,
483         Sockbuf_IO *sbio,
484         int layer,
485         void *arg ));
486
487 LBER_F( int )
488 ber_sockbuf_remove_io LDAP_P((
489         Sockbuf *sb,
490         Sockbuf_IO *sbio,
491         int layer ));
492
493 LBER_F( int )
494 ber_sockbuf_ctrl LDAP_P((
495         Sockbuf *sb,
496         int opt,
497         void *arg ));
498
499 LBER_F( Sockbuf_IO ) ber_sockbuf_io_tcp;
500 LBER_F( Sockbuf_IO ) ber_sockbuf_io_readahead;
501 LBER_F( Sockbuf_IO ) ber_sockbuf_io_fd;
502 LBER_F( Sockbuf_IO ) ber_sockbuf_io_debug;
503
504 /*
505  * LBER memory.c
506  */
507 LBER_F( void * )
508 ber_memalloc LDAP_P((
509         ber_len_t s ));
510
511 LBER_F( void * )
512 ber_memrealloc LDAP_P((
513         void* p,
514         ber_len_t s ));
515
516 LBER_F( void * )
517 ber_memcalloc LDAP_P((
518         ber_len_t n,
519         ber_len_t s ));
520
521 LBER_F( void )
522 ber_memfree LDAP_P((
523         void* p ));
524
525 LBER_F( void )
526 ber_memvfree LDAP_P((
527         void** vector ));
528
529 LBER_F( void )
530 ber_bvfree LDAP_P((
531         struct berval *bv ));
532
533 LBER_F( void )
534 ber_bvecfree LDAP_P((
535         struct berval **bv ));
536
537 LBER_F( int )
538 ber_bvecadd LDAP_P((
539         struct berval ***bvec,
540         struct berval *bv ));
541
542 LBER_F( struct berval * )
543 ber_bvdup LDAP_P((
544         LDAP_CONST struct berval *bv ));
545
546 LBER_F( struct berval * )
547 ber_bvstr LDAP_P((
548         LDAP_CONST char * ));
549
550 LBER_F( struct berval * )
551 ber_bvstrdup LDAP_P((
552         LDAP_CONST char * ));
553
554 LBER_F( char * )
555 ber_strdup LDAP_P((
556         LDAP_CONST char * ));
557
558 /*
559  * error.c
560  */
561 LBER_F( int * ) ber_errno_addr LDAP_P((void));
562 #define ber_errno (*(ber_errno_addr)())
563
564 #define LBER_ERROR_NONE         0
565 #define LBER_ERROR_PARAM        0x1
566 #define LBER_ERROR_MEMORY       0x2
567
568 LDAP_END_DECL
569
570 #endif /* _LBER_H */