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