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