1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright (c) 1990 Regents of the University of Michigan.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that this notice is preserved and that due credit is given
* to the University of Michigan at Ann Arbor. The name of the University
* may not be used to endorse or promote products derived from this
* software without specific prior written permission. This software
* is provided ``as is'' without express or implied warranty.
*/
#ifndef _LBER_H
#define _LBER_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(NEEDPROTOS) && defined(__STDC__)
#define NEEDPROTOS 1
#endif
/* BER classes and mask */
#define LBER_CLASS_UNIVERSAL 0x00
#define LBER_CLASS_APPLICATION 0x40
#define LBER_CLASS_CONTEXT 0x80
#define LBER_CLASS_PRIVATE 0xc0
#define LBER_CLASS_MASK 0xc0
/* BER encoding type and mask */
#define LBER_PRIMITIVE 0x00
#define LBER_CONSTRUCTED 0x20
#define LBER_ENCODING_MASK 0x20
#define LBER_BIG_TAG_MASK 0x1f
#define LBER_MORE_TAG_MASK 0x80
/*
* Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
* as valid BER tags, and so it is safe to use them to report errors. In
* fact, any tag for which the following is true is invalid:
* (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 )
*/
#define LBER_ERROR 0xffffffff
#define LBER_DEFAULT 0xffffffff
/* general BER types we know about */
#define LBER_BOOLEAN 0x01
#define LBER_INTEGER 0x02
#define LBER_BITSTRING 0x03
#define LBER_OCTETSTRING 0x04
#define LBER_NULL 0x05
#define LBER_ENUMERATED 0x0a
#define LBER_SEQUENCE 0x30 /* constructed */
#define LBER_SET 0x31 /* constructed */
#define OLD_LBER_SEQUENCE 0x10 /* w/o constructed bit - broken */
#define OLD_LBER_SET 0x11 /* w/o constructed bit - broken */
#ifdef NEEDPROTOS
typedef int (*BERTranslateProc)(char **bufp, unsigned int *buflenp,
int free_input);
#else /* NEEDPROTOS */
typedef int (*BERTranslateProc)();
#endif /* NEEDPROTOS */
typedef struct berelement BerElement; /* Opaque BerElement structure */
#define NULLBER ((BerElement *) 0)
#ifdef LDAP_SSL
#include <security/ssl.h>
#endif /* LDAP_SSL */
/*
* Structure Sockbuf which used to be defined in this header file, is
* removed since the c-api draft does not define the structure and it
* is only used internal to the library
*/
typedef struct seqorset {
BerElement *sos_ber;
unsigned int sos_clen;
unsigned int sos_tag;
char *sos_first;
char *sos_ptr;
struct seqorset *sos_next;
} Seqorset;
#define NULLSEQORSET ((Seqorset *) 0)
typedef unsigned int ber_len_t; /* for BER len */
typedef unsigned int ber_tag_t; /* for BER tags */
typedef int ber_int_t; /* for BER ints, enums, and Booleans */
typedef unsigned int ber_uint_t; /* unsigned equivalent of ber_int_t */
typedef int ber_slen_t; /* signed equivalent of ber_len_t */
/* structure for returning a sequence of octet strings + length */
typedef struct berval {
ber_len_t bv_len;
char *bv_val;
} BerValue;
#ifndef NEEDPROTOS
extern BerElement *ber_alloc();
extern BerElement *der_alloc();
extern BerElement *ber_alloc_t();
extern BerElement *ber_dup();
extern BerElement *ber_init();
extern int lber_debug;
extern void ber_bvfree();
extern void ber_bvecfree();
extern struct berval *ber_bvdup();
extern void ber_dump();
extern void ber_sos_dump();
extern void lber_bprint();
extern void ber_reset();
extern void ber_zero_init();
#else /* NEEDPROTOS */
/*
* in bprint.c:
*/
void lber_bprint(char *data, int len);
/*
* in decode.c:
*/
ber_tag_t ber_get_tag(BerElement *ber);
ber_tag_t ber_skip_tag(BerElement *ber, ber_len_t *len);
ber_tag_t ber_peek_tag(BerElement *ber, ber_len_t *len);
unsigned int ber_get_int(BerElement *ber, int *num);
unsigned int ber_get_stringb(BerElement *ber, char *buf,
ber_len_t *len);
unsigned int ber_get_stringa(BerElement *ber, char **buf);
unsigned int ber_get_stringal(BerElement *ber, struct berval **bv);
unsigned int ber_get_bitstringa(BerElement *ber, char **buf,
ber_len_t *len);
unsigned int ber_get_null(BerElement *ber);
unsigned int ber_get_boolean(BerElement *ber, int *boolval);
ber_tag_t ber_first_element(BerElement *ber, ber_len_t *len,
char **last);
ber_tag_t ber_next_element(BerElement *ber, ber_len_t *len,
char *last);
#if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun)
ber_tag_t ber_scanf(BerElement *ber, char *fmt, ...);
#else
ber_tag_t ber_scanf();
#endif
void ber_bvfree(struct berval *bv);
void ber_bvecfree(struct berval **bv);
struct berval *ber_bvdup(struct berval *bv);
#ifdef STR_TRANSLATION
void ber_set_string_translators(BerElement *ber,
BERTranslateProc encode_proc, BERTranslateProc decode_proc);
#endif /* STR_TRANSLATION */
int ber_flatten(BerElement *ber, struct berval **bvPtr);
/*
* in encode.c
*/
int ber_put_enum(BerElement *ber, int num, ber_tag_t tag);
int ber_put_int(BerElement *ber, int num, ber_tag_t tag);
int ber_put_ostring(BerElement *ber, char *str, ber_len_t len, ber_tag_t tag);
int ber_put_string(BerElement *ber, char *str, ber_tag_t tag);
int ber_put_bitstring(BerElement *ber, char *str,
unsigned int bitlen, ber_tag_t tag);
int ber_put_null(BerElement *ber, ber_tag_t tag);
int ber_put_boolean(BerElement *ber, int boolval, ber_tag_t tag);
int ber_start_seq(BerElement *ber, ber_tag_t tag);
int ber_start_set(BerElement *ber, ber_tag_t tag);
int ber_put_seq(BerElement *ber);
int ber_put_set(BerElement *ber);
#if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun)
int ber_printf(BerElement *ber, char *fmt, ...);
#else
int ber_printf();
#endif
/*
* in io.c:
*
* ber_flush() and ber_get_next() functions are obsolete and removed
* from this library/header file
*/
int ber_read(BerElement *ber, char *buf, ber_len_t len);
int ber_write(BerElement *ber, char *buf, ber_len_t len, int nosos);
void ber_free(BerElement *ber, int freebuf);
BerElement *ber_alloc(void);
BerElement *der_alloc(void);
BerElement *ber_alloc_t(int options);
BerElement *ber_dup(BerElement *ber);
BerElement *ber_init(struct berval *bv);
void ber_dump(BerElement *ber, int inout);
void ber_sos_dump(Seqorset *sos);
void ber_zero_init(BerElement *ber, int options);
void ber_reset(BerElement *ber, int was_writing);
#ifdef NEEDGETOPT
/*
* in getopt.c
*/
int getopt(int nargc, char **nargv, char *ostr);
#endif /* NEEDGETOPT */
#endif /* NEEDPROTOS */
#define LBER_HTONL(l) htonl(l)
#define LBER_NTOHL(l) ntohl(l)
/*
* SAFEMEMCPY is an overlap-safe copy from s to d of n bytes
*/
#ifdef sunos4
#define SAFEMEMCPY(d, s, n) bcopy(s, d, n)
#else /* sunos4 */
#define SAFEMEMCPY(d, s, n) memmove(d, s, n)
#endif /* sunos4 */
#ifdef SUN
/* I18N support */
#include <locale.h>
#include <nl_types.h>
extern nl_catd slapdcat; /* for I18N support */
extern void i18n_catopen(char *);
#endif
#ifdef __cplusplus
}
#endif
#endif /* _LBER_H */
|