]> git.sur5r.net Git - openldap/blob - libraries/liblber/lber-int.h
d932791e5eac87e39260f1e76fcd49d3d160046c
[openldap] / libraries / liblber / lber-int.h
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /* Portions
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_INT_H
19 #define _LBER_INT_H
20
21 #include "lber.h"
22 #include "ldap_log.h"
23 #include "lber_pvt.h"
24
25 LDAP_BEGIN_DECL
26
27 extern BER_ERRNO_FN ber_int_errno_fn;
28
29 /* these have to match lber types settings */
30 #if LBER_INT_T == short
31 #       define LBER_INT_HTON(i) AC_HTONS(i)
32 #       define LBER_INT_NTOH(i) AC_NTOHS(i)
33 #else
34 #       define LBER_INT_HTON(i) AC_HTONL(i)
35 #       define LBER_INT_NTOH(i) AC_NTOHL(i)
36 #endif
37
38 #if LBER_LEN_T == short
39 #       define LBER_LEN_HTON(l) AC_HTONS(l)
40 #       define LBER_LEN_NTOH(l) AC_NTOHS(l)
41 #else
42 #       define LBER_LEN_HTON(l) AC_HTONL(l)
43 #       define LBER_LEN_NTOH(l) AC_NTOHL(l)
44 #endif
45
46 #if LBER_TAG_T == short
47 #       define LBER_TAG_HTON(t) AC_HTONS(t)
48 #       define LBER_TAG_NTOH(t) AC_NTOHS(t)
49 #else
50 #       define LBER_TAG_HTON(t) AC_HTONL(t)
51 #       define LBER_TAG_NTOH(t) AC_NTOHL(t)
52 #endif
53
54
55 struct lber_options {
56         short lbo_valid;
57 #define LBER_UNINITIALIZED              0x0
58 #define LBER_INITIALIZED                0x1
59 #define LBER_VALID_BERELEMENT   0x2
60 #define LBER_VALID_SOCKBUF              0x3
61
62         unsigned short lbo_options;
63         int lbo_debug;
64 };
65
66 extern struct lber_options ber_int_options;
67 #define ber_int_debug ber_int_options.lbo_debug
68
69 struct berelement {
70         struct          lber_options ber_opts;
71 #define ber_valid               ber_opts.lbo_valid
72 #define ber_options             ber_opts.lbo_options
73 #define ber_debug               ber_opts.lbo_debug
74
75         ber_tag_t       ber_usertag;
76
77         ber_tag_t       ber_tag;
78         ber_len_t       ber_len;
79
80         char            *ber_buf;
81         char            *ber_ptr;
82         char            *ber_end;
83
84         struct seqorset *ber_sos;
85         char            *ber_rwptr;
86         BERTranslateProc ber_encode_translate_proc;
87         BERTranslateProc ber_decode_translate_proc;
88 };
89 #define BER_VALID(ber)  ((ber)->ber_valid==LBER_VALID_BERELEMENT)
90
91
92 #define ber_pvt_ber_bytes(ber)          ((ber)->ber_ptr - (ber)->ber_buf)
93 #define ber_pvt_ber_remaining(ber)      ((ber)->ber_end - (ber)->ber_ptr)
94
95 struct sockbuf;
96
97 struct sockbuf_io {
98         int     (*sbi_setup)( struct sockbuf * sb, void *arg );
99         int     (*sbi_remove)( struct sockbuf *sb );
100         
101         ber_slen_t      (*sbi_read)( struct sockbuf *sb, void *buf, ber_len_t len );
102         ber_slen_t      (*sbi_write)( struct sockbuf *sb, void *buf, ber_len_t len );
103         int     (*sbi_close)( struct sockbuf *sb );
104 };
105
106 struct sockbuf_sec {
107         int     (*sbs_setup)( struct sockbuf * sb, void *arg );
108         int     (*sbs_remove)( struct sockbuf *sb );
109    
110         long    (*sbs_protect)( struct sockbuf *sb, char *in, long *ilen,
111                                 char *out, long olen );
112         long    (*sbs_release)( struct sockbuf *sb, char *in, long ilen,
113                                char *out0, long olen0, char *out1, long olen1 );
114 };
115
116 struct sockbuf_buf {
117         ber_len_t       buf_size;
118         ber_len_t       buf_ptr;
119         ber_len_t       buf_end;
120         char    *buf_base;
121 };
122
123 typedef struct sockbuf_io Sockbuf_IO;
124 typedef struct sockbuf_sec Sockbuf_Sec;
125 typedef struct sockbuf_buf Sockbuf_Buf;
126
127 LDAP_F( Sockbuf_IO ) ber_pvt_sb_io_tcp;
128 LDAP_F( Sockbuf_IO ) ber_pvt_sb_io_udp;
129
130
131 struct sockbuf {
132         struct lber_options sb_opts;
133 #define sb_valid                sb_opts.lbo_valid
134 #define sb_options              sb_opts.lbo_options
135 #define sb_debug                sb_opts.lbo_debug
136
137         int             sb_non_block:1; 
138         int             sb_read_ahead:1;
139    
140         int             sb_buf_ready:1;
141         int             sb_trans_ready:1;
142         int             sb_sec_ready:1;
143       
144         /* these bits indicate if the transport layer 
145          * needs to read or write 
146          */
147         int             sb_trans_needs_read:1;
148         int             sb_trans_needs_write:1;
149
150         int             sb_fd;
151    
152         void            *sb_iodata;     /* transport-layer data pointer */
153         Sockbuf_IO      *sb_io;         /* I/O functions */
154    
155 #ifdef LDAP_SASL
156         void            *sb_sdata;      /* security-layer data pointer */
157         Sockbuf_Sec     *sb_sec;
158 #endif  
159
160         ber_socket_t    sb_sd;
161
162 #ifdef DEADWOOD
163         long            sb_max_incoming;
164 #endif
165         Sockbuf_Buf     sb_buf;
166 #ifdef LDAP_SASL   
167         Sockbuf_Buf     sb_sec_buf_in;
168         Sockbuf_Buf     sb_sec_buf_out;
169         ber_len_t       sb_sec_prev_len;
170 #endif   
171 };
172 #define SOCKBUF_VALID(ber)      ((sb)->sb_valid==LBER_VALID_SOCKBUF)
173
174 /* these should be internal ie: ber_int_* */
175 #define ber_pvt_sb_get_desc( sb ) ((sb)->sb_sd)
176 #define ber_pvt_sb_set_desc( sb, val ) ((sb)->sb_sd =(val))
177
178 #define ber_pvt_sb_in_use( sb ) ((sb)->sb_sd != AC_SOCKET_INVALID)
179
180 #ifdef USE_SASL
181 #define ber_pvt_sb_data_ready( sb ) \
182 (((sb)->sb_buf_ready) || ((sb)->sb_trans_ready) || ((sb)->sb_sec_ready))
183 #else
184 #define ber_pvt_sb_data_ready( sb ) \
185 (((sb)->sb_buf_ready) || ((sb)->sb_trans_ready))
186 #endif
187 #define ber_pvt_sb_needs_read( sb ) \
188 ((sb)->sb_trans_needs_read)
189 #define ber_pvt_sb_needs_write( sb ) \
190 ((sb)->sb_trans_needs_write)
191
192 #define READBUFSIZ      8192
193
194 struct seqorset {
195         BerElement      *sos_ber;
196         ber_len_t       sos_clen;
197         ber_tag_t       sos_tag;
198         char            *sos_first;
199         char            *sos_ptr;
200         struct seqorset *sos_next;
201 };
202
203
204 /*
205  * bprint.c
206  */
207 #define ber_log_printf ber_pvt_log_printf
208
209 #ifdef __MINGW32__
210 #   undef LDAP_F_PRE
211 #   ifdef LIBLBER_DECL
212 #       define LDAP_F_PRE       extern __declspec(LIBLBER_DECL)
213 #   else
214 #       define LDAP_F_PRE       extern
215 #   endif
216 #endif
217
218 LDAP_F( int )
219 ber_log_bprint LDAP_P((
220         int errlvl,
221         int loglvl,
222         const char *data,
223         ber_len_t len ));
224
225 LDAP_F( int )
226 ber_log_dump LDAP_P((
227         int errlvl,
228         int loglvl,
229         BerElement *ber,
230         int inout ));
231
232 LDAP_F( int )
233 ber_log_sos_dump LDAP_P((
234         int errlvl,
235         int loglvl,
236         Seqorset *sos ));
237
238
239 /* memory.c */
240         /* simple macros to realloc for now */
241 extern BerMemoryFunctions*              ber_int_memory_fns;
242
243 #ifdef CSRIMALLOC
244 #define LBER_INT_MALLOC         malloc
245 #define LBER_INT_CALLOC         calloc
246 #define LBER_INT_REALLOC        realloc
247 #define LBER_INT_FREE           free
248 #define LBER_INT_VFREE          ber_memvfree
249 #define LBER_INT_STRDUP         strdup
250
251 #define LBER_MALLOC                     malloc
252 #define LBER_CALLOC                     calloc
253 #define LBER_REALLOC            realloc
254 #define LBER_FREE                       free
255 #define LBER_VFREE                      ber_memvfree
256 #define LBER_STRDUP                     strdup
257
258 #else
259 #define LBER_INT_MALLOC(s)              ber_memalloc((s))
260 #define LBER_INT_CALLOC(n,s)    ber_memcalloc((n),(s))
261 #define LBER_INT_REALLOC(p,s)   ber_memrealloc((p),(s))
262 #define LBER_INT_FREE(p)                ber_memfree((p))
263 #define LBER_INT_VFREE(v)               ber_memvfree((void**)(v))
264 #define LBER_INT_STRDUP(s)              ber_strdup((s))
265
266 #define LBER_MALLOC(s)          ber_memalloc((s))
267 #define LBER_CALLOC(n,s)        ber_memcalloc((n),(s))
268 #define LBER_REALLOC(p,s)       ber_memrealloc((p),(s))
269 #define LBER_FREE(p)            ber_memfree((p))        
270 #define LBER_VFREE(v)           ber_memvfree((void**)(v))
271 #define LBER_STRDUP(s)          ber_strdup((s))
272 #endif
273
274 /* sockbuf.c */
275
276 /* these should be ber_int*() functions */
277
278 LDAP_F( int )
279 ber_pvt_sb_init LDAP_P(( Sockbuf *sb ));
280
281 LDAP_F( int )
282 ber_pvt_sb_destroy LDAP_P(( Sockbuf *sb ));
283
284 #ifdef USE_SASL
285 LDAP_F( int )
286 ber_pvt_sb_set_sec LDAP_P(( Sockbuf *sb, Sockbuf_Sec *sec, void *arg ));
287
288 LDAP_F( int )
289 ber_pvt_sb_clear_sec LDAP_P(( Sockbuf *sb ));
290 #endif
291
292 LDAP_F( int )
293 ber_pvt_sb_set_io LDAP_P(( Sockbuf *sb, Sockbuf_IO *layer, void *arg ));
294
295 LDAP_F( int )
296 ber_pvt_sb_clear_io LDAP_P(( Sockbuf *sb ));
297
298 LDAP_F( int )
299 ber_pvt_sb_close LDAP_P((Sockbuf *sb ));
300
301 LDAP_F( int )
302 ber_pvt_sb_set_nonblock LDAP_P(( Sockbuf *sb, int nb ));
303
304 LDAP_F( int )
305 ber_pvt_sb_set_readahead LDAP_P(( Sockbuf *sb, int rh ));
306
307 LDAP_F( ber_slen_t )
308 ber_pvt_sb_read LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len ));
309
310 LDAP_F( ber_slen_t )
311 ber_pvt_sb_write LDAP_P(( Sockbuf *sb, void *buf, ber_len_t len ));
312
313 LDAP_F( int )
314 ber_pvt_sb_udp_set_dst LDAP_P((Sockbuf *sb, void *addr ));
315
316 LDAP_F( void * )
317 ber_pvt_sb_udp_get_src LDAP_P((Sockbuf *sb ));
318
319 LDAP_F( int )
320 ber_pvt_socket_set_nonblock LDAP_P(( ber_socket_t sd, int nb ));
321
322 #endif /* _LBER_INT_H */